diff --git a/.gitignore b/.gitignore index 05d37955ec..ecfc5de625 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -build +/build/ debug debug.test internal/constants/generated.go diff --git a/changelog.md b/changelog.md index 77039b91a8..689297cb8a 100644 --- a/changelog.md +++ b/changelog.md @@ -8,6 +8,11 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## 0.28.0 +### Changed + +- New runtimes are installed in parallel and 2-4 times faster. + ([PR #1275](https://github.com/ActiveState/cli/pull/1275)) + ### Fixed - `state push` updates project name in activestate.yaml. diff --git a/go.mod b/go.mod index 4b5c717880..9ed1037225 100644 --- a/go.mod +++ b/go.mod @@ -22,9 +22,11 @@ require ( github.com/dave/jennifer v0.18.0 github.com/denisbrodbeck/machineid v0.8.0 github.com/dsnet/compress v0.0.0-20171208185109-cc9eb1d7ad76 // indirect + github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3 github.com/fatih/color v1.7.0 github.com/felixge/fgprof v0.9.0 github.com/fsnotify/fsnotify v1.4.7 + github.com/gammazero/workerpool v1.1.1 github.com/getlantern/systray v1.1.0 github.com/go-ini/ini v1.32.0 // indirect github.com/go-ole/go-ole v1.2.4 @@ -60,7 +62,7 @@ require ( github.com/mailru/easyjson v0.0.0-20180323154445-8b799c424f57 // indirect github.com/mash/go-tempfile-suffix v0.0.0-20150731093933-48f0f8a3a5ab github.com/matryer/is v1.2.0 // indirect - github.com/mattn/go-runewidth v0.0.4 + github.com/mattn/go-runewidth v0.0.10 github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect github.com/mitchellh/go-wordwrap v1.0.0 github.com/nicksnyder/go-i18n v1.10.0 @@ -79,14 +81,14 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/objx v0.3.0 // indirect github.com/stretchr/testify v1.6.2-0.20201103103935-92707c0b2d50 - github.com/thoas/go-funk v0.0.0-20170604141201-14304e8530de + github.com/thoas/go-funk v0.8.0 github.com/ulikunitz/xz v0.5.4 // indirect - github.com/vbauerster/mpb/v4 v4.10.0 + github.com/vbauerster/mpb/v6 v6.0.2 github.com/vektah/gqlparser/v2 v2.1.0 github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a golang.org/x/net v0.0.0-20201021035429-f5854403a974 - golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3 + golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 golang.org/x/text v0.3.3 google.golang.org/genproto v0.0.0-20200815001618-f69a88009b70 google.golang.org/grpc v1.36.0 // indirect diff --git a/go.sum b/go.sum index 7cd2f6ee4b..6459ff8259 100644 --- a/go.sum +++ b/go.sum @@ -69,6 +69,8 @@ github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUW github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= +github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/agnivade/levenshtein v1.0.3 h1:M5ZnqLOoZR8ygVq0FfkXsNOKzMCk0xRiow0R5+5VkQ0= github.com/agnivade/levenshtein v1.0.3/go.mod h1:4SFRZbbXWLF4MU1T9Qg0pGgH3Pjs+t6ie5efyrwRJXs= @@ -140,6 +142,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3 h1:baVdMKlASEHrj19iqjARrPbaRisD7EuZEVJj6ZMLl1Q= +github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3/go.mod h1:VEPNJUlxl5KdWjDvz6Q1l+rJlxF2i6xqDeGuGAxa87M= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/fgprof v0.9.0 h1:1Unx04fyC3gn3RMH/GuwUF1UdlulLMpJV13jr9SOHvs= @@ -148,6 +152,10 @@ github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjr github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gammazero/deque v0.0.0-20200721202602-07291166fe33 h1:UG4wNrJX9xSKnm/Gck5yTbxnOhpNleuE4MQRdmcGySo= +github.com/gammazero/deque v0.0.0-20200721202602-07291166fe33/go.mod h1:D90+MBHVc9Sk1lJAbEVgws0eYEurY4mv2TDso3Nxh3w= +github.com/gammazero/workerpool v1.1.1 h1:MN29GcZtZZAgzTU+Zk54Y+J9XkE54MoXON/NCZvNulo= +github.com/gammazero/workerpool v1.1.1/go.mod h1:5BN0IJVRjSFAypo9QTJCaWdijjNz9Jjl6VFS1PRjCeg= github.com/gdamore/encoding v0.0.0-20151215212835-b23993cbb635/go.mod h1:yrQYJKKDTrHmbYxI7CYi+/hbdiDT2m4Hj+t0ikCjsrQ= github.com/gdamore/tcell v1.0.1-0.20180608172421-b3cebc399d6f/go.mod h1:tqyG50u7+Ctv1w5VX67kLzKcj9YXR/JSBZQq/+mLl1A= github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4= @@ -371,8 +379,8 @@ github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2y github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -431,6 +439,9 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rollbar/rollbar-go v1.1.0 h1:3ysiHp3ep8W50ykgBMCKXJGaK2Jdivru7SW9EYfAo+M= @@ -484,8 +495,8 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.6.2-0.20201103103935-92707c0b2d50 h1:aQdElrdadJZjGar4PipPBSpVh3yyDIuDSaM5PbMn6o8= github.com/stretchr/testify v1.6.2-0.20201103103935-92707c0b2d50/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/thoas/go-funk v0.0.0-20170604141201-14304e8530de h1:e96987R6uGe5Rr9oAjSwm27e6tRObx8wON4uJUhK6Uk= -github.com/thoas/go-funk v0.0.0-20170604141201-14304e8530de/go.mod h1:mlR+dHGb+4YgXkf13rkQTuzrneeHANxOm6+ZnEV9HsA= +github.com/thoas/go-funk v0.8.0 h1:JP9tKSvnpFVclYgDM0Is7FD9M4fhPvqA0s0BsXmzSRQ= +github.com/thoas/go-funk v0.8.0/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ulikunitz/xz v0.5.4 h1:zATC2OoZ8H1TZll3FpbX+ikwmadbO699PE06cIkm9oU= github.com/ulikunitz/xz v0.5.4/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= @@ -495,8 +506,8 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/vbauerster/mpb/v4 v4.10.0 h1:u+Yud9Slhetz5F3Ysoso5hUguWjvfrtxVX3Xdxx9N+o= -github.com/vbauerster/mpb/v4 v4.10.0/go.mod h1:fRf6o5qdKuPqMX+2Pk99O/XSnyXDKScHzEkW72E6Sio= +github.com/vbauerster/mpb/v6 v6.0.2 h1:DWFnBOcgHi9GUNduC1MbQ936Z7B77wvOnZexP9Hjzcw= +github.com/vbauerster/mpb/v6 v6.0.2/go.mod h1:JDNVbdx4oAMMxZNXodDH2DeDY5xBJC8bDGHNFZwRqQM= github.com/vektah/dataloaden v0.2.1-0.20190515034641-a19b9a6e7c9e/go.mod h1:/HUdMve7rvxZma+2ZELQeNh88+003LL7Pf/CZ089j8U= github.com/vektah/gqlparser/v2 v2.1.0 h1:uiKJ+T5HMGGQM2kRKQ8Pxw8+Zq9qhhZhz/lieYvCMns= github.com/vektah/gqlparser/v2 v2.1.0/go.mod h1:SyUiHgLATUR8BiYURfTirrTcGpcE+4XkV2se04Px1Ms= @@ -525,7 +536,6 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200427165652-729f1e841bcc/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -626,7 +636,6 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190927073244-c990c680b611/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -650,8 +659,9 @@ golang.org/x/sys v0.0.0-20200821140526-fda516888d29/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3 h1:kzM6+9dur93BcC2kVlYl34cHU+TYZLanmpSJHVMmL64= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 h1:nVuTkr9L6Bq62qpUqKo/RnZCFfzDBL0bYo6w9OJUqZY= +golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/internal/analytics/analytics.go b/internal/analytics/analytics.go index 357641373e..331b8f4ebe 100644 --- a/internal/analytics/analytics.go +++ b/internal/analytics/analytics.go @@ -32,6 +32,33 @@ const CatRunCmd = "run-command" // CatBuild is the event category used for headchef builds const CatBuild = "build" +// CatRuntime is the event category used for all runtime setup and usage +const CatRuntime = "runtime" + +// ActRuntimeStart is the event action sent when creating a runtime +const ActRuntimeStart = "start" + +// ActRuntimeCache is the event action sent when a runtime is constructed from the local cache alone +const ActRuntimeCache = "cache" + +// ActRuntimeBuild is the event action sent when starting a remote build for the project +const ActRuntimeBuild = "build" + +// ActRuntimeDownload is the event action sent before starting the download of artifacts for a runtime +const ActRuntimeDownload = "download" + +// ActRuntimeSuccess is the event action sent when a runtime's environment has been successfully computed (for the first time) +const ActRuntimeSuccess = "success" + +// ActRuntimeFailure is the event action sent when a failure occurred anytime during a runtime operation +const ActRuntimeFailure = "failure" + +// LblRtFailUpdate is the label sent with an ActRuntimeFailure event if an error occurred during a runtime update +const LblRtFailUpdate = "update" + +// LblRtFailEnv is the label sent with an ActRuntimeFailure event if an error occurred during the resolution of the runtime environment +const LblRtFailEnv = "env" + // CatPpmConversion is the event category used for ppm-conversion events const CatPpmConversion = "ppm-conversion" diff --git a/internal/constants/constants.go b/internal/constants/constants.go index eee3d30bae..17576d33ea 100644 --- a/internal/constants/constants.go +++ b/internal/constants/constants.go @@ -96,6 +96,9 @@ const ArtifactArchiveName = "artifact.tar.gz" // ArtifactCacheFileName is the standardized name of an artifact cache file const ArtifactCacheFileName = "artifact_cache.json" +// ArtifactMetaDir is the directory in which we store meta information about artifacts +const ArtifactMetaDir = "artifacts" + // DefaultNamespaceDomain is the domain used when no namespace is given and one has to be constructed const DefaultNamespaceDomain = "github.com" @@ -204,21 +207,26 @@ const ActivePythonDistsDir = "python" const RuntimeInstallDirs = "INSTALLDIR,perl" // RuntimeMetaFile is the json file that holds meta information about our runtime -const RuntimeMetaFile = "support/metadata.json" +const RuntimeMetaFile = "metadata.json" // RuntimeDefinitionFilename is the filename for runtime meta data bundled with artifacts, if they are built by the alternative builder const RuntimeDefinitionFilename = "runtime.json" // LocalRuntimeEnvironmentDirectory is the directory (relative to the installation of a runtime build) where runtime definition files are stored -const LocalRuntimeEnvironmentDirectory = "_runtime_env" +const LocalRuntimeEnvironmentDirectory = "_runtime_store" + +// LocalRuntimeTempDirectory is the directory (relative to the installation of a runtime build) where temp files are stored +const LocalRuntimeTempDirectory = "_runtime_temp" // RuntimeInstallationCompleteMarker is created after all artifacts have been installed // Check for existence of this file to ensure that the installation has not been interrupted prematurely. -const RuntimeInstallationCompleteMarker = "support/completed" +const RuntimeInstallationCompleteMarker = "completed" -// RuntimeBuildEngineStore is created after all artifacts have been installed -// Check for existence of this file to ensure that the installation has not been interrupted prematurely. -const RuntimeBuildEngineStore = "support/build_engine" +// RuntimeBuildEngineStore contains the name of the build engine that was used to create this runtime +const RuntimeBuildEngineStore = "build_engine" + +// RuntimeRecipeStore contains a serialization of the recipe used to create this build +const RuntimeRecipeStore = "recipe" // StateToolMarketingPage links to the marketing page for the state tool const StateToolMarketingPage = "https://www.activestate.com/products/platform/state-tool/" diff --git a/internal/download/get.go b/internal/download/get.go index f19bf75976..bb6f1af0c7 100644 --- a/internal/download/get.go +++ b/internal/download/get.go @@ -14,15 +14,20 @@ import ( "github.com/ActiveState/cli/internal/errs" "github.com/ActiveState/cli/internal/locale" "github.com/ActiveState/cli/internal/logging" - "github.com/ActiveState/cli/internal/progress" "github.com/ActiveState/cli/internal/retryhttp" + "github.com/ActiveState/cli/internal/proxyreader" ) // Get takes a URL and returns the contents as bytes var Get func(url string) ([]byte, error) +type DownloadProgress interface { + TotalSize(int) + IncrBy(int) +} + // GetWithProgress takes a URL and returns the contents as bytes, it takes an optional second arg which will spawn a progressbar -var GetWithProgress func(url string, progress *progress.Progress) ([]byte, error) +var GetWithProgress func(url string, progress DownloadProgress) ([]byte, error) func init() { SetMocking(condition.InTest()) @@ -44,11 +49,11 @@ func httpGet(url string) ([]byte, error) { return httpGetWithProgress(url, nil) } -func httpGetWithProgress(url string, progress *progress.Progress) ([]byte, error) { +func httpGetWithProgress(url string, progress DownloadProgress) ([]byte, error) { return httpGetWithProgressRetry(url, progress, 1, 3) } -func httpGetWithProgressRetry(url string, progress *progress.Progress, attempt int, retries int) ([]byte, error) { +func httpGetWithProgressRetry(url string, prg DownloadProgress, attempt int, retries int) ([]byte, error) { logging.Debug("Retrieving url: %s, attempt: %d", url, attempt) client := retryhttp.NewClient(0 /* 0 = no timeout */, retries) resp, err := client.Get(url) @@ -77,38 +82,28 @@ func httpGetWithProgressRetry(url string, progress *progress.Progress, attempt i } } - bar := progress.AddByteProgressBar(int64(total)) + var src io.Reader = resp.Body + defer resp.Body.Close() - // Ensure bar is always closed (especially for retries) - defer func() { - if !bar.Completed() { - bar.Abort(true) - } - }() + if prg != nil { + prg.TotalSize(total) + src = proxyreader.NewProxyReader(prg, resp.Body) + } - src := resp.Body var dst bytes.Buffer - - src = bar.ProxyReader(resp.Body) - _, err = io.Copy(&dst, src) if err != nil { logging.Debug("Reading body failed: %s", err) if attempt <= retries { - return httpGetWithProgressRetry(url, progress, attempt+1, retries) + return httpGetWithProgressRetry(url, prg, attempt+1, retries) } return nil, errs.Wrap(err, "Could not copy network stream") } - if !bar.Completed() { - // Failsafe, so we don't get blocked by a progressbar - bar.IncrBy(total) - } - return dst.Bytes(), nil } -func _testHTTPGetWithProgress(url string, progress *progress.Progress) ([]byte, error) { +func _testHTTPGetWithProgress(url string, progress DownloadProgress) ([]byte, error) { return _testHTTPGet(url) } diff --git a/internal/download/manager.go b/internal/download/manager.go deleted file mode 100644 index e59da4414f..0000000000 --- a/internal/download/manager.go +++ /dev/null @@ -1,90 +0,0 @@ -package download - -import ( - "io/ioutil" - "path/filepath" - - "github.com/ActiveState/cli/internal/errs" - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/logging" - "github.com/ActiveState/cli/internal/progress" -) - -// Manager is our main download manager, it takes care of processing the downloads and communicating progress -type Manager struct { - WorkerCount int - error error - entries []*Entry - progress *progress.Progress -} - -// Entry is an item to be downloaded, and a path for where it should be downloaded, Data is optional and not used in this package -type Entry struct { - Path string - Download string - Data interface{} -} - -// Download will start the download progress and blocks until the progress completes -func (m *Manager) Download() error { - jobs := make(chan *Entry, len(m.entries)) - done := make(chan bool, m.WorkerCount) - - bar := m.progress.AddTotalBar(locale.T("downloading"), len(m.entries)) - - for w := 1; w <= m.WorkerCount; w++ { - // we can't know ahead of time how many jobs each worker will take, so approximate it - go func(jobs <-chan *Entry, bar *progress.TotalBar) { - for entry := range jobs { - m.Job(entry) - if bar != nil { - bar.Increment() - } - } - done <- true - }(jobs, bar) - } - for _, entry := range m.entries { - jobs <- entry - } - close(jobs) - - for w := 1; w <= m.WorkerCount; w++ { - <-done - } - - return m.error -} - -// Job runs an individual download job -func (m *Manager) Job(entry *Entry) { - if m.error != nil { - return - } - - bytes, err := GetWithProgress(entry.Download, m.progress) - - if err != nil { - m.error = err - logging.Debug("Failure occured: %v", err) - return - } - - dirname := filepath.Dir(entry.Path) - m.error = fileutils.MkdirUnlessExists(dirname) - if m.error != nil { - return - } - - err = ioutil.WriteFile(entry.Path, bytes, 0666) - if err != nil { - m.error = errs.Wrap(err, "WriteFile %s failed", entry.Path) - } -} - -// New creates a new Manager -func New(entries []*Entry, workerCount int, progress *progress.Progress) *Manager { - m := &Manager{WorkerCount: workerCount, entries: entries, progress: progress} - return m -} diff --git a/internal/download/manager_test.go b/internal/download/manager_test.go deleted file mode 100644 index 11bf7fef65..0000000000 --- a/internal/download/manager_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package download - -import ( - "os" - "path/filepath" - "strconv" - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/ActiveState/cli/internal/progress" -) - -func TestDownload(t *testing.T) { - - p := progress.New(progress.WithOutput(nil)) - defer p.Close() - - var entries []*Entry - for i := 1; i <= 3; i++ { - target := filepath.Join(os.TempDir(), "state-test-download", "file"+strconv.Itoa(i)) - os.Remove(target) - defer os.Remove(target) - entries = append(entries, &Entry{ - Path: target, - Download: filepath.Join("download", "file"+strconv.Itoa(i)), - }) - } - - manager := New(entries, 5, p) - err := manager.Download() - assert.NoError(t, err, "Should download files") - - for i := 1; i <= 3; i++ { - assert.FileExists(t, filepath.Join(os.TempDir(), "state-test-download", "file"+strconv.Itoa(i)), "Should have created the target file") - } -} diff --git a/internal/fileutils/fileutils.go b/internal/fileutils/fileutils.go index b3704bea89..3480cde0c7 100644 --- a/internal/fileutils/fileutils.go +++ b/internal/fileutils/fileutils.go @@ -497,7 +497,6 @@ func MoveAllFilesRecursively(fromPath, toPath string, cb MoveAllFilesCallback) e return errs.Wrap(err, "os.Remove %s failed", subFromPath) } } else { - logging.Warning(locale.Tr("warn_move_destination_overwritten", "", subFromPath)) err = os.Rename(subFromPath, subToPath) if err != nil { return errs.Wrap(err, "os.Rename %s:%s failed", subFromPath, subToPath) diff --git a/internal/fileutils/fileutils_test.go b/internal/fileutils/fileutils_test.go index 5cf432f7d4..38a64ef113 100644 --- a/internal/fileutils/fileutils_test.go +++ b/internal/fileutils/fileutils_test.go @@ -15,7 +15,7 @@ import ( "github.com/stretchr/testify/require" "github.com/ActiveState/cli/internal/environment" - "github.com/ActiveState/cli/internal/progress/mock" + "github.com/ActiveState/cli/internal/runbits/mock" ) // Copies the file associated with the given filename to a temp dir and returns diff --git a/internal/globaldefault/default.go b/internal/globaldefault/default.go index 661ad1ad77..2ede1db34d 100644 --- a/internal/globaldefault/default.go +++ b/internal/globaldefault/default.go @@ -128,12 +128,7 @@ func SetupDefaultActivation(subshell subshell.SubShell, cfg DefaultConfigurer, r return locale.WrapError(err, "err_globaldefault_prepare", "Could not prepare environment.") } - env, err := runtime.Env() - if err != nil { - return errs.Wrap(err, "Could not get runtime env") - } - - envMap, err := env.GetEnv(false, "") + envMap, err := runtime.Environ(false, projectPath) if err != nil { return errs.Wrap(err, "Could not get env") } diff --git a/internal/progress/_demo/main.go b/internal/progress/_demo/main.go deleted file mode 100644 index 558b09cf7d..0000000000 --- a/internal/progress/_demo/main.go +++ /dev/null @@ -1,140 +0,0 @@ -/* -Package main demonstrates the progress bar display of the artifacts -download and its installation without downloading any actual artifacts. - -This script expects the existence of an actual tarball called "test.tar.gz" -in the current directory. My suggestion is to run - -```sh -git archive --format=tar a92df9400e4f6 | gzip -c > test.tar.gz -``` - -to generate a reasonably sized tar ball. - -In the development we considered three different modes on how to compute the installation -progress bar. - -- "simulated" creates a spinner, that reports the number of bytes unpacked -- "exact" counts the number of bytes that will be written to disk prior to decompressing the archive. -- "heuristic" updates the progress bar based on the number of bytes read, and sets the bar to complete with the last byte written. - -The winner: - -The "heuristic" approach does not introduce extra latency as the "exact" one, it -accurately displays a fairly linearly progressing bar. -*/ -package main - -import ( - "fmt" - "io/ioutil" - "os" - "time" - - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/logging" - "github.com/ActiveState/cli/internal/progress" - "github.com/ActiveState/cli/internal/unarchiver" -) - -type devZero struct { -} - -func (dz *devZero) Read(b []byte) (int, error) { - return len(b), nil -} - -func (dz *devZero) Close() error { - return nil -} - -const tgzTestPath string = "test.tar.gz" - -func tarGzDownloadBarHeuristic(p *progress.Progress) (err error) { - - tgz := unarchiver.NewTarGz() - - dir, err := ioutil.TempDir("", "unpack") - if err != nil { - return err - } - defer os.RemoveAll(dir) - - aFile, aSize, err := tgz.PrepareUnpacking(tgzTestPath, dir) - if err != nil { - return err - } - - ub := p.AddUnpackBar(aSize, 70) - aStream := progress.NewReaderProxy(ub.Bar(), ub, aFile) - err = tgz.Unarchive(aStream, aSize, dir) - if err != nil { - fmt.Fprintf(os.Stderr, "Error unarchiving %v\n", err) - } - ub.Complete() - - time.Sleep(100 * time.Millisecond) - - ub.ReScale(4) - time.Sleep(1 * time.Second) - ub.Increment() - time.Sleep(1 * time.Second) - ub.Increment() - time.Sleep(1 * time.Second) - ub.Increment() - time.Sleep(1 * time.Second) - ub.Increment() - - return nil -} - -func main() { - logging.CurrentHandler().SetVerbose(false) - logging.SetMinimalLevel(logging.DEBUG) - logging.SetOutput(os.Stderr) - logging.Debug("test\n") - err := run() - if err != nil { - fmt.Printf("%s failed with error: %s\n", os.Args[0], err) - os.Exit(1) - } -} - -func progressRun() (err error) { - - if !fileutils.FileExists(tgzTestPath) { - return fmt.Errorf("Expected a tarball called 'test.tar.gz' in directory") - } - - p := progress.New( /* progress.WithOutput(nil) */ ) - defer p.Close() - - totalBar1 := p.AddTotalBar("downloading", 1) - downloadBar := p.AddByteProgressBar(100) - - dz1 := downloadBar.ProxyReader(&devZero{}) - var pos int - for pos != 100 { - b := make([]byte, 10) - off, _ := dz1.Read(b) - time.Sleep(200 * time.Millisecond) - pos += off - } - - totalBar1.Increment() - - totalBar2 := p.AddTotalBar("installing", 1) - - err = tarGzDownloadBarHeuristic(p) - if err != nil { - return err - } - - totalBar2.Increment() - return nil -} - -func run() error { - err := progressRun() - return err -} diff --git a/internal/progress/mock/mock.go b/internal/progress/mock/mock.go deleted file mode 100644 index 5e90a9874a..0000000000 --- a/internal/progress/mock/mock.go +++ /dev/null @@ -1,77 +0,0 @@ -package mock - -import ( - "testing" - "time" - - "github.com/stretchr/testify/assert" - - "github.com/ActiveState/cli/internal/progress" -) - -var _ progress.Incrementer = &Incrementer{} - -// TestProgress is wrapper around a Progress that can be used in test to ensure that the progress bar -// loop terminates after a configurable time-out. -// This construct has been added, due to numerous problems with hanging progress bar loops. -type TestProgress struct { - *progress.Progress -} - -// NewTestProgress returns a new testable progress-bar for unit tests -func NewTestProgress() *TestProgress { - p := progress.New(progress.WithOutput(nil)) - return &TestProgress{ - Progress: p, - } -} - -// Close should be run at the end of the test. It ensures that all resources are released -func (tp *TestProgress) Close() { - tp.Cancel() - tp.Progress.Close() -} - -// AssertProperClose asserts that the progress bar loop terminated normally (with all sub-bars completed at 100%) -func (tp *TestProgress) AssertProperClose(t *testing.T) { - tp.assertClose(t, time.Second*2, true) -} - -// AssertCloseAfterCancellation asserts that the progress bar loop terminated due to a cancellation event -func (tp *TestProgress) AssertCloseAfterCancellation(t *testing.T) { - tp.assertClose(t, time.Second*2, false) -} - -func (tp *TestProgress) assertClose(t *testing.T, after time.Duration, properShutdown bool) { - done := make(chan struct{}) - go func() { - tp.Progress.Close() - close(done) - }() - select { - case <-done: - if properShutdown { - assert.False(t, tp.HasBeenCancelled(), "progress bar shut down without cancellation") - } else { - assert.True(t, tp.HasBeenCancelled(), "progress bar shut down after cancellation") - } - case <-time.After(after): - tp.Cancel() - t.Error("Timed out waiting for progress bar to shut down. Either a bar did not complete, or you forgot to call the Cancel() method.") - <-done - } -} - -// Incrementer implements a simple counter. This can be used to test functions that are expected to report its progress incrementally -type Incrementer struct { - Count int -} - -func NewMockIncrementer() *Incrementer { - return &Incrementer{Count: 0} -} - -// Increment increments the progress count by one -func (mi *Incrementer) Increment(_ ...time.Duration) { - mi.Count++ -} diff --git a/internal/progress/progress.go b/internal/progress/progress.go deleted file mode 100644 index 6b4842d923..0000000000 --- a/internal/progress/progress.go +++ /dev/null @@ -1,146 +0,0 @@ -// Package progress includes helper functions to report progress for a task -// The idea is that you always start with a TotalBar (`p.AddTotalBar`) counting eg., -// the number of downloads or installations. -// For each actual task you can add a separate progress bar once it is running -// Currently, the following task based progrss bars are supported: -// - a progress bar usually used for downloads, counting the number of bytes processed -// - a special progress bar used for unpacking an archive, where only the number of bytes to be read are known. -package progress - -import ( - "context" - "io" - "os" - - "github.com/ActiveState/cli/internal/logging" - "github.com/vbauerster/mpb/v4" - "github.com/vbauerster/mpb/v4/decor" - "golang.org/x/crypto/ssh/terminal" -) - -// FileSizeCallback can be called by a task to report that a sub-task of length `fileSize` (in bytes) has been finished -type FileSizeCallback func(fileSize int) - -// FileSizeTask is a function for a task that reports its progress in bytes processed -type FileSizeTask func(FileSizeCallback) error - -// Progress is a small wrapper around the mpb.Progress struct -// Motivation: The multi-progress bars are used in several places, and can override each other. -// So all code that generates and manipulates progress bars is organized under this struct -// This simplifies testing and demo-ing of new progress bar functionality. -type Progress struct { - progress *mpb.Progress - cancel context.CancelFunc // triggered on Close to ensure that the progress bar unblocks - isCancelled bool - maxNameWidth int -} - -// WithOutput changes the output of the progress bar -// This is a wrapper around `mpb.WithOutput` -// Provide `nil` if output should be discarded -func WithOutput(w io.Writer) mpb.ContainerOption { - return mpb.WithOutput(w) -} - -// WithDebugOutput prints debug messages to a writer. -// This is a wrapper around `mpb.WithDebugOutput` -func WithDebugOutput(w io.Writer) mpb.ContainerOption { - return mpb.WithDebugOutput(w) -} - -// New creates a new Progress struct -// mpb.ContainerOptions are forwarded -func New(options ...mpb.ContainerOption) *Progress { - tw, _, err := terminal.GetSize(int(os.Stdout.Fd())) - if err != nil { - logging.Debug("Could not get terminal size, assuming width=120: %v", err) - tw = 120 - } - - // calculate the maximum width for a name displayed to the left of the progress bar - maxWidth := tw - 80 - 19 // 80 is the default size for the progressbar, 19 is taken by counters (up to 999) and percentage display - if maxWidth < 0 { - maxWidth = 4 - } - if tw <= 105 && tw >= 40 { - maxWidth = 11 // enough space to spell "downloading" - options = append(options, mpb.WithWidth(tw-30)) - } - - ctx, cancel := context.WithCancel(context.Background()) - return &Progress{ - progress: mpb.NewWithContext(ctx, options...), - cancel: cancel, - isCancelled: false, - maxNameWidth: maxWidth, - } -} - -// Cancel cancels all bar listeners and ensures that p.Close() will return -// It should be called *only* if an error occurred and the progress bar will not be able to complete. -func (p *Progress) Cancel() { - p.isCancelled = true - p.cancel() -} - -// HasBeenCancelled returns true if the progress bar has received a cancellation event -func (p *Progress) HasBeenCancelled() bool { - return p.isCancelled -} - -// Close needs to be called after the Progress struct is not needed anymore -func (p *Progress) Close() { - - // The mpb package calls this function Wait(), but it is really a cleanup method, that - // frees all the resources the progress bar allocated - p.progress.Wait() -} - -// TotalBar is an alias of mpb.Bar currently -type TotalBar = mpb.Bar - -// ByteProgressBar is an alias of mpb.Bar currently -type ByteProgressBar = mpb.Bar - -// AddTotalBar returns the top bar, that is supposed to report the total progress (of the current sub-task) -// The `name` is prepended, and for the last total bar, the `remove` flag should be set to `false` otherwise -// always `true`. -func (p *Progress) AddTotalBar(name string, numElements int) *TotalBar { - // crop name if necessary - if len(name) > p.maxNameWidth { - name = name[0:p.maxNameWidth] - } - options := []mpb.BarOption{ - mpb.BarClearOnComplete(), - mpb.PrependDecorators( - decor.Name(name, decor.WCSyncSpaceR), - decor.CountersNoUnit("%d / %d", decor.WCSyncSpace), - // decor.CountersNoUnit("%d / %d", 20, decor.DwidthSync), - ), - mpb.AppendDecorators( - decor.OnComplete(decor.Percentage(decor.WC{W: 5}), ""), - ), - } - - return p.progress.AddBar(int64(numElements), options...) -} - -// AddByteProgressBar adds a progressbar counting the progress in bytes -// This is used as the progress bar for downloading artifacts -func (p *Progress) AddByteProgressBar(totalBytes int64) *ByteProgressBar { - return p.progress.AddBar(totalBytes, - mpb.BarRemoveOnComplete(), - mpb.PrependDecorators( - // synchronize the width with the two total bar decorations - decor.Merge( - decor.Counters(decor.UnitKiB, "%.1f / %.1f", decor.WCSyncSpace), - decor.WCSyncSpace, - ), - ), - mpb.AppendDecorators(decor.Percentage(decor.WC{W: 5}))) -} - -// AddUnpackBar adds a progressbar for unpacking an archive -func (p *Progress) AddUnpackBar(bytesToRead int64, percentOnUnpack int) *UnpackBar { - return NewUnpackBar(bytesToRead, p, percentOnUnpack) -} diff --git a/internal/progress/progress_test.go b/internal/progress/progress_test.go deleted file mode 100644 index 7bf68c3e21..0000000000 --- a/internal/progress/progress_test.go +++ /dev/null @@ -1,94 +0,0 @@ -package progress - -import ( - "bytes" - "fmt" - "io" - "regexp" - "strings" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -type devZero struct { - count int -} - -// Read writes zeros into byte array three times, then return EOF -func (dz *devZero) Read(b []byte) (int, error) { - dz.count++ - - if dz.count == 3 { - return 0, io.EOF - } - return len(b), nil -} - -func (dz *devZero) Close() error { - return nil -} - -func expectPercentage(t *testing.T, buf *bytes.Buffer, expected int) { - expectedTotal := fmt.Sprintf("%d %%", expected) - var stripped string - - // try three times to match the expected string - for retry := 0; retry < 3; retry++ { - time.Sleep(200 * time.Millisecond) - outputLines := strings.Split(strings.TrimSpace(buf.String()), "\n") - lastFiveOffset := len(outputLines) - 5 - if lastFiveOffset < 0 { - lastFiveOffset = 0 - } - output := strings.Join(outputLines[lastFiveOffset:], "\n") - // remove non-printable characters - re := regexp.MustCompile("[[:^print:]]") - stripped = re.ReplaceAllLiteralString(output, "") - - if strings.Count(stripped, expectedTotal) > 0 { - return - } - } - - // have not found the expected string after three attempts - t.Errorf("expected output bar %s to be at %d %%", stripped, expected) -} - -// Test the unpack bar with two times re-scaling -func TestUnpackBar(t *testing.T) { - - buf := new(bytes.Buffer) - readBuf := make([]byte, 10) - func() { - p := New(WithOutput(buf)) - defer p.Close() - - bar := p.AddUnpackBar(30, 70) - dz := &devZero{} - wrapped := NewReaderProxy(bar.Bar(), bar, dz) - _, err := wrapped.Read(readBuf[:]) - assert.NoError(t, err) - _, err = wrapped.Read(readBuf[:]) - assert.NoError(t, err) - _, err = wrapped.Read(readBuf[:]) - assert.EqualError(t, err, "EOF") - time.Sleep(100 * time.Millisecond) - bar.Complete() - expectPercentage(t, buf, 70) - - bar.ReScale(2, 90) - bar.Increment() - expectPercentage(t, buf, 80) - bar.Increment() - bar.Complete() - expectPercentage(t, buf, 90) - bar.ReScale(2, 100) - bar.Increment() - expectPercentage(t, buf, 95) - bar.Increment() - bar.Complete() - expectPercentage(t, buf, 100) - }() -} diff --git a/internal/progress/readerproxy.go b/internal/progress/readerproxy.go deleted file mode 100644 index 1f03024b40..0000000000 --- a/internal/progress/readerproxy.go +++ /dev/null @@ -1,78 +0,0 @@ -package progress - -import ( - "fmt" - "io" - "time" - - "github.com/vbauerster/mpb/v4" -) - -// SingleReporter is an interface for a reporter that reports to a single linear progress bar, opposed to the multi-progress bar. -// This interface mainly exists to be used in tests, such that we can test -// functionality without the heavy wait of an actual progress bar. -type SingleReporter interface { - IncrBy(n int, wdd ...time.Duration) - - Current() int64 - - SetCurrent(n int64, wdd ...time.Duration) -} - -var _ SingleReporter = &mpb.Bar{} - -// ReaderProxy is io.Reader wrapper, for proxy read bytes -type ReaderProxy struct { - io.ReadCloser - bar SingleReporter - iT time.Time - completer Completer -} - -// NewReaderProxy wraps a Reader with functionality that automatically updates -// the bar with progress about how many bytes have been read from the underlying -// reader so far. -func NewReaderProxy(bar SingleReporter, completer Completer, r io.ReadCloser) *ReaderProxy { - return &ReaderProxy{ - ReadCloser: r, - bar: bar, - iT: time.Now(), - completer: completer, - } -} - -// Read reads bytes from underlying ReadCloser and reports progress -// Calls complete() method on EOF -func (pr *ReaderProxy) Read(p []byte) (n int, err error) { - n, err = pr.ReadCloser.Read(p) - if n > 0 { - pr.bar.IncrBy(n, time.Since(pr.iT)) - pr.iT = time.Now() - } - if err == io.EOF { - go pr.completer.Complete() - } - return -} - -// ReadAt reads into buffer starting at offset and reports progress -// Calls complete method on EOF -func (pr *ReaderProxy) ReadAt(p []byte, offset int64) (n int, err error) { - prAt, ok := pr.ReadCloser.(io.ReaderAt) - if !ok { - return 0, fmt.Errorf("Proxied readers needs to implement io.ReaderAt") - } - n, err = prAt.ReadAt(p, offset) - if n > 0 { - if offset == 0 || pr.bar.Current() == offset { - pr.bar.IncrBy(n, time.Since(pr.iT)) - } else { - pr.bar.SetCurrent(offset + int64(n)) - } - pr.iT = time.Now() - } - if err == io.EOF { - go pr.completer.Complete() - } - return -} diff --git a/internal/progress/unpackbar.go b/internal/progress/unpackbar.go deleted file mode 100644 index bc4af0f63f..0000000000 --- a/internal/progress/unpackbar.go +++ /dev/null @@ -1,133 +0,0 @@ -package progress - -import ( - "math" - "time" - - "github.com/ActiveState/cli/internal/logging" - "github.com/vbauerster/mpb/v4" - "github.com/vbauerster/mpb/v4/decor" -) - -// Incrementer provides an increment function. This interface allows to test -// progress reporting functionality without an actual progress bar. -type Incrementer interface { - Increment(_ ...time.Duration) -} - -// Completer provides a message for a progress report that can send a complete event at any time. -type Completer interface { - Complete() -} - -// UnpackBar wraps a regular progress bar that is specifically for unpacking -// Note this peculiarities about unpacking: -// - the number of bytes to be read is known. -// - the number of bytes to be written is unknown. -// This struct therefore stores an artificial total (2% about the total bytes to be read) -// Run Complete when you have written all files to disc, and the bar will fill the remaining 2%. -// -// This bar can be configured to stop progress reporting at a specific target percentage. -// Subsequently, the progress can be incremented after calling the ReScale() method specifying -// the number of incremental steps to reach the next target percentage. -// -// Example: -// // unpackbar that reports 70% progress after unpacking -// upb := NewUnpackBar(bytesToRead, p, 70) -// // unpack -// // ... -// upb.Complete() -// // Now we want to do some file modifications on 20 files, and want to finish at 90% progress afterwards -// upb.ReScale(20, 90) -// // ... for each file call -// upb.Increment() -// // ... -// upb.Complete() -// // Now we need modify 10 more files and want to finish -// upb.ReScale(10) -// // ... -// upb.Complete() -type UnpackBar struct { - bar *mpb.Bar - total int64 // the total counter for when we are done unpacking - targetPercent int // what percentage we should have reached when we are done unpacking - scaleFactor int - barTotal int64 -} - -// NewUnpackBar creates a progressbar for unpacking an archive -// The progress bar will stop at targetPercent on unpacking, leaving room to report progress on -// extra tasks -func NewUnpackBar(bytesToRead int64, p *Progress, targetPercent ...int) *UnpackBar { - target := 100 - if len(targetPercent) > 0 { - target = targetPercent[0] - } - - // add a 2% buffer for finishing the last writes - total := int64(math.Ceil(float64(bytesToRead) * 1.02)) - barTotal := int64(float64(total) * 100.0 / float64(target)) - return &UnpackBar{bar: p.progress.AddBar(barTotal, - mpb.BarRemoveOnComplete(), - mpb.PrependDecorators( - // synchronize the width with the two total bar decorations - decor.Merge( - decor.OnComplete(decor.Spinner(nil, decor.WCSyncSpace), ""), - decor.WCSyncSpace), - // decor.Counters(decor.UnitKiB, "%6.1f / %6.1f", decor.WC{W: 20, C: decor.DidentRight}), - ), - mpb.AppendDecorators( - decor.Percentage(decor.WC{W: 5}), - )), - total: total, - targetPercent: target, - scaleFactor: 1, - barTotal: barTotal, - } -} - -func (upb *UnpackBar) Bar() SingleReporter { - return upb.bar -} - -// Complete completes the progress to 100% and should be called after all files are written to disc -func (upb *UnpackBar) Complete() { - upb.bar.SetCurrent(upb.total) -} - -// ReScale sets a scaling factor that the specified number of increments fill the bar up to 100% -func (upb *UnpackBar) ReScale(countsRemaining int, targetPercent ...int) { - // handle the case of no remaining counts to avoid divisions by zero... - if countsRemaining == 0 { - upb.targetPercent = 100 - upb.barTotal = upb.total - return - } - - var target = 100 - if len(targetPercent) > 0 { - target = targetPercent[0] - } - - toTargetRatio := (float64(target) - float64(upb.targetPercent)) / 100.0 - exactScalingFactor := toTargetRatio * float64(upb.barTotal) / float64(countsRemaining) - - // round up the scaling factor, so we can use integral steps to get to next target ratio - upb.scaleFactor = int(math.Ceil(exactScalingFactor)) - - newBarTotal := int64(float64(countsRemaining) * float64(upb.scaleFactor) / toTargetRatio) - newTotal := int64(float64(target) / 100.0 * float64(newBarTotal)) - newCurrent := int64(float64(upb.targetPercent) / 100.0 * float64(newBarTotal)) - upb.bar.SetTotal(newBarTotal, false) - upb.bar.SetCurrent(newCurrent) - logging.Debug("new Total: %d, new current: %d, scaleFactor: %d\n", newTotal, newCurrent, upb.scaleFactor) - - upb.total = newTotal - upb.barTotal = newBarTotal - upb.targetPercent = target -} - -// Increment increments the counter manually this can be used after ReScaleBar to report progress -func (upb *UnpackBar) Increment(_ ...time.Duration) { - upb.bar.IncrBy(upb.scaleFactor) -} diff --git a/internal/proxyreader/proxyreader.go b/internal/proxyreader/proxyreader.go new file mode 100644 index 0000000000..65275711b6 --- /dev/null +++ b/internal/proxyreader/proxyreader.go @@ -0,0 +1,49 @@ +package proxyreader + +import ( + "io" + + "github.com/ActiveState/cli/internal/errs" +) + +type ByIncrementer interface { + IncrBy(int) +} + +var _ io.Reader = &ProxyReader{} + +// ProxyReader wraps around a reader and calls the incrementer function on every read reporting the number of bytes read +type ProxyReader struct { + increment ByIncrementer + r io.Reader +} + +func NewProxyReader(inc ByIncrementer, r io.Reader) *ProxyReader { + return &ProxyReader{ + increment: inc, + r: r, + } +} + +func (pr *ProxyReader) Read(buf []byte) (int, error) { + n, err := pr.r.Read(buf) + pr.increment.IncrBy(n) + + return n, err +} + +// ReadAt reads into buffer starting at offset and reports progress +// Calls complete method on EOF +func (pr *ProxyReader) ReadAt(p []byte, offset int64) (int, error) { + prAt, ok := pr.r.(io.ReaderAt) + if !ok { + return 0, errs.New("This proxied readers needs to implement io.ReaderAt") + } + n, err := prAt.ReadAt(p, offset) + if n > 0 { + if offset == 0 { + pr.increment.IncrBy(n) + } + } + return n, err +} diff --git a/internal/runbits/changesummary/changesummary.go b/internal/runbits/changesummary/changesummary.go new file mode 100644 index 0000000000..d8c948f503 --- /dev/null +++ b/internal/runbits/changesummary/changesummary.go @@ -0,0 +1,68 @@ +package changesummary + +import ( + "fmt" + "strconv" + + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/internal/logging" + "github.com/ActiveState/cli/internal/output" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/thoas/go-funk" +) + +// ChangeSummary prints the summary of changes to the encapsulated outputer +type ChangeSummary struct { + out output.Outputer +} + +func New(out output.Outputer) *ChangeSummary { + return &ChangeSummary{out} +} + +// ChangeSummary currently only write a summary if exactly one package has been added (after `state install`) +// In this case, it will print +// - the number of direct dependencies this package brings in, +// - the total number of new dependencies +// - the names of the direct dependencies (and the count of their sub-dependencies) +func (cs *ChangeSummary) ChangeSummary(artifacts artifact.ArtifactRecipeMap, requested artifact.ArtifactChangeset, changed artifact.ArtifactChangeset) error { + // currently we only print a change summary if we are adding exactly ONE package + if len(requested.Added) != 1 { + return nil + } + + ar, ok := artifacts[requested.Added[0]] + if !ok { + return errs.New("Did not find requested artifact in ArtifactRecipeMap") + } + + // the added (direct dependencies) of this artifact that are actually new in this project + addedDependencies := funk.Join(ar.Dependencies, changed.Added, funk.InnerJoin).([]artifact.ArtifactID) + + cs.out.Notice("") + cs.out.Notice(locale.Tl( + "changesummary_title", + "[NOTICE]{{.V0}}[/RESET] includes {{.V1}} dependencies, for a combined total of {{.V2}} new dependencies.", + ar.Name, strconv.Itoa(len(addedDependencies)), strconv.Itoa(len(changed.Added)), + )) + for i, dep := range addedDependencies { + depMapping, ok := artifacts[dep] + if !ok { + logging.Error("Could not find dependency %s in artifactsMap", dep) + continue + } + var depCount string + recDeps := artifact.RecursiveDependenciesFor(dep, artifacts) + filteredRecDeps := funk.Join(recDeps, changed.Added, funk.InnerJoin).([]artifact.ArtifactID) + if len(filteredRecDeps) > 0 { + depCount = locale.Tl("ingredient_dependency_count", " ({{.V0}} dependencies)", strconv.Itoa(len(filteredRecDeps))) + } + prefix := "├─" + if i == len(addedDependencies)-1 { + prefix = "└─" + } + cs.out.Notice(fmt.Sprintf(" [DISABLED]%s[/RESET] %s%s", prefix, depMapping.Name, depCount)) + } + return nil +} diff --git a/internal/runbits/changesummary/changesummary_test.go b/internal/runbits/changesummary/changesummary_test.go new file mode 100644 index 0000000000..a64e8034a9 --- /dev/null +++ b/internal/runbits/changesummary/changesummary_test.go @@ -0,0 +1,84 @@ +package changesummary + +import ( + "strings" + "testing" + + "github.com/ActiveState/cli/internal/testhelpers/outputhelper" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestChangeSummary(t *testing.T) { + artifacts := artifact.ArtifactRecipeMap{ + artifact.ArtifactID("1"): artifact.ArtifactRecipe{ + Name: "Package 1", ArtifactID: "1", + Dependencies: []artifact.ArtifactID{"2", "3"}}, + artifact.ArtifactID("2"): artifact.ArtifactRecipe{ + Name: "Dependency 1", ArtifactID: "2", + Dependencies: []artifact.ArtifactID{"4", "5"}}, + artifact.ArtifactID("3"): artifact.ArtifactRecipe{ + Name: "Dependency 2", ArtifactID: "3", + Dependencies: []artifact.ArtifactID{"4", "6"}}, + artifact.ArtifactID("4"): artifact.ArtifactRecipe{ + Name: "Common recursive dependency", ArtifactID: "4", Dependencies: nil}, + artifact.ArtifactID("5"): artifact.ArtifactRecipe{ + Name: "Recursive dependency 1", ArtifactID: "5", Dependencies: nil}, + artifact.ArtifactID("6"): artifact.ArtifactRecipe{ + Name: "Recursive dependency 2", ArtifactID: "6", Dependencies: []artifact.ArtifactID{"7"}}, + artifact.ArtifactID("7"): artifact.ArtifactRecipe{ + Name: "Recursive dependency 3", ArtifactID: "7", Dependencies: nil}, + } + + tests := []struct { + name string + requested artifact.ArtifactChangeset + changed artifact.ArtifactChangeset + expected string + }{ + { + name: "add pkg1, nothing installed", + requested: artifact.ArtifactChangeset{Added: []artifact.ArtifactID{"1"}}, + changed: artifact.ArtifactChangeset{Added: []artifact.ArtifactID{"1", "2", "3", "4", "5", "6", "7"}}, + expected: "Package 1 includes 2 dependencies, for a combined total of 7 new dependencies.\n ├─ Dependency 1 (2 dependencies)\n └─ Dependency 2 (3 dependencies)", + }, + { + name: "add pkg1, dep2 already installed", + requested: artifact.ArtifactChangeset{Added: []artifact.ArtifactID{"1"}}, + changed: artifact.ArtifactChangeset{Added: []artifact.ArtifactID{"1", "2", "4"}}, + expected: "Package 1 includes 1 dependencies, for a combined total of 3 new dependencies.\n └─ Dependency 1 (1 dependencies)", + }, + { + name: "add pkg1, all deps already installed", + requested: artifact.ArtifactChangeset{Added: []artifact.ArtifactID{"1"}}, + changed: artifact.ArtifactChangeset{Added: []artifact.ArtifactID{"1"}}, + expected: "Package 1 includes 0 dependencies, for a combined total of 1 new dependencies.", + }, + { + name: "more than one package added", + requested: artifact.ArtifactChangeset{Added: []artifact.ArtifactID{"1", "2"}}, + changed: artifact.ArtifactChangeset{Added: []artifact.ArtifactID{"1", "2", "4"}}, + expected: "", + }, + { + name: "nothing added", + requested: artifact.ArtifactChangeset{Added: nil}, + changed: artifact.ArtifactChangeset{Added: []artifact.ArtifactID{"1", "2", "4"}}, + expected: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + out := outputhelper.NewCatcher() + cs := New(out) + + err := cs.ChangeSummary(artifacts, tt.requested, tt.changed) + require.NoError(t, err) + + assert.Equal(t, tt.expected, strings.TrimSpace(out.CombinedOutput())) + }) + } + +} diff --git a/internal/runbits/mock/mock.go b/internal/runbits/mock/mock.go new file mode 100644 index 0000000000..004bd9b0b6 --- /dev/null +++ b/internal/runbits/mock/mock.go @@ -0,0 +1,20 @@ +package mock + +import ( + "time" +) + +// Incrementer implements a simple counter. This can be used to test functions that are expected to report its progress incrementally +type Incrementer struct { + Count int +} + +// NewMockIncrementer fakes an integral progresser +func NewMockIncrementer() *Incrementer { + return &Incrementer{Count: 0} +} + +// Increment increments the progress count by one +func (mi *Incrementer) Increment(_ ...time.Duration) { + mi.Count++ +} diff --git a/internal/runbits/progressbar/decor.go b/internal/runbits/progressbar/decor.go new file mode 100644 index 0000000000..f1f6c2b828 --- /dev/null +++ b/internal/runbits/progressbar/decor.go @@ -0,0 +1,44 @@ +package progressbar + +import ( + "github.com/vbauerster/mpb/v6" + "github.com/vbauerster/mpb/v6/decor" +) + +// trimName ensures that the name in a progress bar is not too wide for a terminal to display +func (pb *RuntimeProgress) trimName(name string) string { + if len(name) > pb.maxWidth { + return name[0:pb.maxWidth] + } + return name +} + +// addTotalBar adds a bar counting a number of sub-events adding up to total +func (pb *RuntimeProgress) addTotalBar(name string, total int64) *mpb.Bar { + return pb.addBar(name, total, false, mpb.BarFillerClearOnComplete()) +} + +// addArtifactStepBar adds a bar counting the progress in a specific artifact setup step +func (pb *RuntimeProgress) addArtifactStepBar(name string, total int64, countsBytes bool) *mpb.Bar { + return pb.addBar(name, total, countsBytes, mpb.BarRemoveOnComplete()) +} + +func (pb *RuntimeProgress) addBar(name string, total int64, countsBytes bool, options ...mpb.BarOption) *mpb.Bar { + name = pb.trimName(name) + decorators := []decor.Decorator{ + decor.Name(name, decor.WC{W: pb.maxWidth, C: decor.DidentRight}), + } + if countsBytes { + decorators = append(decorators, decor.CountersKiloByte("%.1f/%.1f", decor.WC{W: 17})) + } else { + decorators = append(decorators, decor.CountersNoUnit("%d/%d", decor.WC{W: 17})) + } + options = append(options, + mpb.PrependDecorators(decorators...), + mpb.AppendDecorators( + decor.OnComplete(decor.Percentage(decor.WC{W: 5}), ""), + ), + ) + + return pb.prg.AddBar(total, options...) +} diff --git a/internal/runbits/progressbar/progressbar.go b/internal/runbits/progressbar/progressbar.go new file mode 100644 index 0000000000..cccafefd56 --- /dev/null +++ b/internal/runbits/progressbar/progressbar.go @@ -0,0 +1,222 @@ +package progressbar + +import ( + "context" + "fmt" + "io" + "time" + + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/internal/termutils" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/vbauerster/mpb/v6" +) + +// progressBarWidth is the width for the progress bar display +// We choose 40, because it is big enough, and gives plenty of room to write a descriptive text next to it. +const progressBarWidth = 40 + +// maxWaitTime is maximum time we wait for the mpb.Progress.Wait() function to return before we cancel it +const maxWaitTime time.Duration = time.Millisecond * 500 + +type artifactStepBar struct { + started time.Time + bar *mpb.Bar +} + +// RuntimeProgress prints a progress bar for runtime setup events based on the vbauerster/mpb progress package. +// It creates a summary progress bar for the overall installation counting the number of successfully installed artifacts +// If a remote build is active, it also prints a progress bar counting the number of successfully build artifacts +// And for every artifact it prints progress bars counting +// - the number of bytes downloaded +// - the number of bytes unpacked +// - the number of files moved to the destination directory +type RuntimeProgress struct { + prg *mpb.Progress + maxWidth int + buildBar *mpb.Bar + installBar *mpb.Bar + artifactStates map[artifact.ArtifactID]map[string]*artifactStepBar + + // mpb.Progress synchronization fields + cancel context.CancelFunc + shutdownNotifier chan struct{} +} + +// NewRuntimeProgress initializes the ProgressBar based on an mpb.Progress container +func NewRuntimeProgress(w io.Writer) *RuntimeProgress { + ctx, cancel := context.WithCancel(context.Background()) + shutdownNotifier := make(chan struct{}) + prg := mpb.NewWithContext( + ctx, mpb.WithShutdownNotifier(shutdownNotifier), + mpb.WithWidth(progressBarWidth), + mpb.WithOutput(w), + ) + return &RuntimeProgress{ + prg: prg, + maxWidth: maxNameWidth(), + artifactStates: make(map[artifact.ArtifactID]map[string]*artifactStepBar), + cancel: cancel, + shutdownNotifier: shutdownNotifier, + } +} + +// Close ensures that the mpb.Progress instance has finished all its work +// Afterwards it is safe to write to the writer again. +// Note: Note: This function will be obsolete if we do our own progress bar implementation provided it does not have to create go-routines. +func (rp *RuntimeProgress) Close() { + defer rp.cancel() // clean up context + defer rp.prg.Wait() // Note: This closes the prgShutdownCh + + // wait at most half a second for the mpb.Progress instance to finish up its processing + select { + case <-time.After(maxWaitTime): + rp.cancel() + case <-rp.shutdownNotifier: + } +} + +// artifactBar is a helper function that returns the progress bar for a given artifact and sub-step (identified by the steps title) +func (rp *RuntimeProgress) artifactBar(id artifact.ArtifactID, title string) *artifactStepBar { + titles, ok := rp.artifactStates[id] + if !ok { + titles = make(map[string]*artifactStepBar) + rp.artifactStates[id] = titles + } + bar, ok := titles[title] + if !ok { + bar = &artifactStepBar{} + titles[title] = bar + } + return bar +} + +// BuildStarted adds a build progress bar +func (rp *RuntimeProgress) BuildStarted(total int64) error { + if rp.buildBar == nil { + rp.buildBar = rp.addTotalBar(locale.Tl("progress_building", "Building"), total) + } + return nil +} + +// BuildIncrement increments the build progress bar counter +func (rp *RuntimeProgress) BuildIncrement() error { + if rp.buildBar == nil { + return errs.New("Build bar has not been initialized yet.") + } + + rp.buildBar.Increment() + return nil +} + +// BuildCompleted ensures that the build progress bar is in a completed state +func (rp *RuntimeProgress) BuildCompleted(anyFailures bool) error { + if rp.buildBar == nil { + return errs.New("Build bar has not been initialized yet.") + } + + // ensure that the build bar reports a completion event even if some builds have failed + if anyFailures { + rp.buildBar.Abort(false) + } else { + // otherwise ensure that total count is set to current count + rp.buildBar.SetTotal(0, true) + } + return nil +} + +// InstallationStarted adds a progress bar for the overall installation progress +func (rp *RuntimeProgress) InstallationStarted(total int64) error { + if rp.installBar == nil { + rp.installBar = rp.addTotalBar(locale.Tl("progress_total_installing", "Installing"), total) + } + return nil +} + +// InstallationIncrement increments the overall installation progress count +func (rp *RuntimeProgress) InstallationIncrement() error { + if rp.installBar == nil { + return errs.New("Installation bar has not been initialized yet.") + } + + rp.installBar.Increment() + return nil +} + +// InstallationCompleted ensures that the installation progress bar is in a completed state +func (rp *RuntimeProgress) InstallationCompleted(anyFailures bool) error { + if rp.installBar == nil { + return errs.New("Installation bar has not been initialized yet.") + } + + // ensure that the build bar reports a completion event even if some builds have failed + if anyFailures { + rp.installBar.Abort(false) + } else { + rp.installBar.SetTotal(0, true) + } + return nil +} + +// ArtifactStepStarted adds a new progress bar for an artifact progress +func (rp *RuntimeProgress) ArtifactStepStarted(artifactID artifact.ArtifactID, title string, name string, total int64, countsBytes bool) error { + as := rp.artifactBar(artifactID, title) + if as.bar != nil { + return errs.New("Progress bar can be initialized only once.") + } + as.bar = rp.addArtifactStepBar(fmt.Sprintf("%s %s", title, name), total, countsBytes) + as.started = time.Now() + + return nil +} + +// ArtifactStepIncrement increments the progress bar count for a specific step and artifact +func (rp *RuntimeProgress) ArtifactStepIncrement(artifactID artifact.ArtifactID, title string, incr int64) error { + as := rp.artifactBar(artifactID, title) + if as.bar == nil { + return errs.New("Progress bar needs to be initialized.") + } + as.bar.IncrInt64(incr) + as.bar.DecoratorEwmaUpdate(time.Now().Sub(as.started)) + + return nil +} + +// ArtifactStepCompleted ensures that the artifact progress bar is in a completed state +func (rp *RuntimeProgress) ArtifactStepCompleted(artifactID artifact.ArtifactID, title string) error { + as := rp.artifactBar(artifactID, title) + if as.bar == nil { + return errs.New("Progress bar needs to be initialized.") + } + + as.bar.SetTotal(0, true) + return nil +} + +// ArtifactStepFailure aborts display of an artifact progress bar +func (rp *RuntimeProgress) ArtifactStepFailure(artifactID artifact.ArtifactID, title string) error { + as := rp.artifactBar(artifactID, title) + if as.bar == nil { + return errs.New("Progress bar needs to be initialized.") + } + + as.bar.Abort(true) + return nil +} + +// maxNameWidth returns the maximum width to be used for a name in a progress bar +func maxNameWidth() int { + tw := termutils.GetWidth() + + // calculate the maximum width for a name displayed to the left of the progress bar + maxWidth := tw - progressBarWidth - 24 // 40 is the size for the progressbar, 24 is taken by counters (up to 999.9) and percentage display + if maxWidth < 0 { + maxWidth = 4 + } + // limit to 30 characters such that text is not too far away from progress bars + if maxWidth > 30 { + return 30 + } + return maxWidth +} diff --git a/internal/runbits/refresh.go b/internal/runbits/refresh.go index 8193556021..f66111a576 100644 --- a/internal/runbits/refresh.go +++ b/internal/runbits/refresh.go @@ -8,31 +8,30 @@ import ( "github.com/go-openapi/strfmt" ) -// RefreshRuntime should be called after runtime mutations. A nil arg for "req" -// means that the message handler will not print output for "a single -// requirement". For example, if multiple requirements are affected, nil is the -// appropriate value. -func RefreshRuntime(out output.Outputer, req *RequestedRequirement, proj *project.Project, cachePath string, commitID strfmt.UUID, changed bool) error { - rtMessages := NewRuntimeMessageHandler(out) - if req != nil { - rtMessages.SetRequirement(req) - } - rt, err := runtime.NewRuntime(proj.Source().Path(), cachePath, commitID, proj.Owner(), proj.Name(), rtMessages) +// RefreshRuntime should be called after runtime mutations. +func RefreshRuntime(out output.Outputer, proj *project.Project, cachePath string, commitID strfmt.UUID, changed bool) error { + rtMessages := DefaultRuntimeEventHandler(out) + isCached := true + rt, err := runtime.New(runtime.NewProjectTarget(proj, cachePath, &commitID)) if err != nil { - return locale.WrapError(err, "err_update_runtime_init", "Could not initialize runtime.") + if runtime.IsNeedsUpdateError(err) { + isCached = false + } else { + return locale.WrapError(err, "err_packages_update_runtime_init", "Could not initialize runtime.") + } } - if !changed && rt.IsCachedRuntime() { - out.Print(locale.Tl("runtime_already_uptodate", "Requested dependencies are already configured and installed.")) + if !changed && isCached { + out.Print(locale.Tl("pkg_already_uptodate", "Requested dependencies are already configured and installed.")) return nil } - if !rt.IsCachedRuntime() { + if !isCached { out.Notice(output.Heading(locale.Tl("update_runtime", "Updating Runtime"))) out.Notice(locale.Tl("update_runtime_info", "Changes to your runtime may require some dependencies to be rebuilt.")) - _, _, err := runtime.NewInstaller(rt).Install() + err := rt.Update(rtMessages) if err != nil { - return locale.WrapError(err, "err_update_runtime_install", "Could not install dependencies.") + return locale.WrapError(err, "err_packages_update_runtime_install", "Could not install dependencies.") } } diff --git a/internal/runbits/runtimeevents.go b/internal/runbits/runtimeevents.go new file mode 100644 index 0000000000..5fdf6426bb --- /dev/null +++ b/internal/runbits/runtimeevents.go @@ -0,0 +1,19 @@ +package runbits + +import ( + "io" + "os" + + "github.com/ActiveState/cli/internal/output" + "github.com/ActiveState/cli/internal/runbits/changesummary" + "github.com/ActiveState/cli/internal/runbits/progressbar" + "github.com/ActiveState/cli/pkg/platform/runtime/setup/events" +) + +func DefaultRuntimeEventHandler(out output.Outputer) *events.RuntimeEventHandler { + var w io.Writer = os.Stdout + if out.Type() != output.PlainFormatName { + w = nil + } + return events.NewRuntimeEventHandler(progressbar.NewRuntimeProgress(w), changesummary.New(out)) +} diff --git a/internal/runbits/runtimemsg.go b/internal/runbits/runtimemsg.go deleted file mode 100644 index c60a8c5945..0000000000 --- a/internal/runbits/runtimemsg.go +++ /dev/null @@ -1,161 +0,0 @@ -package runbits - -import ( - "fmt" - "os" - "strconv" - "strings" - - "github.com/go-openapi/strfmt" - "github.com/vbauerster/mpb/v4" - - "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/logging" - "github.com/ActiveState/cli/internal/output" - "github.com/ActiveState/cli/internal/progress" - "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models" - "github.com/ActiveState/cli/pkg/platform/model" -) - -type RequestedRequirement struct { - Name string - Namespace model.Namespace -} - -type RuntimeMessageHandler struct { - out output.Outputer - bpg *progress.Progress - bbar *progress.TotalBar - - requirement *RequestedRequirement -} - -func NewRuntimeMessageHandler(out output.Outputer) *RuntimeMessageHandler { - return &RuntimeMessageHandler{out, nil, nil, nil} -} - -// SetChangeSummaryFunc sets a function that is called after the build recipe is known and can display a summary of changes that happened to the build -func (r *RuntimeMessageHandler) SetRequirement(requirement *RequestedRequirement) { - r.requirement = requirement -} - -func (r *RuntimeMessageHandler) DownloadStarting() { - r.out.Notice(output.Heading(locale.T("downloading_artifacts"))) -} - -func (r *RuntimeMessageHandler) InstallStarting() { - r.out.Notice(output.Heading(locale.T("installing_artifacts"))) -} - -func (r *RuntimeMessageHandler) ChangeSummary(directDeps map[strfmt.UUID][]strfmt.UUID, recursiveDeps map[strfmt.UUID][]strfmt.UUID, ingredientMap map[strfmt.UUID]*inventory_models.ResolvedIngredient) { - if r.requirement == nil { - return - } - - var matchedIngredient *inventory_models.ResolvedIngredient - for _, ingredient := range ingredientMap { - if matchedIngredient != nil { - break - } - for _, req := range ingredient.ResolvedRequirements { - if req.Feature != nil && *req.Feature == r.requirement.Name && - req.Namespace != nil && *req.Namespace == r.requirement.Namespace.String() { - matchedIngredient = ingredient - break - } - } - } - - if matchedIngredient == nil { - logging.Error("Could not find requirement in resulting recipe: %s (%s)", r.requirement.Name, r.requirement.Namespace) - return - } - - depsForReq, ok := directDeps[*matchedIngredient.IngredientVersion.IngredientVersionID] - if !ok { - logging.Error("Could not find deps for supplied requirement: %s (%s)", r.requirement.Name, r.requirement.Namespace) - return - } - - countDirect := len(depsForReq) - countTotal := len(ingredientMap) - - r.out.Notice("") - r.out.Notice(locale.Tl( - "changesummary_title", - "[NOTICE]{{.V0}}[/RESET] includes {{.V1}} dependencies, for a combined total of {{.V2}} dependencies.", - *matchedIngredient.Ingredient.Name, strconv.Itoa(countDirect), strconv.Itoa(countTotal), - )) - for i, dep := range depsForReq { - depMapping, ok := ingredientMap[dep] - if !ok { - logging.Error("Could not find dependency %s in ingredientMap", dep) - continue - } - var depCount string - recDeps, ok := recursiveDeps[dep] - if !ok { - logging.Error("Could not find recursive dependency of ingredient %s", dep) - } - if len(recDeps) > 0 { - depCount = locale.Tl("ingredient_dependency_count", " ({{.V0}} dependencies)", strconv.Itoa(len(recDeps))) - } - prefix := "├─" - if i == len(depsForReq)-1 { - prefix = "└─" - } - r.out.Notice(fmt.Sprintf(" [DISABLED]%s[/RESET] %s%s", prefix, *depMapping.Ingredient.Name, depCount)) - } -} - -func (r *RuntimeMessageHandler) BuildStarting(totalArtifacts int) { - logging.Debug("BuildStarting") - if r.bpg != nil || r.bbar != nil { - logging.Error("BuildStarting: progress has already initialized") - return - } - - progressOut := os.Stderr - if strings.ToLower(os.Getenv(constants.NonInteractive)) == "true" { - progressOut = nil - } - - r.bpg = progress.New(mpb.WithOutput(progressOut)) - r.bbar = r.bpg.AddTotalBar(locale.Tl("building_remotely", "Building Remotely"), totalArtifacts) -} - -func (r *RuntimeMessageHandler) BuildFinished() { - if r.bpg == nil || r.bbar == nil { - logging.Error("BuildFinished: progressbar is nil") - return - } - - logging.Debug("BuildFinished") - if !r.bbar.Completed() { - r.bpg.Cancel() - } - r.bpg.Close() -} - -func (r *RuntimeMessageHandler) ArtifactBuildStarting(artifactName string) { - logging.Debug("ArtifactBuildStarting: %s", artifactName) -} - -func (r *RuntimeMessageHandler) ArtifactBuildCached(artifactName string) { - logging.Debug("ArtifactBuildCached: %s", artifactName) -} - -func (r *RuntimeMessageHandler) ArtifactBuildCompleted(artifactName string, number, total int) { - if r.bpg == nil || r.bbar == nil { - logging.Error("ArtifactBuildCompleted: progressbar is nil") - return - } - - logging.Debug("ArtifactBuildCompleted: %s", artifactName) - r.bbar.Increment() -} - -func (r *RuntimeMessageHandler) ArtifactBuildFailed(artifactName string, errorMsg string) { - logging.Debug("ArtifactBuildFailed: %s: %s", artifactName, errorMsg) -} diff --git a/internal/runners/activate/activate.go b/internal/runners/activate/activate.go index 969ad8d764..af4e7e8c2c 100644 --- a/internal/runners/activate/activate.go +++ b/internal/runners/activate/activate.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/ActiveState/cli/internal/analytics" + "github.com/ActiveState/cli/internal/config" "github.com/ActiveState/cli/internal/constants" "github.com/ActiveState/cli/internal/errs" "github.com/ActiveState/cli/internal/globaldefault" @@ -32,7 +33,7 @@ type Activate struct { namespaceSelect *NamespaceSelect activateCheckout *Checkout out output.Outputer - config configurable + config *config.Instance proj *project.Project subshell subshell.SubShell prompt prompt.Prompter @@ -173,37 +174,39 @@ func (r *Activate) run(params *ActivateParams) error { r.subshell.SetActivateCommand(params.Command) } - runtime, err := runtime.NewRuntime(proj.Source().Path(), r.config.CachePath(), proj.CommitUUID(), proj.Owner(), proj.Name(), runbits.NewRuntimeMessageHandler(r.out)) - if err != nil { - return locale.WrapError(err, "err_activate_runtime", "Could not initialize a runtime for this project.") - } - - venv := virtualenvironment.New(runtime) - venv.OnUseCache(func() { r.out.Notice(locale.T("using_cached_env")) }) - // Determine branch name branch := proj.BranchName() if params.Branch != "" { branch = params.Branch } - err = venv.Setup(true) + rt, err := runtime.New(runtime.NewProjectTarget(proj, r.config.CachePath(), nil)) if err != nil { - if errs.Matches(err, &model.ErrNoMatchingPlatform{}) { - branches, err := model.BranchNamesForProjectFiltered(proj.Owner(), proj.Name(), branch) - if err == nil && len(branches) > 1 { - err = locale.NewInputError("err_activate_platfrom_alternate_branches", "", branch, strings.Join(branches, "\n - ")) - return errs.AddTips(err, "Run → `[ACTIONABLE]state branch switch [/RESET]` to switch branch") - } + if !runtime.IsNeedsUpdateError(err) { + return locale.WrapError(err, "err_activate_runtime", "Could not initialize a runtime for this project.") } - if !authentication.Get().Authenticated() { - return locale.WrapError(err, "error_could_not_activate_venv_auth", "Could not activate project. If this is a private project ensure that you are authenticated.") + if err = rt.Update(runbits.DefaultRuntimeEventHandler(r.out)); err != nil { + return locale.WrapError(err, "err_update_runtime", "Could not update runtime installation.") + } + if err != nil { + if errs.Matches(err, &model.ErrNoMatchingPlatform{}) { + branches, err := model.BranchNamesForProjectFiltered(proj.Owner(), proj.Name(), branch) + if err == nil && len(branches) > 1 { + err = locale.NewInputError("err_activate_platfrom_alternate_branches", "", branch, strings.Join(branches, "\n - ")) + return errs.AddTips(err, "Run → `[ACTIONABLE]state branch switch [/RESET]` to switch branch") + } + } + if !authentication.Get().Authenticated() { + return locale.WrapError(err, "error_could_not_activate_venv_auth", "Could not activate project. If this is a private project ensure that you are authenticated.") + } + return locale.WrapError(err, "err_could_not_activate_venv", "Could not activate project") } - return locale.WrapError(err, "err_could_not_activate_venv", "Could not activate project") } + venv := virtualenvironment.New(rt) + if setDefault { - err := globaldefault.SetupDefaultActivation(r.subshell, r.config, runtime, filepath.Dir(proj.Source().Path())) + err := globaldefault.SetupDefaultActivation(r.subshell, r.config, rt, filepath.Dir(proj.Source().Path())) if err != nil { return locale.WrapError(err, "err_activate_default", "Could not configure your project as the default.") } diff --git a/internal/runners/activate/namespace.go b/internal/runners/activate/namespace.go index eb3f151059..96e3e4c393 100644 --- a/internal/runners/activate/namespace.go +++ b/internal/runners/activate/namespace.go @@ -6,6 +6,7 @@ import ( "path/filepath" "strings" + "github.com/ActiveState/cli/internal/config" "github.com/ActiveState/cli/internal/errs" "github.com/ActiveState/cli/internal/logging" "github.com/ActiveState/cli/internal/osutils" @@ -18,25 +19,13 @@ import ( "github.com/ActiveState/cli/internal/locale" ) -type configurable interface { - Set(string, interface{}) error - GetBool(string) bool - GetStringMap(string) map[string]interface{} - CachePath() string - ConfigPath() string - GetString(key string) string - GetStringSlice(key string) []string - GetStringMapStringSlice(key string) map[string][]string - AllKeys() []string -} - // NamespaceSelect will select the right directory associated with a namespace, and chdir into it type NamespaceSelect struct { - config configurable + config *config.Instance prompter prompt.Prompter } -func NewNamespaceSelect(config configurable, prime primeable) *NamespaceSelect { +func NewNamespaceSelect(config *config.Instance, prime primeable) *NamespaceSelect { return &NamespaceSelect{config, prime.Prompt()} } diff --git a/internal/runners/branch/switch.go b/internal/runners/branch/switch.go index c635bac31c..68ad082f60 100644 --- a/internal/runners/branch/switch.go +++ b/internal/runners/branch/switch.go @@ -54,7 +54,7 @@ func (s *Switch) Run(params SwitchParams) error { return locale.WrapError(err, "err_switch_set_commitID", "Could not update commit ID") } - err = runbits.RefreshRuntime(s.out, nil, s.project, s.config.CachePath(), *branch.CommitID, false) + err = runbits.RefreshRuntime(s.out, s.project, s.config.CachePath(), *branch.CommitID, false) if err != nil { return locale.WrapError(err, "err_refresh_runtime") } diff --git a/internal/runners/clean/cache.go b/internal/runners/clean/cache.go index 3c68b42542..5f433fef45 100644 --- a/internal/runners/clean/cache.go +++ b/internal/runners/clean/cache.go @@ -84,19 +84,10 @@ func (c *Cache) removeProjectCache(projectDir, namespace string, force bool) err } } - parsed, err := project.ParseNamespace(namespace) - if err != nil { - return locale.WrapError(err, "err_clean_cache_invalid_namespace", "NamespacePrefix argument is not of the correct format") - } - - runtime, err := runtime.NewRuntime(projectDir, c.cfg.CachePath(), "", parsed.Owner, parsed.Project, nil) - if err != nil { - return locale.WrapError(err, "err_clean_cache_runtime_init", "Could not determine cache directory for project used in {{.V0}}", projectDir) - } - projectInstallPath := runtime.InstallPath() + projectInstallPath := runtime.ProjectDirToTargetDir(projectDir, c.cfg.CachePath()) logging.Debug("Remove project path: %s", projectInstallPath) - err = os.RemoveAll(projectInstallPath) + err := os.RemoveAll(projectInstallPath) if err != nil { return locale.WrapError(err, "err_clean_remove_artifact", "Could not remove cached runtime environment for project: {{.V0}}", namespace) } diff --git a/internal/runners/deploy/deploy.go b/internal/runners/deploy/deploy.go index 24fceacc06..13f9d07129 100644 --- a/internal/runners/deploy/deploy.go +++ b/internal/runners/deploy/deploy.go @@ -7,6 +7,7 @@ import ( rt "runtime" "strings" + "github.com/go-openapi/strfmt" "github.com/gobuffalo/packr" "github.com/ActiveState/cli/internal/config" @@ -24,6 +25,7 @@ import ( "github.com/ActiveState/cli/internal/virtualenvironment" "github.com/ActiveState/cli/pkg/platform/model" "github.com/ActiveState/cli/pkg/platform/runtime" + "github.com/ActiveState/cli/pkg/platform/runtime/setup" "github.com/ActiveState/cli/pkg/project" ) @@ -47,9 +49,6 @@ type Deploy struct { subshell subshell.SubShell step Step cfg *config.Instance - - DefaultBranchForProjectName defaultBranchForProjectNameFunc - NewRuntimeInstaller newInstallerFunc } type primeable interface { @@ -64,8 +63,6 @@ func NewDeploy(step Step, prime primeable) *Deploy { prime.Subshell(), step, prime.Config(), - model.DefaultBranchForProjectName, - newInstaller, } } @@ -80,88 +77,36 @@ func (d *Deploy) Run(params *Params) error { } } - targetPath := params.Path - runtime, installer, err := d.createRuntimeInstaller(params.Namespace, targetPath) + commitID, err := d.commitID(params.Namespace) if err != nil { - return locale.WrapError( - err, "err_deploy_create_install", - "Could not initialize an installer for {{.V0}}.", params.Namespace.String()) + return locale.WrapError(err, "err_deploy_commitid", "Could not grab commit ID for project: {{.V0}}.", params.Namespace.String()) } - return runSteps(targetPath, params.Force, params.UserScope, params.Namespace, d.step, runtime, installer, d.output, d.cfg, d.subshell) -} - -func (d *Deploy) createRuntimeInstaller(namespace project.Namespaced, targetPath string) (*runtime.Runtime, installable, error) { - commitID := namespace.CommitID - if commitID == nil { - branch, err := d.DefaultBranchForProjectName(namespace.Owner, namespace.Project) - if err != nil { - return nil, nil, errs.Wrap(err, "Could not create installer") - } - - if branch.CommitID == nil { - return nil, nil, locale.NewInputError( - "err_deploy_no_commits", - "The project '{{.V0}}' does not have any packages configured, please add add some packages first.", namespace.String()) - } + rtTarget := runtime.NewCustomTarget(params.Namespace.Owner, params.Namespace.Project, commitID, params.Path) /* TODO: handle empty path */ - commitID = branch.CommitID - } + logging.Debug("runSteps: %s", d.step.String()) - runtime, err := runtime.NewRuntime("", d.cfg.CachePath(), *commitID, namespace.Owner, namespace.Project, runbits.NewRuntimeMessageHandler(d.output)) - if err != nil { - return nil, nil, locale.WrapError(err, "err_deploy_init_runtime", "Could not initialize runtime for deployment.") - } - - // NewRuntime will set a default installation path - // Override the default path if one was provided - if targetPath != "" { - runtime.SetInstallPath(targetPath) - } - return runtime, d.NewRuntimeInstaller(runtime), nil -} - -func runSteps(targetPath string, force bool, userScope bool, namespace project.Namespaced, step Step, runtime *runtime.Runtime, installer installable, out output.Outputer, cfg sscommon.Configurable, subshell subshell.SubShell) error { - return runStepsWithFuncs( - targetPath, force, userScope, namespace, step, runtime, installer, out, cfg, subshell, - install, configure, symlink, report) -} - -func runStepsWithFuncs(targetPath string, force, userScope bool, namespace project.Namespaced, step Step, rt *runtime.Runtime, installer installable, out output.Outputer, cfg sscommon.Configurable, subshell subshell.SubShell, installf installFunc, configuref configureFunc, symlinkf symlinkFunc, reportf reportFunc) error { - logging.Debug("runSteps: %s", step.String()) - - var err error - - installed, err := installer.IsInstalled() - if err != nil { - return err - } - - if !installed && step != UnsetStep && step != InstallStep { - return locale.NewInputError("err_deploy_run_install", "Please run the install step at least once") - } - - if step == UnsetStep || step == InstallStep { + if d.step == UnsetStep || d.step == InstallStep { logging.Debug("Running install step") - if err := installf(targetPath, installer, out); err != nil { + if err := d.install(rtTarget); err != nil { return err } } - if step == UnsetStep || step == ConfigureStep { + if d.step == UnsetStep || d.step == ConfigureStep { logging.Debug("Running configure step") - if err := configuref(targetPath, rt, cfg, out, subshell, namespace, userScope); err != nil { + if err := d.configure(params.Namespace, rtTarget, params.UserScope); err != nil { return err } } - if step == UnsetStep || step == SymlinkStep { + if d.step == UnsetStep || d.step == SymlinkStep { logging.Debug("Running symlink step") - if err := symlinkf(targetPath, force, rt, out); err != nil { + if err := d.symlink(rtTarget, params.Force); err != nil { return err } } - if step == UnsetStep || step == ReportStep { + if d.step == UnsetStep || d.step == ReportStep { logging.Debug("Running report step") - if err := reportf(targetPath, rt, out); err != nil { + if err := d.report(rtTarget); err != nil { return err } } @@ -169,55 +114,89 @@ func runStepsWithFuncs(targetPath string, force, userScope bool, namespace proje return nil } -type installFunc func(path string, installer installable, out output.Outputer) error +func (d *Deploy) commitID(namespace project.Namespaced) (strfmt.UUID, error) { + commitID := namespace.CommitID + if commitID == nil { + branch, err := model.DefaultBranchForProjectName(namespace.Owner, namespace.Project) + if err != nil { + return "", errs.Wrap(err, "Could not detect default branch") + } + + if branch.CommitID == nil { + return "", locale.NewInputError( + "err_deploy_no_commits", + "The project '{{.V0}}' does not have any packages configured, please add add some packages first.", namespace.String()) + } + + commitID = branch.CommitID + } + + if commitID == nil { + return "", errs.New("commitID is nil") + } + + return *commitID, nil +} + +func (d *Deploy) install(rtTarget setup.Targeter) error { + d.output.Notice(output.Heading(locale.T("deploy_install"))) -func install(path string, installer installable, out output.Outputer) error { - out.Notice(output.Heading(locale.T("deploy_install"))) - _, installed, err := installer.Install() - if err != nil { - return locale.WrapError(err, "deploy_install_failed", "Installation failed.") + rti, err := runtime.New(rtTarget) + if err == nil { + d.output.Notice(locale.Tl("deploy_already_installed", "Already installed")) + return nil + } + if !runtime.IsNeedsUpdateError(err) { + return locale.WrapError(err, "deploy_runtime_err", "Could not initialize runtime") } - if !installed { - out.Notice(locale.T("using_cached_env")) + + if err := rti.Update(runbits.DefaultRuntimeEventHandler(d.output)); err != nil { + return locale.WrapError(err, "deploy_install_failed", "Installation failed.") } if rt.GOOS == "windows" { box := packr.NewBox("../../../assets/scripts") contents := box.Bytes("setenv.bat") - err = fileutils.WriteFile(filepath.Join(path, "setenv.bat"), contents) + err := fileutils.WriteFile(filepath.Join(rtTarget.Dir(), "setenv.bat"), contents) if err != nil { - return locale.WrapError(err, "err_deploy_write_setenv", "Could not create setenv batch scriptfile at path: %s", path) + return locale.WrapError(err, "err_deploy_write_setenv", "Could not create setenv batch scriptfile at path: %s", rtTarget.Dir()) } } - out.Print(locale.Tl("deploy_install_done", "Installation completed")) + d.output.Print(locale.Tl("deploy_install_done", "Installation completed")) return nil } -type configureFunc func(installpath string, runtime *runtime.Runtime, cfg sscommon.Configurable, out output.Outputer, sshell subshell.SubShell, namespace project.Namespaced, userScope bool) error +func (d *Deploy) configure(namespace project.Namespaced, rtTarget setup.Targeter, userScope bool) error { + rti, err := runtime.New(rtTarget) + if err != nil { + if runtime.IsNeedsUpdateError(err) { + return locale.NewInputError("err_deploy_run_install") + } + return locale.WrapError(err, "deploy_runtime_err", "Could not initialize runtime") + } -func configure(installpath string, runtime *runtime.Runtime, cfg sscommon.Configurable, out output.Outputer, sshell subshell.SubShell, namespace project.Namespaced, userScope bool) error { - venv := virtualenvironment.New(runtime) + venv := virtualenvironment.New(rti) env, err := venv.GetEnv(false, "") if err != nil { return err } - out.Notice(output.Heading(locale.Tr("deploy_configure_shell", sshell.Shell()))) + d.output.Notice(output.Heading(locale.Tr("deploy_configure_shell", d.subshell.Shell()))) - err = sshell.WriteUserEnv(cfg, env, sscommon.Deploy, userScope) + err = d.subshell.WriteUserEnv(d.cfg, env, sscommon.Deploy, userScope) if err != nil { return locale.WrapError(err, "err_deploy_subshell_write", "Could not write environment information to your shell configuration.") } - binPath := filepath.Join(installpath, "bin") + binPath := filepath.Join(rtTarget.Dir(), "bin") if err := fileutils.MkdirUnlessExists(binPath); err != nil { return locale.WrapError(err, "err_deploy_binpath", "Could not create bin directory.") } // Write global env file - out.Notice(fmt.Sprintf("Writing shell env file to %s\n", filepath.Join(installpath, "bin"))) - err = sshell.SetupShellRcFile(binPath, env, namespace) + d.output.Notice(fmt.Sprintf("Writing shell env file to %s\n", filepath.Join(rtTarget.Dir(), "bin"))) + err = d.subshell.SetupShellRcFile(binPath, env, namespace) if err != nil { return locale.WrapError(err, "err_deploy_subshell_rc_file", "Could not create environment script.") } @@ -225,10 +204,16 @@ func configure(installpath string, runtime *runtime.Runtime, cfg sscommon.Config return nil } -type symlinkFunc func(installPath string, overwrite bool, runtime *runtime.Runtime, out output.Outputer) error +func (d *Deploy) symlink(rtTarget setup.Targeter, overwrite bool) error { + rti, err := runtime.New(rtTarget) + if err != nil { + if runtime.IsNeedsUpdateError(err) { + return locale.NewInputError("err_deploy_run_install") + } + return locale.WrapError(err, "deploy_runtime_err", "Could not initialize runtime") + } -func symlink(installPath string, overwrite bool, runtime *runtime.Runtime, out output.Outputer) error { - venv := virtualenvironment.New(runtime) + venv := virtualenvironment.New(rti) env, err := venv.GetEnv(false, "") if err != nil { return err @@ -262,7 +247,7 @@ func symlink(installPath string, overwrite bool, runtime *runtime.Runtime, out o if rt.GOOS != "windows" { // Symlink to PATH (eg. /usr/local/bin) - if err := symlinkWithTarget(overwrite, path, exes, out); err != nil { + if err := symlinkWithTarget(overwrite, path, exes, d.output); err != nil { return locale.WrapError(err, "err_symlink", "Could not create symlinks to {{.V0}}.", path) } } @@ -347,10 +332,16 @@ type Report struct { Environment map[string]string } -type reportFunc func(path string, runtime *runtime.Runtime, out output.Outputer) error +func (d *Deploy) report(rtTarget setup.Targeter) error { + rti, err := runtime.New(rtTarget) + if err != nil { + if runtime.IsNeedsUpdateError(err) { + return locale.NewInputError("err_deploy_run_install") + } + return locale.WrapError(err, "deploy_runtime_err", "Could not initialize runtime") + } -func report(path string, runtime *runtime.Runtime, out output.Outputer) error { - venv := virtualenvironment.New(runtime) + venv := virtualenvironment.New(rti) env, err := venv.GetEnv(false, "") if err != nil { return err @@ -362,19 +353,19 @@ func report(path string, runtime *runtime.Runtime, out output.Outputer) error { bins = strings.Split(path, string(os.PathListSeparator)) } - out.Notice(output.Heading(locale.T("deploy_info"))) + d.output.Notice(output.Heading(locale.T("deploy_info"))) - out.Print(Report{ + d.output.Print(Report{ BinaryDirectories: bins, Environment: env, }) - out.Notice(output.Heading(locale.T("deploy_restart"))) + d.output.Notice(output.Heading(locale.T("deploy_restart"))) if rt.GOOS == "windows" { - out.Notice(locale.Tr("deploy_restart_cmd", filepath.Join(path, "setenv.bat"))) + d.output.Notice(locale.Tr("deploy_restart_cmd", filepath.Join(rtTarget.Dir(), "setenv.bat"))) } else { - out.Notice(locale.T("deploy_restart_shell")) + d.output.Notice(locale.T("deploy_restart_shell")) } return nil diff --git a/internal/runners/deploy/deploy_test.go b/internal/runners/deploy/deploy_test.go deleted file mode 100644 index 3372f5b075..0000000000 --- a/internal/runners/deploy/deploy_test.go +++ /dev/null @@ -1,178 +0,0 @@ -package deploy - -import ( - "testing" - - "github.com/ActiveState/cli/internal/config" - "github.com/ActiveState/cli/internal/output" - "github.com/ActiveState/cli/internal/subshell" - "github.com/ActiveState/cli/internal/subshell/sscommon" - "github.com/ActiveState/cli/internal/testhelpers/outputhelper" - "github.com/ActiveState/cli/pkg/platform/runtime" - "github.com/ActiveState/cli/pkg/project" - "github.com/stretchr/testify/require" -) - -type InstallableMock struct{} - -func (i *InstallableMock) Install() (envGetter envGetter, freshInstallation bool, err error) { - return nil, false, nil -} - -func (i *InstallableMock) Env() (envGetter envGetter, err error) { - return nil, nil -} - -func (i *InstallableMock) IsInstalled() (bool, error) { - return true, nil -} - -type EnvGetMock struct { - callback func(inherit bool, projectDir string) (map[string]string, error) -} - -func (e *EnvGetMock) GetEnv(inherit bool, projectDir string) (map[string]string, error) { - return e.callback(inherit, projectDir) -} - -func Test_runStepsWithFuncs(t *testing.T) { - type args struct { - runtime *runtime.Runtime - installer installable - step Step - } - type want struct { - err error - installCalled bool - configCalled bool - symlinkCalled bool - reportCalled bool - } - tests := []struct { - name string - args args - want want - }{ - { - "Deploy without steps", - args{ - nil, - &InstallableMock{}, - UnsetStep, - }, - want{ - nil, - true, - true, - true, - true, - }, - }, - { - "Deploy with install step", - args{ - nil, - &InstallableMock{}, - InstallStep, - }, - want{ - nil, - true, - false, - false, - false, - }, - }, - { - "Deploy with config step", - args{ - nil, - &InstallableMock{}, - ConfigureStep, - }, - want{ - nil, - false, - true, - false, - false, - }, - }, - { - "Deploy with symlink step", - args{ - nil, - &InstallableMock{}, - SymlinkStep, - }, - want{ - nil, - false, - false, - true, - false, - }, - }, - { - "Deploy with report step", - args{ - nil, - &InstallableMock{}, - ReportStep, - }, - want{ - nil, - false, - false, - false, - true, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - var installCalled bool - installFunc := func(string, installable, output.Outputer) error { - installCalled = true - return nil - } - var configCalled bool - configFunc := func(string, *runtime.Runtime, sscommon.Configurable, output.Outputer, subshell.SubShell, project.Namespaced, bool) error { - configCalled = true - return nil - } - var symlinkCalled bool - symlinkFunc := func(string, bool, *runtime.Runtime, output.Outputer) error { - symlinkCalled = true - return nil - } - var reportCalled bool - reportFunc := func(string, *runtime.Runtime, output.Outputer) error { - reportCalled = true - return nil - } - catcher := outputhelper.NewCatcher() - forceOverwrite := true - userScope := false - namespace := project.Namespaced{"owner", "project", nil} - cfg, err := config.Get() - require.NoError(t, err) - err = runStepsWithFuncs("", forceOverwrite, userScope, namespace, tt.args.step, tt.args.runtime, tt.args.installer, catcher.Outputer, cfg, nil, installFunc, configFunc, symlinkFunc, reportFunc) - if err != tt.want.err { - t.Errorf("runStepsWithFuncs() error = %v, wantErr %v", err, tt.want.err) - } - if installCalled != tt.want.installCalled { - t.Errorf("runStepsWithFuncs() installCalled = %v, want %v", installCalled, tt.want.installCalled) - } - if configCalled != tt.want.configCalled { - t.Errorf("runStepsWithFuncs() configCalled = %v, want %v", configCalled, tt.want.configCalled) - } - if symlinkCalled != tt.want.symlinkCalled { - t.Errorf("runStepsWithFuncs() symlinkCalled = %v, want %v", symlinkCalled, tt.want.symlinkCalled) - } - if reportCalled != tt.want.reportCalled { - t.Errorf("runStepsWithFuncs() reportCalled = %v, want %v", reportCalled, tt.want.reportCalled) - } - }) - } -} diff --git a/internal/runners/deploy/testable.go b/internal/runners/deploy/testable.go deleted file mode 100644 index a2bd7689bb..0000000000 --- a/internal/runners/deploy/testable.go +++ /dev/null @@ -1,26 +0,0 @@ -package deploy - -import ( - "github.com/ActiveState/cli/pkg/platform/api/mono/mono_models" - "github.com/ActiveState/cli/pkg/platform/runtime" -) - -type envGetter = runtime.EnvGetter - -// installable is an interface for runtime.Installer -type installable interface { - Install() (envGetter envGetter, freshInstallation bool, err error) - Env() (envGetter envGetter, err error) - IsInstalled() (bool, error) -} - -// newInstallerFunc defines a testable type for runtime.InitInstaller -type newInstallerFunc func(rt *runtime.Runtime) installable - -// newInstaller wraps runtime.newInstaller so we can modify the return types -func newInstaller(rt *runtime.Runtime) installable { - return runtime.NewInstaller(rt) -} - -// defaultBranchForProjectNameFunc defines a testable type for model.DefaultBranchForProjectName -type defaultBranchForProjectNameFunc func(owner, name string) (*mono_models.Branch, error) diff --git a/internal/runners/packages/import.go b/internal/runners/packages/import.go index 9da6865926..53757f3db1 100644 --- a/internal/runners/packages/import.go +++ b/internal/runners/packages/import.go @@ -135,7 +135,7 @@ func (i *Import) Run(params ImportRunParams) error { return locale.WrapError(err, "err_commit_changeset", "Could not commit import changes") } - return runbits.RefreshRuntime(i.out, nil, i.proj, i.cfg.CachePath(), commitID, true) + return runbits.RefreshRuntime(i.out, i.proj, i.cfg.CachePath(), commitID, true) } func removeRequirements(conf Confirmer, project *project.Project, force, isHeadless bool, reqs model.Checkpoint) error { diff --git a/internal/runners/packages/packages.go b/internal/runners/packages/packages.go index 9cbdaa2256..88ba35b652 100644 --- a/internal/runners/packages/packages.go +++ b/internal/runners/packages/packages.go @@ -119,11 +119,7 @@ func executePackageOperation(pj *project.Project, cfg configurable, out output.O } // refresh runtime - req := runbits.RequestedRequirement{ - Name: name, - Namespace: ns, - } - err = runbits.RefreshRuntime(out, &req, pj, cfg.CachePath(), commitID, orderChanged) + err = runbits.RefreshRuntime(out, pj, cfg.CachePath(), commitID, orderChanged) if err != nil { return err } diff --git a/internal/runners/run/run.go b/internal/runners/run/run.go index 512d9c16de..2dfdcd8bf6 100644 --- a/internal/runners/run/run.go +++ b/internal/runners/run/run.go @@ -3,6 +3,7 @@ package run import ( "strings" + "github.com/ActiveState/cli/internal/config" "github.com/ActiveState/cli/internal/language" "github.com/ActiveState/cli/internal/locale" "github.com/ActiveState/cli/internal/logging" @@ -21,7 +22,7 @@ type Run struct { out output.Outputer proj *project.Project subshell subshell.SubShell - cfg scriptrun.Configurable + cfg *config.Instance } type primeable interface { @@ -46,7 +47,7 @@ func (r *Run) Run(name string, args []string) error { return run(r.out, r.subshell, r.proj, r.cfg, name, args) } -func run(out output.Outputer, subs subshell.SubShell, proj *project.Project, cfg scriptrun.Configurable, name string, args []string) error { +func run(out output.Outputer, subs subshell.SubShell, proj *project.Project, cfg *config.Instance, name string, args []string) error { logging.Debug("Execute") if proj == nil { diff --git a/internal/runners/shim/shim.go b/internal/runners/shim/shim.go index 2b1fc06487..ec13ff8b1c 100644 --- a/internal/runners/shim/shim.go +++ b/internal/runners/shim/shim.go @@ -70,15 +70,16 @@ func (s *Shim) Run(params *Params, args ...string) error { return nil } - runtime, err := runtime.NewRuntime(s.proj.Source().Path(), s.cfg.CachePath(), s.proj.CommitUUID(), s.proj.Owner(), s.proj.Name(), runbits.NewRuntimeMessageHandler(s.out)) + rt, err := runtime.New(runtime.NewProjectTarget(s.proj, s.cfg.CachePath(), nil)) if err != nil { - return locale.WrapError(err, "err_shim_runtime_init", "Could not initialize runtime for shim command.") - } - venv := virtualenvironment.New(runtime) - if err := venv.Activate(); err != nil { - logging.Errorf("Unable to activate state: %s", err.Error()) - return locale.WrapError(err, "err_shim_activate", "Could not activate environment for shim command") + if !runtime.IsNeedsUpdateError(err) { + return locale.WrapError(err, "err_activate_runtime", "Could not initialize a runtime for this project.") + } + if err := rt.Update(runbits.DefaultRuntimeEventHandler(s.out)); err != nil { + return locale.WrapError(err, "err_update_runtime", "Could not update runtime installation.") + } } + venv := virtualenvironment.New(rt) env, err := venv.GetEnv(true, filepath.Dir(s.proj.Source().Path())) if err != nil { diff --git a/internal/scriptrun/scriptrun.go b/internal/scriptrun/scriptrun.go index ae64c281c6..96a8ec0801 100644 --- a/internal/scriptrun/scriptrun.go +++ b/internal/scriptrun/scriptrun.go @@ -6,6 +6,7 @@ import ( rt "runtime" "strings" + "github.com/ActiveState/cli/internal/config" "github.com/ActiveState/cli/internal/errs" "github.com/ActiveState/cli/internal/language" "github.com/ActiveState/cli/internal/locale" @@ -20,24 +21,19 @@ import ( "github.com/ActiveState/cli/pkg/project" ) -type Configurable interface { - process.Configurable - CachePath() string -} - // ScriptRun manages the context required to run a script. type ScriptRun struct { out output.Outputer sub subshell.SubShell project *project.Project - cfg Configurable + cfg *config.Instance venvPrepared bool venvExePath string } // New returns a pointer to a prepared instance of ScriptRun. -func New(out output.Outputer, subs subshell.SubShell, proj *project.Project, cfg Configurable) *ScriptRun { +func New(out output.Outputer, subs subshell.SubShell, proj *project.Project, cfg *config.Instance) *ScriptRun { return &ScriptRun{ out, subs, @@ -60,16 +56,16 @@ func (s *ScriptRun) NeedsActivation() bool { // PrepareVirtualEnv sets up the relevant runtime and prepares the environment. func (s *ScriptRun) PrepareVirtualEnv() error { - runtime, err := runtime.NewRuntime(s.project.Source().Path(), s.cfg.CachePath(), s.project.CommitUUID(), s.project.Owner(), s.project.Name(), runbits.NewRuntimeMessageHandler(s.out)) + rt, err := runtime.New(runtime.NewProjectTarget(s.project, s.cfg.CachePath(), nil)) if err != nil { - return locale.WrapError(err, "err_run_runtime_init", "Failed to initialize runtime.") - } - venv := virtualenvironment.New(runtime) - - if err := venv.Activate(); err != nil { - logging.Errorf("Unable to activate state: %s", err.Error()) - return locale.WrapError(err, "error_state_run_activate") + if !runtime.IsNeedsUpdateError(err) { + return locale.WrapError(err, "err_activate_runtime", "Could not initialize a runtime for this project.") + } + if err := rt.Update(runbits.DefaultRuntimeEventHandler(s.out)); err != nil { + return locale.WrapError(err, "err_update_runtime", "Could not update runtime installation.") + } } + venv := virtualenvironment.New(rt) env, err := venv.GetEnv(true, filepath.Dir(s.project.Source().Path())) if err != nil { diff --git a/internal/unarchiver/targz.go b/internal/unarchiver/targz.go index 420581cf9f..ed6f75dca7 100644 --- a/internal/unarchiver/targz.go +++ b/internal/unarchiver/targz.go @@ -22,12 +22,16 @@ var _ SingleUnarchiver = &TarGzArchive{} // TarGzArchive is an extension of an TarGz archiver implementing an unarchive method with // progress feedback type TarGzArchive struct { - archiver.TarGz + *archiver.TarGz } // NewTarGz initializes a new TarGzArchiver func NewTarGz() Unarchiver { - return Unarchiver{&TarGzArchive{*archiver.DefaultTarGz}, func(_ string, _ int64, _ bool) {}} + return Unarchiver{&TarGzArchive{archiver.NewTarGz()}, func(_ string, _ int64, _ bool) {}} +} + +func (ar *TarGzArchive) Ext() string { + return ".tar.gz" } // GetExtractedSize returns the size of the extracted summed up files in the archive diff --git a/internal/unarchiver/unarchiver.go b/internal/unarchiver/unarchiver.go index 11cf6bf565..9398b38a92 100644 --- a/internal/unarchiver/unarchiver.go +++ b/internal/unarchiver/unarchiver.go @@ -24,6 +24,9 @@ type SingleUnarchiver interface { // CheckExt checks that the file extension is appropriate for the archive CheckExt(archiveName string) error + + // Ext returns a valid file name extension for this archiver + Ext() string } // ExtractNotifier gets called when a new file has been extracted from the archive @@ -37,6 +40,10 @@ type Unarchiver struct { notifier ExtractNotifier } +func (ua *Unarchiver) Ext() string { + return ua.impl.Ext() +} + // SetNotifier sets the notification function to be called after extracting a file func (ua *Unarchiver) SetNotifier(cb ExtractNotifier) { ua.notifier = cb diff --git a/internal/unarchiver/zip.go b/internal/unarchiver/zip.go index 0187d16f8c..f1183237d2 100644 --- a/internal/unarchiver/zip.go +++ b/internal/unarchiver/zip.go @@ -19,12 +19,16 @@ var _ SingleUnarchiver = &ZipArchive{} // ZipArchive is an extension of an Zip archiver implementing an unarchive method with // progress feedback type ZipArchive struct { - archiver.Zip + *archiver.Zip } // NewZip initializes a new ZipArchive func NewZip() Unarchiver { - return Unarchiver{&ZipArchive{*archiver.DefaultZip}, func(_ string, _ int64, _ bool) {}} + return Unarchiver{&ZipArchive{archiver.NewZip()}, func(_ string, _ int64, _ bool) {}} +} + +func (z *ZipArchive) Ext() string { + return ".zip" } // ExtractNext extracts the next file to destination diff --git a/internal/virtualenvironment/virtualenvironment.go b/internal/virtualenvironment/virtualenvironment.go index 737e0972a2..091a2c80a4 100644 --- a/internal/virtualenvironment/virtualenvironment.go +++ b/internal/virtualenvironment/virtualenvironment.go @@ -1,16 +1,12 @@ package virtualenvironment import ( - "os" "path/filepath" - "strings" "github.com/google/uuid" "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/errs" "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/logging" "github.com/ActiveState/cli/internal/osutils" "github.com/ActiveState/cli/pkg/platform/runtime" "github.com/ActiveState/cli/pkg/project" @@ -21,7 +17,6 @@ var persisted *VirtualEnvironment // VirtualEnvironment represents our virtual environment, it pulls together and virtualizes the runtime environment type VirtualEnvironment struct { activationID string - onUseCache func() runtime *runtime.Runtime } @@ -32,59 +27,14 @@ func New(runtime *runtime.Runtime) *VirtualEnvironment { } } -// Activate the virtual environment -func (v *VirtualEnvironment) Activate() error { - logging.Debug("Activating Virtual Environment") - - if strings.ToLower(os.Getenv(constants.DisableRuntime)) != "true" { - if err := v.Setup(true); err != nil { - return err - } - } - - return nil -} - -// OnUseCache will call the given function when the cached runtime is used -func (v *VirtualEnvironment) OnUseCache(f func()) { v.onUseCache = f } - -// Setup sets up a runtime environment that is fully functional. -func (v *VirtualEnvironment) Setup(installIfNecessary bool) error { - logging.Debug("Setting up virtual Environment") - if strings.ToLower(os.Getenv(constants.DisableRuntime)) == "true" { - return nil - } - if installIfNecessary { - if !v.runtime.IsCachedRuntime() { - installer := runtime.NewInstaller(v.runtime) - _, _, err := installer.Install() - if err != nil { - return err - } - } else if v.onUseCache != nil { - v.onUseCache() - } - } else { - _, err := v.runtime.Env() - if err != nil { - return err - } - } - - return nil -} - // GetEnv returns a map of the cumulative environment variables for all active virtual environments func (v *VirtualEnvironment) GetEnv(inherit bool, projectDir string) (map[string]string, error) { envMap := make(map[string]string) // Source runtime environment information - if strings.ToLower(os.Getenv(constants.DisableRuntime)) != "true" { - env, err := v.runtime.Env() - if err != nil { - return envMap, errs.Wrap(err, "Could not initialize runtime env") - } - envMap, err = env.GetEnv(inherit, projectDir) + if v.runtime != runtime.DisabledRuntime { + var err error + envMap, err = v.runtime.Environ(inherit, projectDir) if err != nil { return envMap, err } diff --git a/internal/virtualenvironment/virtualenvironment_test.go b/internal/virtualenvironment/virtualenvironment_test.go index d0b5736899..a05195db1e 100644 --- a/internal/virtualenvironment/virtualenvironment_test.go +++ b/internal/virtualenvironment/virtualenvironment_test.go @@ -3,15 +3,14 @@ package virtualenvironment import ( "os" "path/filepath" - "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gopkg.in/yaml.v2" "github.com/ActiveState/cli/internal/constants" "github.com/ActiveState/cli/internal/environment" + "github.com/ActiveState/cli/pkg/platform/runtime" rtmock "github.com/ActiveState/cli/pkg/platform/runtime/mock" "github.com/ActiveState/cli/pkg/projectfile" ) @@ -47,7 +46,7 @@ func TestEnv(t *testing.T) { os.Setenv(constants.ProjectEnvVarName, projectfile.Get().Path()) defer os.Unsetenv(constants.ProjectEnvVarName) - venv := New(nil) + venv := New(runtime.DisabledRuntime) env, err := venv.GetEnv(false, filepath.Dir(projectfile.Get().Path())) require.NoError(t, err) @@ -68,23 +67,3 @@ func TestInheritEnv_MultipleEquals(t *testing.T) { assert.Equal(t, value, updated[key]) } - -func TestSkipActivateRuntimeEnvironment(t *testing.T) { - setup(t) - defer teardown() - - os.Setenv(constants.DisableRuntime, "true") - defer os.Unsetenv(constants.DisableRuntime) - - project := projectfile.Project{} - dat := strings.TrimSpace(` -project: "https://platform.activestate.com/string/string?commitID=00010001-0001-0001-0001-000100010001" -languages: - - name: Python3`) - yaml.Unmarshal([]byte(dat), &project) - project.Persist() - - venv := New(nil) - err := venv.Activate() - require.NoError(t, err, "Should activate") -} diff --git a/locale/en-us.yaml b/locale/en-us.yaml index 5f73a27e8d..c33ceafb50 100644 --- a/locale/en-us.yaml +++ b/locale/en-us.yaml @@ -1650,6 +1650,14 @@ err_fetch_project: other: "Could not fetch details for project: {{.V0}}" err_set_default_branch: other: Could not update project field with branch, please manually set the `branch={{.V0}}` query parameter on the project field in your activestate.yaml. +artifact_progress_step_download: + other: Downloading +artifact_progress_step_unpack: + other: Unpacking +artifact_progress_step_install: + other: Installing +artifact_setup_failed: + other: Failed to install artifact {{.V0}} ({{.V1}}) err_fetch_branch: other: "Could not get branch [NOTICE]{{.V0}}[/RESET] for project" err_refresh_runtime: @@ -1662,4 +1670,4 @@ headless_notify: For more information, including how to merge these changes into an existing project, visit: [ACTIONABLE]{{.V1}}[/RESET]. browser_fallback: - other: "Could not open {{.V0}} in your browser.\nYou can copy and paste the following URL manually in the address line of your browser:\n[NOTICE]{{.V1}}[/RESET]" \ No newline at end of file + other: "Could not open {{.V0}} in your browser.\nYou can copy and paste the following URL manually in the address line of your browser:\n[NOTICE]{{.V1}}[/RESET]" diff --git a/pkg/platform/api/buildlogstream/streamer.go b/pkg/platform/api/buildlogstream/streamer.go index 78d9d13e85..8bfe03e560 100644 --- a/pkg/platform/api/buildlogstream/streamer.go +++ b/pkg/platform/api/buildlogstream/streamer.go @@ -5,6 +5,7 @@ import ( "github.com/go-openapi/strfmt" "github.com/gorilla/websocket" + "golang.org/x/net/context" "github.com/ActiveState/cli/internal/errs" "github.com/ActiveState/cli/internal/locale" @@ -135,3 +136,16 @@ func (r *Request) writeError(errCh chan error, err error) { r.msgHandler.BuildFinished() errCh <- err } + +func Connect(ctx context.Context) (*websocket.Conn, error) { + url := api.GetServiceURL(api.BuildLogStreamer) + header := make(http.Header) + header.Add("Origin", "https://"+url.Host) + + logging.Debug("Creating websocket for %s (origin: %s)", url.String(), header.Get("Origin")) + conn, _, err := websocket.DefaultDialer.DialContext(ctx, url.String(), header) + if err != nil { + return nil, errs.Wrap(err, "Could not create websocket dialer") + } + return conn, nil +} \ No newline at end of file diff --git a/pkg/platform/api/headchef/headchef.go b/pkg/platform/api/headchef/headchef.go index 5eb1b05536..a79455cfe9 100644 --- a/pkg/platform/api/headchef/headchef.go +++ b/pkg/platform/api/headchef/headchef.go @@ -23,6 +23,7 @@ import ( var ( ErrBuildResp = errs.New("Build responded with error") ErrBuildUnknownType = errs.New("Unknown build type") + ErrBuildFailedResp = errs.New("Build failed remotely") ) type BuildStatus struct { @@ -87,6 +88,10 @@ func (r *Client) RequestBuild(buildRequest *headchef_models.V1BuildRequest) *Bui return buildStatus } +func (r *Client) RequestBuildSync(buildRequest *headchef_models.V1BuildRequest) (BuildStatusEnum, *headchef_models.BuildStatusResponse, error) { + return r.reqBuildSync(buildRequest) +} + func NewBuildRequest(recipeID, orgID, projID strfmt.UUID, annotations BuildAnnotations) (*headchef_models.V1BuildRequest, error) { uid := strfmt.UUID("00010001-0001-0001-0001-000100010001") @@ -132,6 +137,69 @@ func (b *BuildParams) WriteToRequest(req runtime.ClientRequest, reg strfmt.Regis return nil } +type BuildStatusEnum int + +const ( + Accepted BuildStatusEnum = iota + Started + Completed + Failed + Error +) + +func (r *Client) reqBuildSync(buildReq *headchef_models.V1BuildRequest) (BuildStatusEnum, *headchef_models.BuildStatusResponse, error) { + startParams := headchef_operations.StartBuildV1Params{ + Context: context.Background(), + BuildRequest: buildReq, + HTTPClient: retryhttp.DefaultClient.StandardClient(), + } + + created, accepted, err := r.client.StartBuildV1(&startParams) + + switch { + case err != nil: + msg := err.Error() + if startErr, ok := err.(*headchef_operations.StartBuildV1Default); ok { + msg = *startErr.Payload.Message + } + return Error, nil, errs.Wrap(ErrBuildResp, msg) + case accepted != nil: + return Accepted, accepted.Payload, nil + case created != nil: + if created.Payload.Type == nil { + requestBytes, err := buildReq.MarshalBinary() + if err != nil { + requestBytes = []byte( + fmt.Sprintf("cannot marshal request: %v", err), + ) + } + msg := fmt.Sprintf( + "created response cannot be handled: nil type from request %q", + string(requestBytes), + ) + return Error, nil, errs.New("Payload type was nil, message: %s", msg) + } + payloadType := *created.Payload.Type + + switch payloadType { + case headchef_models.BuildStatusResponseTypeBuildCompleted: + return Completed, created.Payload, nil + case headchef_models.BuildStatusResponseTypeBuildFailed: + return Failed, created.Payload, errs.Wrap(ErrBuildFailedResp, created.Payload.Message) + case headchef_models.BuildStatusResponseTypeBuildStarted: + return Started, created.Payload, nil + default: + msg := fmt.Sprintf( + "created response cannot be handled: unknown type %q", + payloadType, + ) + return Error, nil, locale.WrapError(ErrBuildUnknownType, msg) + } + default: + return Error, nil, errs.New("no response") + } +} + func (r *Client) reqBuild(buildReq *headchef_models.V1BuildRequest, buildStatus *BuildStatus) { startParams := headchef_operations.StartBuildV1Params{ Context: context.Background(), diff --git a/pkg/platform/model/buildrequest.go b/pkg/platform/model/buildrequest.go index b6e3f385ae..965cf8b950 100644 --- a/pkg/platform/model/buildrequest.go +++ b/pkg/platform/model/buildrequest.go @@ -1,34 +1,44 @@ package model import ( + "github.com/ActiveState/cli/internal/constants" + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/pkg/platform/api/headchef" "github.com/ActiveState/cli/pkg/platform/api/headchef/headchef_models" - mono_models "github.com/ActiveState/cli/pkg/platform/api/mono/mono_models" - "github.com/ActiveState/cli/pkg/platform/authentication" + "github.com/ActiveState/cli/pkg/platform/api/mono/mono_models" "github.com/go-openapi/strfmt" ) -func NewHeadChefRequester(pj *mono_models.Project) (*headchef_models.V1Requester, error) { - userID := strfmt.UUID("00010001-0001-0001-0001-000100010001") - auth := authentication.Get() - if auth.Authenticated() { - userID = *auth.UserID() +func RequestBuild(recipeID, commitID strfmt.UUID, owner, project string) (headchef.BuildStatusEnum, *headchef_models.BuildStatusResponse, error) { + var platProj *mono_models.Project + if owner != "" && project != "" { + var err error + platProj, err = FetchProjectByName(owner, project) + if err != nil { + return headchef.Error, nil, locale.WrapError(err, "build_request_get_project_err", "Could not find project {{.V0}}/{{.V1}} on ActiveState Platform.", owner, project) + } } - return &headchef_models.V1Requester{ - OrganizationID: &pj.OrganizationID, - ProjectID: &pj.ProjectID, - UserID: userID, - }, nil + + buildAnnotations := headchef.BuildAnnotations{ + CommitID: commitID.String(), + Project: project, + Organization: owner, + } + + orgID := strfmt.UUID(constants.ValidZeroUUID) + projectID := strfmt.UUID(constants.ValidZeroUUID) + if platProj != nil { + orgID = platProj.OrganizationID + projectID = platProj.ProjectID + } + + return requestBuild(recipeID, orgID, projectID, buildAnnotations) } -func NewBuildRequest(pj *mono_models.Project) (*headchef_models.V1BuildRequest, error) { - requester, err := NewHeadChefRequester(pj) +func requestBuild(recipeID, orgID, projID strfmt.UUID, annotations headchef.BuildAnnotations) (headchef.BuildStatusEnum, *headchef_models.BuildStatusResponse, error) { + buildRequest, err := headchef.NewBuildRequest(recipeID, orgID, projID, annotations) if err != nil { - return nil, err + return headchef.Error, nil, err } - - format := "raw" - return &headchef_models.V1BuildRequest{ - Requester: requester, - Format: &format, - }, nil + return headchef.InitClient().RequestBuildSync(buildRequest) } diff --git a/pkg/platform/model/recipe.go b/pkg/platform/model/recipe.go index e71480ed7c..52bdd10946 100644 --- a/pkg/platform/model/recipe.go +++ b/pkg/platform/model/recipe.go @@ -18,7 +18,6 @@ import ( "github.com/ActiveState/cli/pkg/platform/api/inventory" iop "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_client/inventory_operations" "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models" - "github.com/ActiveState/cli/pkg/platform/api/mono/mono_models" "github.com/ActiveState/cli/pkg/platform/authentication" ) @@ -50,7 +49,7 @@ func FetchRawRecipeForCommitAndPlatform(commitID strfmt.UUID, owner, project str return fetchRawRecipe(commitID, owner, project, &platform) } -func ResolveRecipe(commitID strfmt.UUID, owner, projectName string, project *mono_models.Project) (*inventory_models.Recipe, error) { +func ResolveRecipe(commitID strfmt.UUID, owner, projectName string) (*inventory_models.Recipe, error) { if commitID == "" { return nil, locale.NewError("err_no_commit", "Missing Commit ID") } diff --git a/pkg/platform/runtime/ARCHITECTURE.md b/pkg/platform/runtime/ARCHITECTURE.md new file mode 100644 index 0000000000..1f5d9f522c --- /dev/null +++ b/pkg/platform/runtime/ARCHITECTURE.md @@ -0,0 +1,90 @@ +# Improved runtime architecture + +Package runtime provides functions to setup and use a runtime downloaded from +the ActiveState Platform. + +## Usage + +The general usage pattern is as follows: + + rt, err := runtime.New(target) + if err != nil { + if !runtime.IsNeedsUpdateError(err) { + return err + } + if err = rt.Update(messageHandler); err != nil { + return err + } + } + + env, err = r.Environ(true, projectDir) + if err != nil {...} + +## Package structure + +The runtime package consists of the following sub-packages: + + pkg/platform/runtime + ├── artifact + ├── envdef + ├── model + ├── setup + │   ├── buildlog + │   ├── events + │   └── implementations + │   ├── alternative + │   └── camel + └── store + +### Toplevel package + +The toplevel package `runtime` comprises functions to set up a runtime that +is already installed locally. + +**Invariant**: + +- No communication to the API backend is performed in this package + +### Artifact package + +The `artifact` package provides an abstraction of artifact information that +can be generated from recipes or the build status response. The idea is to +address the use-case where we want to meta-data like the dependency tree +about the current project. + +### Model package + +The package `model` implements tightly scoped methods to communicate with the +Platform API. The model implementation should be simple to mock to support unit tests. + +### Envdef package + + +The package `envdef` implements methods to parse, merge and apply environment definitions that are shipped with artifact files. + +### Setup package + +The setup package provides functionality to actually install / set up a +runtime locally. The main struct is called `setup.Setup`. + +**Invariants**: + +- It is the only package where the `model` package is used. +- When `setup/Setup.Update()` finishes successfully, the runtime can +be loaded from the disk without further Platform communication. +- This package does not comprise build engine specific code. It is hidden +behind the `setup/implementations` interface + +### Setup.Events package + +The `events` package in the `setup` directory provides structs to handle setup events, which can be sent from parallel running threads. The `RuntimeEventHandler` translates these events to commands for "digester" implementations. The default digesters are implemented in the `runbits.changesummary` and `runbits.progressbar` packages. + +### Runtime implementations + +As we have two (maybe more) flavors of builds (Camel and Alternative), we split out the specific implementations for how to set them up in an implementation package called `implementations`. + +The actual runtime implementations are in the sub-packages `alternative` and `camel`. + +**Invariant**: + +- The functions in these package are not calling any model functions. diff --git a/pkg/platform/runtime/alternative.go b/pkg/platform/runtime/alternative.go deleted file mode 100644 index d3ebd9a527..0000000000 --- a/pkg/platform/runtime/alternative.go +++ /dev/null @@ -1,389 +0,0 @@ -package runtime - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "regexp" - "sort" - "strings" - - "github.com/go-openapi/strfmt" - "github.com/thoas/go-funk" - - "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/errs" - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/hash" - "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/logging" - "github.com/ActiveState/cli/internal/unarchiver" - "github.com/ActiveState/cli/pkg/platform/runtime/envdef" -) - -var _ EnvGetter = &AlternativeEnv{} -var _ Assembler = &AlternativeInstall{} - -// AlternativeEnv holds all the meta-data necessary to activate a runtime -// environment for an Alternative build -type AlternativeEnv struct { - runtimeDir string - cache []artifactCacheMeta -} - -// AlternativeInstall provides methods to download and install alternative artifacts on the local machine -type AlternativeInstall struct { - AlternativeEnv - tempInstallDir string - artifactsRequested []*HeadChefArtifact - recipeID strfmt.UUID -} - -type artifactCacheMeta struct { - ArtifactID strfmt.UUID - Files []string -} - -// NewAlternativeEnv returns a new alternative runtime environment -func NewAlternativeEnv(cacheDir string) (*AlternativeEnv, error) { - ae := &AlternativeEnv{ - runtimeDir: cacheDir, - } - - var err error - ae.cache, err = ae.artifactCache() - if err != nil { - return ae, &ErrInvalidArtifact{locale.WrapError(err, "err_artifact_cache", "Could not grab artifact cache")} - } - - return ae, nil - -} - -// NewAlternativeInstall creates a new installation for alternative artifacts -// It filters the provided artifact list for useable artifacts -// The recipeID is needed to define the installation directory -func NewAlternativeInstall(cacheDir string, artifacts []*HeadChefArtifact, recipeID strfmt.UUID) (*AlternativeInstall, error) { - ae, err := NewAlternativeEnv(cacheDir) - if err != nil { - return nil, err - } - - ai := &AlternativeInstall{ - AlternativeEnv: *ae, - recipeID: recipeID, - } - for _, artf := range artifacts { - - if artf.URI == "" { - continue - } - filename := filepath.Base(artf.URI.String()) - if !strings.HasSuffix(filename, ai.InstallerExtension()) { - continue - } - - // For now we are excluding terminal artifacts ie., the artifacts that a packaging step would produce. - // Right now, these artifacts are empty anyways... - if artf.IngredientVersionID == "" { - continue - } - - ai.artifactsRequested = append(ai.artifactsRequested, artf) - } - - if len(ai.artifactsRequested) == 0 { - return ai, &ErrInvalidArtifact{locale.NewError("err_no_valid_artifact")} - } - - return ai, nil -} - -// InstallerExtension is always .tar.gz -func (ai *AlternativeInstall) InstallerExtension() string { - return ".tar.gz" -} - -// Unarchiver always returns an unarchiver for gzipped tarballs -func (ai *AlternativeInstall) Unarchiver() unarchiver.Unarchiver { - return unarchiver.NewTarGz() -} - -// BuildEngine always returns Alternative -func (ai *AlternativeInstall) BuildEngine() BuildEngine { - return Alternative -} - -func (ae *AlternativeEnv) artifactCache() ([]artifactCacheMeta, error) { - cache := []artifactCacheMeta{} - jsonFile := filepath.Join(ae.runtimeEnvBaseDir(), constants.ArtifactCacheFileName) - if !fileutils.FileExists(jsonFile) { - return cache, nil - } - - jsonBlob, err := fileutils.ReadFile(jsonFile) - if err != nil { - return cache, errs.Wrap(err, "Could not read artifact cache file") - } - if err := json.Unmarshal(jsonBlob, &cache); err != nil { - return cache, errs.Wrap(err, "Could not unmarshal artifact cache file") - } - - return cache, nil -} - -func (ai *AlternativeInstall) storeArtifactCache() error { - // Save artifact cache information - jsonBlob, err := json.Marshal(ai.cache) - if err != nil { - return errs.Wrap(err, "Failed to marshal artifact cache information") - } - jsonFile := filepath.Join(ai.runtimeEnvBaseDir(), constants.ArtifactCacheFileName) - if err := fileutils.WriteFile(jsonFile, jsonBlob); err != nil { - return errs.Wrap(err, "Failed to write artifact cache information") - } - return nil -} - -// ArtifactsToDownload returns the artifacts that we need to download -// for this project. -func (ai *AlternativeInstall) ArtifactsToDownload() []*HeadChefArtifact { - return artifactsToDownload(artifactCacheToUuids(ai.cache), ai.artifactsRequested) -} - -// ArtifactsToDownload returns the artifacts that we need to download -// for this project. -func artifactsToDownload(artifactCacheUuids []strfmt.UUID, artifactsRequested []*HeadChefArtifact) []*HeadChefArtifact { - downloadArtfs := []*HeadChefArtifact{} - for _, v := range artifactsRequested { - if v.ArtifactID != nil && !funk.Contains(artifactCacheUuids, *v.ArtifactID) { - downloadArtfs = append(downloadArtfs, v) - } - } - return downloadArtfs -} - -// IsInstalled checks if the merged runtime environment definition file exists and whether any artifacts need to be -// downloaded or deleted -func (ai *AlternativeInstall) IsInstalled() bool { - download := artifactsToDownload(artifactCacheToUuids(ai.cache), ai.artifactsRequested) - _, delete := artifactsToKeepAndDelete(ai.cache, artifactsToUuids(ai.artifactsRequested)) - - // runtime environment definition file - red := filepath.Join(ai.runtimeEnvBaseDir(), constants.RuntimeDefinitionFilename) - return fileutils.FileExists(red) && len(download) == 0 && len(delete) == 0 -} - -func (ai *AlternativeInstall) downloadDirectory(artf *HeadChefArtifact) string { - return filepath.Join(ai.runtimeDir, constants.LocalRuntimeEnvironmentDirectory, "artifacts", hash.ShortHash(artf.ArtifactID.String())) -} - -// DownloadDirectory returns the local directory where the artifact files should -// be downloaded to -func (ai *AlternativeInstall) DownloadDirectory(artf *HeadChefArtifact) (string, error) { - p := ai.downloadDirectory(artf) - err := fileutils.MkdirUnlessExists(p) - return p, err -} - -// PreInstall ensures that the final installation directory exists, and is useable -func (ai *AlternativeInstall) PreInstall() error { - if fileutils.FileExists(ai.runtimeDir) { - // install-dir exists, but is a regular file - return &ErrInstallDirInvalid{locale.NewInputError("installer_err_installdir_isfile", "", ai.runtimeDir)} - } - - if !fileutils.DirExists(ai.runtimeDir) { - if err := fileutils.Mkdir(ai.runtimeDir); err != nil { - return err - } - - // No need to delete files if this is a new dir - return nil - } - - // Delete artifacts that are no longer part of the request - var delete []artifactCacheMeta - ai.cache, delete = artifactsToKeepAndDelete(ai.cache, artifactsToUuids(ai.artifactsRequested)) - for _, v := range delete { - for _, file := range v.Files { - if !fileutils.TargetExists(file) { - continue // don't care it's already deleted (might have been deleted by another artifact that supplied the same file) - } - if err := os.Remove(file); err != nil { - return locale.WrapError(err, "err_rm_artf", "", "Could not remove old package file at {{.V0}}.", file) - } - } - } - - if err := ai.storeArtifactCache(); err != nil { - return locale.WrapError(err, "err_store_artf", "", "Could not store artifact cache.") - } - - return nil -} - -func artifactsToKeepAndDelete(artifactCache []artifactCacheMeta, artifactRequestUuids []strfmt.UUID) (keep []artifactCacheMeta, delete []artifactCacheMeta) { - keep = []artifactCacheMeta{} - delete = []artifactCacheMeta{} - for _, v := range artifactCache { - if funk.Contains(artifactRequestUuids, v.ArtifactID) { - keep = append(keep, v) - continue - } - delete = append(delete, v) - } - return keep, delete -} - -// PreUnpackArtifact does nothing -func (ai *AlternativeInstall) PreUnpackArtifact(artf *HeadChefArtifact) error { - return nil -} - -// PostUnpackArtifact is called after the artifacts are unpacked -// In this steps, the artifact contents are moved to its final destination. -// This step also sets up the runtime environment variables. -func (ai *AlternativeInstall) PostUnpackArtifact(artf *HeadChefArtifact, tmpRuntimeDir string, archivePath string, cb func()) error { - envDef, err := envdef.NewEnvironmentDefinition(filepath.Join(tmpRuntimeDir, constants.RuntimeDefinitionFilename)) - if err != nil { - return err - } - constants := envdef.NewConstants(ai.runtimeDir) - envDef = envDef.ExpandVariables(constants) - err = envDef.ApplyFileTransforms(tmpRuntimeDir, constants) - if err != nil { - return locale.WrapError(err, "runtime_alternative_file_transforms_err", "", "Could not apply necessary file transformations after unpacking") - } - - artMeta := artifactCacheMeta{*artf.ArtifactID, []string{}} - onMoveFile := func(fromPath, toPath string) { - if fileutils.IsDir(toPath) { - artMeta.Files = append(artMeta.Files, fileutils.ListDir(toPath, false)...) - } else { - artMeta.Files = append(artMeta.Files, toPath) - } - cb() - } - - // move files to the final installation directory - err = fileutils.MoveAllFilesRecursively( - filepath.Join(tmpRuntimeDir, envDef.InstallDir), - ai.runtimeDir, onMoveFile) - if err != nil { - return err - } - - ai.cache = append(ai.cache, artMeta) - - // move the runtime.json to the runtime environment directory - artifactIndex := funk.IndexOf(ai.artifactsRequested, artf) - if artifactIndex == -1 { - logging.Error("Could not write runtime.json: artifact order for %s unknown", artf.ArtifactID.String()) - return locale.NewError("runtime_alternative_failed_artifact_order", "", "Could not write runtime.json file: internal error") - } - - err = fileutils.MkdirUnlessExists(ai.runtimeEnvBaseDir()) - if err != nil { - return err - } - - // copy the runtime environment file to the installation directory. - // The file name is based on the artifact order index, such that we can - // ensure the environment definition files can be read in the correct order. - err = envDef.WriteFile(filepath.Join(ai.runtimeEnvBaseDir(), fmt.Sprintf("%06d.json", artifactIndex))) - if err != nil { - return locale.WrapError(err, "runtime_alternative_failed_destination", "Installation failed due to failure to write to directory {{.V0}}", ai.runtimeEnvBaseDir()) - } - - if err := os.RemoveAll(tmpRuntimeDir); err != nil { - logging.Error("removing tmpdir %s after unpacking runtime: %v", tmpRuntimeDir, err) - } - if err := os.Remove(archivePath); err != nil { - logging.Error("removing archive %s after unpacking runtime: %v", archivePath, err) - } - return nil -} - -func (ae *AlternativeEnv) runtimeEnvBaseDir() string { - return filepath.Join(ae.runtimeDir, constants.LocalRuntimeEnvironmentDirectory) -} - -// PostInstall merges all runtime environment definition files for the artifacts in order -// This function expects files named `"00001.json", "00002.json", ...` that are installed in the -// PostUnpackArtifact step. It sorts them by name, parses them and merges the EnvironmentDefinition -// -// The merged environment definition is cached and written back to `/runtime.json`. -// This file also serves as a marker that the installation was successfully completed. -// -// It also checks if a PPM shim needs to be installed -func (ai *AlternativeInstall) PostInstall() error { - mergedRuntimeDefinitionFile := filepath.Join(ai.runtimeEnvBaseDir(), constants.RuntimeDefinitionFilename) - var rtGlobal *envdef.EnvironmentDefinition - - files, err := ioutil.ReadDir(ai.runtimeEnvBaseDir()) - if err != nil { - return errs.Wrap(err, "Could not find the runtime environment directory") - } - - filenames := make([]string, 0, len(files)) - for _, f := range files { - if ok, _ := regexp.MatchString("[0-9]{6}.json", f.Name()); ok { - filenames = append(filenames, f.Name()) - } - } - sort.Strings(filenames) - for _, fn := range filenames { - rtPath := filepath.Join(ai.runtimeEnvBaseDir(), fn) - rt, err := envdef.NewEnvironmentDefinition(rtPath) - if err != nil { - return errs.Wrap(err, "Failed to parse runtime environment definition file at %s", rtPath) - } - if rtGlobal == nil { - rtGlobal = rt - continue - } - rtGlobal, err = rtGlobal.Merge(rt) - if err != nil { - return errs.Wrap(err, "Failed merge environment definitions") - } - } - - if rtGlobal == nil { - return errs.New("No runtime environment definition file at %s", ai.runtimeDir) - } - - if activePerlPath := rtGlobal.FindBinPathFor(constants.ActivePerlExecutable); activePerlPath != "" { - err = installPPMShim(activePerlPath) - if err != nil { - return errs.Wrap(err, "Failed to install the PPM shim command at %s", activePerlPath) - } - } - - err = rtGlobal.WriteFile(mergedRuntimeDefinitionFile) - if err != nil { - return errs.Wrap(err, "Failed to write merged runtime definition file at %s", mergedRuntimeDefinitionFile) - } - - if err := ai.storeArtifactCache(); err != nil { - return errs.Wrap(err, "Could not store artifact cache") - } - - return nil -} - -// GetEnv returns the environment variable configuration for this build -func (ae *AlternativeEnv) GetEnv(inherit bool, _ string) (map[string]string, error) { - mergedRuntimeDefinitionFile := filepath.Join(ae.runtimeEnvBaseDir(), constants.RuntimeDefinitionFilename) - rt, err := envdef.NewEnvironmentDefinition(mergedRuntimeDefinitionFile) - if err != nil { - return nil, locale.WrapError( - err, "err_no_environment_definition", - "Your installation seems corrupted.\nPlease try to re-run this command, as it may fix the problem. If the problem persists, please report it in our forum: {{.V0}}", - constants.ForumsURL, - ) - } - return rt.GetEnv(inherit), nil -} diff --git a/pkg/platform/runtime/alternative_internal_test.go b/pkg/platform/runtime/alternative_internal_test.go deleted file mode 100644 index d19e57a96e..0000000000 --- a/pkg/platform/runtime/alternative_internal_test.go +++ /dev/null @@ -1,162 +0,0 @@ -package runtime - -import ( - "reflect" - "testing" - - "github.com/go-openapi/strfmt" -) - -func headchefArtifactByUUID(uuids string) *HeadChefArtifact { - uuid := strfmt.UUID(uuids) - return &HeadChefArtifact{ - ArtifactID: &uuid, - IngredientVersionID: strfmt.UUID(uuids), - URI: strfmt.URI("https://" + uuids + ".tld/file.tar.gz"), - } -} - -func Test_artifactsToDownload(t *testing.T) { - type args struct { - artifactCacheUuids []strfmt.UUID - artifactsRequested []*HeadChefArtifact - } - tests := []struct { - name string - args args - want []strfmt.UUID - }{ - { - "No Cache", - args{ - []strfmt.UUID{}, - []*HeadChefArtifact{ - headchefArtifactByUUID("00000000-0000-0000-0000-000000000000"), - headchefArtifactByUUID("00000000-0000-0000-0000-000000000001"), - }, - }, - []strfmt.UUID{ - strfmt.UUID("00000000-0000-0000-0000-000000000000"), - strfmt.UUID("00000000-0000-0000-0000-000000000001"), - }, - }, - { - "Addition", - args{ - []strfmt.UUID{ - strfmt.UUID("00000000-0000-0000-0000-000000000000"), - }, - []*HeadChefArtifact{ - headchefArtifactByUUID("00000000-0000-0000-0000-000000000000"), - headchefArtifactByUUID("00000000-0000-0000-0000-000000000001"), - }, - }, - []strfmt.UUID{ - strfmt.UUID("00000000-0000-0000-0000-000000000001"), - }, - }, - { - "No Changes", - args{ - []strfmt.UUID{ - strfmt.UUID("00000000-0000-0000-0000-000000000000"), - strfmt.UUID("00000000-0000-0000-0000-000000000001"), - }, - []*HeadChefArtifact{ - headchefArtifactByUUID("00000000-0000-0000-0000-000000000000"), - headchefArtifactByUUID("00000000-0000-0000-0000-000000000001"), - }, - }, - []strfmt.UUID{}, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got := artifactsToUuids(artifactsToDownload(tt.args.artifactCacheUuids, tt.args.artifactsRequested)) - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("artifactsToDownload() = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_artifactsToKeepAndDelete(t *testing.T) { - type args struct { - artifactCache []artifactCacheMeta - artifactRequestUuids []strfmt.UUID - } - tests := []struct { - name string - args args - wantKeep []strfmt.UUID - wantDelete []strfmt.UUID - }{ - { - "Keep 1, Delete 1", - args{ - []artifactCacheMeta{ - artifactCacheMeta{ArtifactID: strfmt.UUID("00000000-0000-0000-0000-000000000000")}, - artifactCacheMeta{ArtifactID: strfmt.UUID("00000000-0000-0000-0000-000000000001")}, - }, - []strfmt.UUID{ - strfmt.UUID("00000000-0000-0000-0000-000000000001"), - }, - }, - []strfmt.UUID{ - strfmt.UUID("00000000-0000-0000-0000-000000000001"), - }, - []strfmt.UUID{ - strfmt.UUID("00000000-0000-0000-0000-000000000000"), - }, - }, - { - "Keep all", - args{ - []artifactCacheMeta{ - artifactCacheMeta{ArtifactID: strfmt.UUID("00000000-0000-0000-0000-000000000000")}, - artifactCacheMeta{ArtifactID: strfmt.UUID("00000000-0000-0000-0000-000000000001")}, - }, - []strfmt.UUID{ - strfmt.UUID("00000000-0000-0000-0000-000000000000"), - strfmt.UUID("00000000-0000-0000-0000-000000000001"), - }, - }, - []strfmt.UUID{ - strfmt.UUID("00000000-0000-0000-0000-000000000000"), - strfmt.UUID("00000000-0000-0000-0000-000000000001"), - }, - []strfmt.UUID{}, - }, - { - "Delete all", - args{ - []artifactCacheMeta{ - artifactCacheMeta{ArtifactID: strfmt.UUID("00000000-0000-0000-0000-000000000000")}, - artifactCacheMeta{ArtifactID: strfmt.UUID("00000000-0000-0000-0000-000000000001")}, - }, - []strfmt.UUID{ - strfmt.UUID("00000000-0000-0000-0000-000000000003"), - strfmt.UUID("00000000-0000-0000-0000-000000000004"), - }, - }, - []strfmt.UUID{}, - []strfmt.UUID{ - strfmt.UUID("00000000-0000-0000-0000-000000000000"), - strfmt.UUID("00000000-0000-0000-0000-000000000001"), - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - gotKeep, gotDelete := artifactsToKeepAndDelete(tt.args.artifactCache, tt.args.artifactRequestUuids) - gotKeepUuids := artifactCacheToUuids(gotKeep) - gotDeleteUuids := artifactCacheToUuids(gotDelete) - if !reflect.DeepEqual(gotKeepUuids, tt.wantKeep) { - t.Errorf("artifactsToKeepAndDelete() gotKeepUuids = %v, want %v", gotKeepUuids, tt.wantKeep) - } - if !reflect.DeepEqual(gotDeleteUuids, tt.wantDelete) { - t.Errorf("artifactsToKeepAndDelete() gotDeleteUuids = %v, want %v", gotDeleteUuids, tt.wantDelete) - } - }) - } -} diff --git a/pkg/platform/runtime/alternative_test.go b/pkg/platform/runtime/alternative_test.go deleted file mode 100644 index 63dba68246..0000000000 --- a/pkg/platform/runtime/alternative_test.go +++ /dev/null @@ -1,202 +0,0 @@ -package runtime_test - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/go-openapi/strfmt" - "github.com/stretchr/testify/suite" - - "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/progress/mock" - "github.com/ActiveState/cli/pkg/platform/runtime" - "github.com/ActiveState/cli/pkg/platform/runtime/envdef" -) - -type AlternativeRuntimeTestSuite struct { - suite.Suite - - cacheDir string - recipeID strfmt.UUID -} - -func (suite *AlternativeRuntimeTestSuite) BeforeTest(suiteName, testName string) { - suite.recipeID = strfmt.UUID("00020002-0002-0002-0002-0002-00020000200002") - var err error - suite.cacheDir, err = ioutil.TempDir("", "cli-alternative-cache-dir") - suite.Require().NoError(err, "cache dir created") -} - -func (suite *AlternativeRuntimeTestSuite) AfterTest(suiteName, testName string) { - err := os.RemoveAll(suite.cacheDir) - suite.Assert().NoError(err, "cache dir removed") -} - -func (suite *AlternativeRuntimeTestSuite) mockEnvDefs(num int) (defs []*envdef.EnvironmentDefinition, merged *envdef.EnvironmentDefinition) { - defs = make([]*envdef.EnvironmentDefinition, 0, num) - merged = &envdef.EnvironmentDefinition{Env: []envdef.EnvironmentVariable{}, InstallDir: "installdir"} - for i := 0; i < num; i++ { - def := &envdef.EnvironmentDefinition{ - Env: []envdef.EnvironmentVariable{ - { - Name: "COMMON", - Values: []string{fmt.Sprintf("%02d", i)}, - Inherit: false, - }, - { - Name: fmt.Sprintf("VAR%02d", i), - Values: []string{"set"}, - Inherit: false, - }, - }, - InstallDir: "installdir", - } - - var err error - merged, err = merged.Merge(def) - suite.Require().NoError(err) - - defs = append(defs, def) - } - return defs, merged -} - -func (suite *AlternativeRuntimeTestSuite) mockTemporaryRuntimeDirs(defs []*envdef.EnvironmentDefinition) []string { - tmpRuntimeBase := filepath.Join(suite.cacheDir, "temp-runtime-base") - dirs := make([]string, 0, len(defs)) - - for i, def := range defs { - tmpRuntimeDir := filepath.Join(tmpRuntimeBase, fmt.Sprintf("%02d", i)) - err := fileutils.MkdirUnlessExists(tmpRuntimeDir) - suite.Require().NoError(err) - - // create runtime.json - err = def.WriteFile(filepath.Join(tmpRuntimeDir, constants.RuntimeDefinitionFilename)) - suite.Require().NoError(err) - - // create one installation file - err = fileutils.MkdirUnlessExists(filepath.Join(tmpRuntimeDir, "installdir", "bin")) - suite.Require().NoError(err) - - err = ioutil.WriteFile(filepath.Join(tmpRuntimeDir, "installdir", "bin", fmt.Sprintf("executable%02d", i)), []byte{}, 0555) - suite.Require().NoError(err) - - dirs = append(dirs, tmpRuntimeDir) - } - return dirs -} - -func (suite *AlternativeRuntimeTestSuite) Test_GetEnv() { - numArtifacts := 2 - artifacts := mockFetchArtifactsResult(withRegularArtifacts(numArtifacts)) - ar, err := runtime.NewAlternativeInstall(suite.cacheDir, artifacts.Artifacts, artifacts.RecipeID) - suite.Require().NoError(err) - - suite.Require().NoError(err) - envDefs, merged := suite.mockEnvDefs(numArtifacts) - - runtimeDirs := suite.mockTemporaryRuntimeDirs(envDefs) - - for i := numArtifacts - 1; i >= 0; i-- { - counter := mock.NewMockIncrementer() - err := ar.PostUnpackArtifact(artifacts.Artifacts[i], runtimeDirs[i], "", func() { counter.Increment() }) - suite.Assert().NoError(err) - suite.Assert().Equal(1, counter.Count, "one executable moved to final installation directory") - } - - expectedEnv := merged.GetEnv(true) - - mergedFilePath := filepath.Join(suite.cacheDir, constants.LocalRuntimeEnvironmentDirectory, constants.RuntimeDefinitionFilename) - firstEnvDefPath := filepath.Join(suite.cacheDir, constants.LocalRuntimeEnvironmentDirectory, fmt.Sprintf("%06d.json", 0)) - - suite.Assert().False(fileutils.FileExists(mergedFilePath)) - // installation complete marker is missing - env, err := ar.GetEnv(true, "") - suite.Require().Error(err, "installation complete marker is missing") - - err = ar.PostInstall() - suite.Require().NoError(err, "merged runtime environment definition is created") - suite.Assert().True(fileutils.FileExists(mergedFilePath)) - - env, err = ar.GetEnv(true, "") - suite.Require().NoError(err) - - suite.Assert().Equal(expectedEnv, env) - err = os.Remove(firstEnvDefPath) - suite.Assert().NoError(err, "removing cached runtime definition file for first artifact") - - // This should still work, as we have cached the merged result by now - env, err = ar.GetEnv(true, "") - suite.Require().NoError(err) - suite.Assert().Equal(expectedEnv, env) -} - -func (suite *AlternativeRuntimeTestSuite) Test_InitializationFailure() { - cases := []struct { - name string - option artifactsResultMockOption - }{ - {"filter empty URIs", withURIArtifact("")}, - {"filter invalid URIs", withURIArtifact("https://test.tld/artifact.invalid")}, - {"filter terminal artifacts", withTerminalArtifacts(1)}, - } - - for _, tc := range cases { - suite.Run(tc.name, func() { - artifactsResult := mockFetchArtifactsResult(tc.option) - _, err := runtime.NewAlternativeInstall(suite.cacheDir, artifactsResult.Artifacts, artifactsResult.RecipeID) - errt := &runtime.ErrInvalidArtifact{} - suite.Error(err, &errt) - }) - - } -} - -func (suite *AlternativeRuntimeTestSuite) Test_PreInstall() { - cases := []struct { - name string - prepFunc func(installDir string) - expectedError error - }{ - {"InstallationDirectoryIsFile", func(installDir string) { - baseDir := filepath.Dir(installDir) - err := fileutils.MkdirUnlessExists(baseDir) - suite.Require().NoError(err) - err = ioutil.WriteFile(installDir, []byte{}, 0666) - suite.Require().NoError(err) - }, &runtime.ErrInstallDirInvalid{}}, - {"InstallationDirectoryIsNotEmpty", func(installDir string) { - err := fileutils.MkdirUnlessExists(installDir) - suite.Require().NoError(err) - err = ioutil.WriteFile(filepath.Join(installDir, "dummy"), []byte{}, 0666) - suite.Require().NoError(err) - }, nil}, - {"InstallationDirectoryIsOkay", func(installDir string) {}, nil}, - } - - for _, tc := range cases { - suite.Run(tc.name, func() { - artifactsRes := mockFetchArtifactsResult(withRegularArtifacts(2)) - ar, err := runtime.NewAlternativeInstall(suite.cacheDir, artifactsRes.Artifacts, artifactsRes.RecipeID) - suite.Require().NoError(err) - - os.RemoveAll(suite.cacheDir) - defer os.RemoveAll(suite.cacheDir) - - tc.prepFunc(suite.cacheDir) - err = ar.PreInstall() - if tc.expectedError == nil { - suite.Require().NoError(err) - } else { - suite.ErrorAs(err, &tc.expectedError) - } - }) - } -} -func Test_AlternativeRuntimeTestSuite(t *testing.T) { - suite.Run(t, new(AlternativeRuntimeTestSuite)) -} diff --git a/pkg/platform/runtime/artifact/artifact.go b/pkg/platform/runtime/artifact/artifact.go new file mode 100644 index 0000000000..13018fbec6 --- /dev/null +++ b/pkg/platform/runtime/artifact/artifact.go @@ -0,0 +1,9 @@ +package artifact + +import ( + "github.com/go-openapi/strfmt" +) + +// ArtifactID represents an artifact ID +type ArtifactID = strfmt.UUID + diff --git a/pkg/platform/runtime/artifact/artifact_test.go b/pkg/platform/runtime/artifact/artifact_test.go new file mode 100644 index 0000000000..f498d070ae --- /dev/null +++ b/pkg/platform/runtime/artifact/artifact_test.go @@ -0,0 +1,321 @@ +package artifact + +import ( + "testing" + + "github.com/go-openapi/strfmt" + "github.com/stretchr/testify/assert" + + "github.com/ActiveState/cli/pkg/platform/runtime/testhelper" +) + +func version(s string) *string { + return &s +} + +// TestArtifactsFromRecipe ensures that we are able to parse a recipe correctly +// This is probably good to do, as it is more complicated +func TestArtifactsFromRecipe(t *testing.T) { + tests := []struct { + Name string + recipeName string + expected ArtifactRecipeMap + }{ + { + "camel recipe", + "camel", + ArtifactRecipeMap{ + strfmt.UUID("bdd5642b-928c-5770-9e12-5816c9676960"): ArtifactRecipe{ + Name: "python", Namespace: "language", ArtifactID: strfmt.UUID("bdd5642b-928c-5770-9e12-5816c9676960"), Dependencies: nil, RequestedByOrder: true, Version: version("3.7.4")}, + strfmt.UUID("decfc04f-5770-5663-8d00-e029402e6917"): ArtifactRecipe{ + Name: "json2", Namespace: "language/python", ArtifactID: strfmt.UUID("decfc04f-5770-5663-8d00-e029402e6917"), Dependencies: []ArtifactID{"bdd5642b-928c-5770-9e12-5816c9676960"}, RequestedByOrder: true, Version: version("0.4.0")}, + strfmt.UUID("e6997088-7854-5498-8c57-afbe4343036a"): ArtifactRecipe{ + Name: "wheel", Namespace: "language/python", ArtifactID: strfmt.UUID("e6997088-7854-5498-8c57-afbe4343036a"), Dependencies: []ArtifactID{"bdd5642b-928c-5770-9e12-5816c9676960"}, RequestedByOrder: false, Version: version("0.35.1")}, + }, + }, + { + "alternative recipe", + "perl-alternative-base", + ArtifactRecipeMap{ + strfmt.UUID("b30ab2e5-4074-572c-8146-da692b1c9e45"): ArtifactRecipe{ + Name: "perl", Namespace: "language", ArtifactID: strfmt.UUID("b30ab2e5-4074-572c-8146-da692b1c9e45"), Dependencies: nil, RequestedByOrder: true, Version: version("5.32.1")}, + }, + }, + { + "alternative with bundles", + "perl-alternative-one-bundle", + ArtifactRecipeMap{ + strfmt.UUID("c894fa23-0416-556d-9ca5-fdf9375595bc"): ArtifactRecipe{ + Name: "Testing", Namespace: "bundles/perl", ArtifactID: strfmt.UUID("c894fa23-0416-556d-9ca5-fdf9375595bc"), Dependencies: []ArtifactID{"288aa0db-c0e4-55e7-8f67-fc2da409be70", "5ad88c8a-bc8f-50a0-9f61-74856cd28017", "30dc7965-0a69-5686-831a-e563fa73a98c", "8c2f830d-1b31-5448-a0a4-aa9d8fcacc4b"}, RequestedByOrder: true, Version: version("1.00")}, + strfmt.UUID("b30ab2e5-4074-572c-8146-da692b1c9e45"): ArtifactRecipe{ + Name: "perl", Namespace: "language", ArtifactID: strfmt.UUID("b30ab2e5-4074-572c-8146-da692b1c9e45"), Dependencies: nil, RequestedByOrder: true, Version: version("5.32.1")}, + strfmt.UUID("48951744-f839-5031-8cf4-6e82a4be2089"): ArtifactRecipe{ + Name: "Data-UUID", Namespace: "language/perl", ArtifactID: strfmt.UUID("48951744-f839-5031-8cf4-6e82a4be2089"), Dependencies: []ArtifactID{"b30ab2e5-4074-572c-8146-da692b1c9e45"}, RequestedByOrder: false, Version: version("1.226")}, + strfmt.UUID("0029ae25-8497-5130-8268-1f0fe26ccc77"): ArtifactRecipe{ + Name: "Importer", Namespace: "language/perl", ArtifactID: strfmt.UUID("0029ae25-8497-5130-8268-1f0fe26ccc77"), Dependencies: []ArtifactID{"b30ab2e5-4074-572c-8146-da692b1c9e45"}, RequestedByOrder: false, Version: version("0.025")}, + strfmt.UUID("6591f01d-939d-5080-bb1a-7816ff4d020b"): ArtifactRecipe{ + Name: "Long-Jump", Namespace: "language/perl", ArtifactID: strfmt.UUID("6591f01d-939d-5080-bb1a-7816ff4d020b"), Dependencies: []ArtifactID{"b30ab2e5-4074-572c-8146-da692b1c9e45"}, RequestedByOrder: false, Version: version("0.000001")}, + strfmt.UUID("7c541a6a-4dfd-5135-8b98-2b44b5d1a816"): ArtifactRecipe{ + Name: "Module-Pluggable", Namespace: "language/perl", ArtifactID: strfmt.UUID("7c541a6a-4dfd-5135-8b98-2b44b5d1a816"), Dependencies: []ArtifactID{"b30ab2e5-4074-572c-8146-da692b1c9e45"}, RequestedByOrder: false, Version: version("5.2")}, + strfmt.UUID("7f8a7197-b277-5621-a6f3-7f2ef32d871b"): ArtifactRecipe{ + Name: "Scope-Guard", Namespace: "language/perl", ArtifactID: strfmt.UUID("7f8a7197-b277-5621-a6f3-7f2ef32d871b"), Dependencies: []ArtifactID{"b30ab2e5-4074-572c-8146-da692b1c9e45"}, RequestedByOrder: false, Version: version("0.21")}, + strfmt.UUID("29983a5b-49c4-5cf4-a2c5-2490647d6910"): ArtifactRecipe{ + Name: "Sub-Info", Namespace: "language/perl", ArtifactID: strfmt.UUID("29983a5b-49c4-5cf4-a2c5-2490647d6910"), Dependencies: []ArtifactID{"0029ae25-8497-5130-8268-1f0fe26ccc77", "b30ab2e5-4074-572c-8146-da692b1c9e45"}, RequestedByOrder: false, Version: version("0.002")}, + strfmt.UUID("4d95557d-2200-5a56-a809-4ea3d3502b20"): ArtifactRecipe{ + Name: "Term-Table", Namespace: "language/perl", ArtifactID: strfmt.UUID("4d95557d-2200-5a56-a809-4ea3d3502b20"), Dependencies: []ArtifactID{"0029ae25-8497-5130-8268-1f0fe26ccc77", "b30ab2e5-4074-572c-8146-da692b1c9e45"}, RequestedByOrder: false, Version: version("0.015")}, + strfmt.UUID("288aa0db-c0e4-55e7-8f67-fc2da409be70"): ArtifactRecipe{ + Name: "Test2-Harness", Namespace: "language/perl", ArtifactID: strfmt.UUID("288aa0db-c0e4-55e7-8f67-fc2da409be70"), Dependencies: []ArtifactID{ + "7f8a7197-b277-5621-a6f3-7f2ef32d871b", + "0029ae25-8497-5130-8268-1f0fe26ccc77", + "c3e652a7-676e-594f-b87f-93d19122f3f4", + "6591f01d-939d-5080-bb1a-7816ff4d020b", + "4d95557d-2200-5a56-a809-4ea3d3502b20", + "b30ab2e5-4074-572c-8146-da692b1c9e45", + "282e3768-e12a-51ed-831f-7cbc212ba8bd", + "48951744-f839-5031-8cf4-6e82a4be2089", + "c1e8c6c4-ea11-55a4-b415-97da2d32121e", + "30dc7965-0a69-5686-831a-e563fa73a98c", + }, RequestedByOrder: false, Version: version("1.000042")}, + strfmt.UUID("282e3768-e12a-51ed-831f-7cbc212ba8bd"): ArtifactRecipe{ + Name: "Test2-Plugin-MemUsage", Namespace: "language/perl", ArtifactID: strfmt.UUID("282e3768-e12a-51ed-831f-7cbc212ba8bd"), Dependencies: []ArtifactID{"b30ab2e5-4074-572c-8146-da692b1c9e45"}, RequestedByOrder: false, Version: version("0.002003")}, + strfmt.UUID("5ad88c8a-bc8f-50a0-9f61-74856cd28017"): ArtifactRecipe{ + Name: "Test2-Plugin-NoWarnings", Namespace: "language/perl", ArtifactID: strfmt.UUID("5ad88c8a-bc8f-50a0-9f61-74856cd28017"), Dependencies: []ArtifactID{"b30ab2e5-4074-572c-8146-da692b1c9e45"}, RequestedByOrder: false, Version: version("0.06")}, + strfmt.UUID("c3e652a7-676e-594f-b87f-93d19122f3f4"): ArtifactRecipe{ + Name: "Test2-Plugin-UUID", Namespace: "language/perl", ArtifactID: strfmt.UUID("c3e652a7-676e-594f-b87f-93d19122f3f4"), Dependencies: []ArtifactID{"b30ab2e5-4074-572c-8146-da692b1c9e45", "48951744-f839-5031-8cf4-6e82a4be2089"}, RequestedByOrder: false, Version: version("0.002001")}, + strfmt.UUID("30dc7965-0a69-5686-831a-e563fa73a98c"): ArtifactRecipe{ + Name: "Test2-Suite", Namespace: "language/perl", ArtifactID: strfmt.UUID("30dc7965-0a69-5686-831a-e563fa73a98c"), Dependencies: []ArtifactID{"7c541a6a-4dfd-5135-8b98-2b44b5d1a816", "7f8a7197-b277-5621-a6f3-7f2ef32d871b", "0029ae25-8497-5130-8268-1f0fe26ccc77", "4d95557d-2200-5a56-a809-4ea3d3502b20", "b30ab2e5-4074-572c-8146-da692b1c9e45", "29983a5b-49c4-5cf4-a2c5-2490647d6910"}, RequestedByOrder: false, Version: version("0.000127")}, + strfmt.UUID("c1e8c6c4-ea11-55a4-b415-97da2d32121e"): ArtifactRecipe{ + Name: "goto-file", Namespace: "language/perl", ArtifactID: strfmt.UUID("c1e8c6c4-ea11-55a4-b415-97da2d32121e"), Dependencies: []ArtifactID{"b30ab2e5-4074-572c-8146-da692b1c9e45"}, RequestedByOrder: false, Version: version("0.005")}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.Name, func(t *testing.T) { + recipe := testhelper.LoadRecipe(t, tt.recipeName) + res := NewMapFromRecipe(recipe) + assert.Equal(t, tt.expected, res) + }) + } +} + +func TestRequestedArtifactChanges(t *testing.T) { + oldVersion := "2.97001" + newVersion := "4.02" + tests := []struct { + Name string + baseRecipeName string + newRecipeName string + expectedChanges ArtifactChangeset + }{ + { + "no changes", + "perl-alternative-base", + "perl-alternative-base", + ArtifactChangeset{}, + }, + { + "one package added", + "perl-alternative-base", + "perl-alternative-one-package", + ArtifactChangeset{Added: []strfmt.UUID{"bfe02625-c7d6-5604-ae04-2e5b4c9592a2"}}, + }, + { + "one package updated", + "perl-alternative-one-package", + "perl-alternative-one-update", + ArtifactChangeset{ + Updated: []ArtifactUpdate{{FromID: "bfe02625-c7d6-5604-ae04-2e5b4c9592a2", FromVersion: &oldVersion, ToID: "f56acc9c-dd02-5cf8-97f9-a5cd015f4c7b", ToVersion: &newVersion}}, + }, + }, + { + "one package removed", + "perl-alternative-one-update", + "perl-alternative-one-removed", + ArtifactChangeset{ + Removed: []strfmt.UUID{"f56acc9c-dd02-5cf8-97f9-a5cd015f4c7b"}, + }, + }, + { + "added bundle", + "perl-alternative-base", + "perl-alternative-one-bundle", + ArtifactChangeset{ + Added: []strfmt.UUID{"c894fa23-0416-556d-9ca5-fdf9375595bc"}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.Name, func(t *testing.T) { + old := testhelper.LoadRecipe(t, tt.baseRecipeName) + oldArts := NewMapFromRecipe(old) + new := testhelper.LoadRecipe(t, tt.newRecipeName) + newArts := NewMapFromRecipe(new) + res := NewArtifactChangesetByIDMap(oldArts, newArts, true) + + assert.ElementsMatch(t, tt.expectedChanges.Added, res.Added, "mis-matched added ids") + assert.ElementsMatch(t, tt.expectedChanges.Removed, res.Removed, "mis-matched removed ids") + assert.ElementsMatch(t, tt.expectedChanges.Updated, res.Updated, "mis-matched updates") + }) + } + + t.Run("starting empty", func(t *testing.T) { + var oldArts ArtifactRecipeMap + new := testhelper.LoadRecipe(t, "perl-alternative-base") + newArts := NewMapFromRecipe(new) + res := NewArtifactChangesetByIDMap(oldArts, newArts, true) + + assert.Equal(t, []strfmt.UUID{"b30ab2e5-4074-572c-8146-da692b1c9e45"}, res.Added, "mis-matched added ids") + assert.Len(t, res.Removed, 0, "mis-matched removed ids") + assert.Len(t, res.Updated, 0, "mis-matched updates") + }) +} + +func TestResolvedArtifactChanges(t *testing.T) { + oldVersion := "2.97001" + newVersion := "4.02" + tests := []struct { + Name string + baseRecipeName string + newRecipeName string + expectedChanges ArtifactChangeset + }{ + { + "no changes", + "perl-alternative-base", + "perl-alternative-base", + ArtifactChangeset{Added: []strfmt.UUID{}, Removed: []strfmt.UUID{}}, + }, + { + "one package added", + "perl-alternative-base", + "perl-alternative-one-package", + ArtifactChangeset{ + Added: []strfmt.UUID{"41dbce7b-0d0f-597b-bb6f-411a4fb0b829", "bfe02625-c7d6-5604-ae04-2e5b4c9592a2", "d51871fd-d270-5423-82b9-78b567c53636", "c62e933c-7f68-5e94-8fcd-5f978e3825b4", "279d6621-2756-5f82-b1d4-1bd7a41dfc57"}, + Removed: []strfmt.UUID{}, Updated: []ArtifactUpdate{}}, + }, + { + "one package updated", + "perl-alternative-one-package", + "perl-alternative-one-update", + ArtifactChangeset{ + Added: []strfmt.UUID{}, + Removed: []strfmt.UUID{"41dbce7b-0d0f-597b-bb6f-411a4fb0b829", "d51871fd-d270-5423-82b9-78b567c53636", "c62e933c-7f68-5e94-8fcd-5f978e3825b4", "279d6621-2756-5f82-b1d4-1bd7a41dfc57"}, + Updated: []ArtifactUpdate{{FromID: "bfe02625-c7d6-5604-ae04-2e5b4c9592a2", FromVersion: &oldVersion, ToID: "f56acc9c-dd02-5cf8-97f9-a5cd015f4c7b", ToVersion: &newVersion}}, + }, + }, + { + "one package removed", + "perl-alternative-one-update", + "perl-alternative-one-removed", + ArtifactChangeset{ + Removed: []strfmt.UUID{"f56acc9c-dd02-5cf8-97f9-a5cd015f4c7b"}, + }, + }, + { + "added bundle", + "perl-alternative-base", + "perl-alternative-one-bundle", + ArtifactChangeset{ + Added: []strfmt.UUID{"288aa0db-c0e4-55e7-8f67-fc2da409be70", "c1e8c6c4-ea11-55a4-b415-97da2d32121e", "48951744-f839-5031-8cf4-6e82a4be2089", "0029ae25-8497-5130-8268-1f0fe26ccc77", "7f8a7197-b277-5621-a6f3-7f2ef32d871b", "29983a5b-49c4-5cf4-a2c5-2490647d6910", "c3e652a7-676e-594f-b87f-93d19122f3f4", "5ad88c8a-bc8f-50a0-9f61-74856cd28017", "30dc7965-0a69-5686-831a-e563fa73a98c", "c894fa23-0416-556d-9ca5-fdf9375595bc", "6591f01d-939d-5080-bb1a-7816ff4d020b", "7c541a6a-4dfd-5135-8b98-2b44b5d1a816", "4d95557d-2200-5a56-a809-4ea3d3502b20", "282e3768-e12a-51ed-831f-7cbc212ba8bd"}, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.Name, func(t *testing.T) { + old := testhelper.LoadRecipe(t, tt.baseRecipeName) + oldArts := NewMapFromRecipe(old) + new := testhelper.LoadRecipe(t, tt.newRecipeName) + newArts := NewMapFromRecipe(new) + res := NewArtifactChangesetByIDMap(oldArts, newArts, false) + + assert.ElementsMatch(t, tt.expectedChanges.Added, res.Added, "mis-matched added ids") + assert.ElementsMatch(t, tt.expectedChanges.Removed, res.Removed, "mis-matched removed ids") + assert.ElementsMatch(t, tt.expectedChanges.Updated, res.Updated, "mis-matched updates") + }) + } +} + +func TestArtifactDownloads(t *testing.T) { + tests := []struct { + Name string + BuildName string + IsCamel bool + Expected []ArtifactDownload + }{ + { + "just-perl", + "perl-alternative-base", + false, + []ArtifactDownload{ + {"b30ab2e5-4074-572c-8146-da692b1c9e45", "s3://as-builds/production/language/perl/5.32.1/3/b30ab2e5-4074-572c-8146-da692b1c9e45/artifact.tar.gz", ""}, + }, + }, + { + "with-one-package", + "perl-alternative-one-update", + false, + []ArtifactDownload{ + {"b30ab2e5-4074-572c-8146-da692b1c9e45", "s3://as-builds/production/language/perl/5.32.1/3/b30ab2e5-4074-572c-8146-da692b1c9e45/artifact.tar.gz", ""}, + {"f56acc9c-dd02-5cf8-97f9-a5cd015f4c7b", "s3://as-builds/production/language/perl/JSON/4.02/4/f56acc9c-dd02-5cf8-97f9-a5cd015f4c7b/artifact.tar.gz", ""}, + }, + }, + { + "perl-camel", + "perl", + true, + []ArtifactDownload{ + {"e88f6f1f-74c9-512e-9c9b-8c921a80c6fb", "https://s3.amazonaws.com/camel-builds/ActivePerl/x86_64-linux-glibc-2.17/20200424T172842Z/ActivePerl-5.28.1.0000-x86_64-linux-glibc-2.17-2a0758c3.tar.gz", ""}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.Name, func(t *testing.T) { + build := testhelper.LoadBuildResponse(t, tt.BuildName) + var downloads []ArtifactDownload + var err error + if tt.IsCamel { + downloads, err = NewDownloadsFromCamelBuild(build) + } else { + downloads, err = NewDownloadsFromBuild(build) + } + assert.NoError(t, err) + assert.Equal(t, tt.Expected, downloads) + }) + } +} + +func TestRecursiveDependencies(t *testing.T) { + artifacts := ArtifactRecipeMap{ + ArtifactID("1"): ArtifactRecipe{ + Dependencies: []ArtifactID{"2", "3"}}, + ArtifactID("2"): ArtifactRecipe{ + Dependencies: []ArtifactID{"4", "5"}}, + ArtifactID("3"): ArtifactRecipe{ + Dependencies: []ArtifactID{"4", "6"}}, + ArtifactID("4"): ArtifactRecipe{Dependencies: nil}, + ArtifactID("5"): ArtifactRecipe{Dependencies: nil}, + ArtifactID("6"): ArtifactRecipe{Dependencies: []ArtifactID{"7"}}, + ArtifactID("7"): ArtifactRecipe{Dependencies: nil}, + } + + tests := []struct { + name string + artfID ArtifactID + expected []ArtifactID + }{ + {name: "root artifact", artfID: "1", expected: []ArtifactID{"2", "3", "4", "5", "6", "7"}}, + {name: "invalid artifact", artfID: "1234", expected: nil}, + {name: "no recursion", artfID: "2", expected: []ArtifactID{"4", "5"}}, + {name: "partial recursion", artfID: "3", expected: []ArtifactID{"4", "6", "7"}}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + res := RecursiveDependenciesFor(tt.artfID, artifacts) + assert.ElementsMatch(t, tt.expected, res) + }) + } +} diff --git a/pkg/platform/runtime/artifact/changeset.go b/pkg/platform/runtime/artifact/changeset.go new file mode 100644 index 0000000000..ba2ad6eda9 --- /dev/null +++ b/pkg/platform/runtime/artifact/changeset.go @@ -0,0 +1,77 @@ +package artifact + +import ( + "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models" +) + +type ArtifactChangeset struct { + Added []ArtifactID + Removed []ArtifactID + Updated []ArtifactUpdate +} + +type ArtifactUpdate struct { + FromID ArtifactID + FromVersion *string + ToID ArtifactID + ToVersion *string +} + +// NewArtifactChangeset parses two recipes and returns the artifact IDs of artifacts that have changed due to changes in the order requirements +func NewArtifactChangeset(old, new ArtifactNamedRecipeMap, requestedOnly bool) ArtifactChangeset { + // Basic outline of what needs to happen here: + // - add ArtifactID to the `Added` field if artifactID only appears in the the `new` recipe + // - add ArtifactID to the `Removed` field if artifactID only appears in the the `old` recipe + // - add ArtifactID to the `Updated` field if `ResolvedRequirements.feature` appears in both recipes, but the resolved version has changed. + + var updated []ArtifactUpdate + var added []ArtifactID + for name, artf := range new { + if requestedOnly && !new[name].RequestedByOrder { + continue + } + + if artfOld, notNew := old[name]; notNew { + // The artifact name exists in both the old and new recipe, maybe it was updated though + if artfOld.ArtifactID == artf.ArtifactID { + continue + } + updated = append(updated, ArtifactUpdate{ + FromID: artfOld.ArtifactID, + ToID: artf.ArtifactID, + FromVersion: artfOld.Version, + ToVersion: artf.Version, + }) + + } else { + // If it's not an update it is a new artifact + added = append(added, artf.ArtifactID) + } + } + + var removed []ArtifactID + for name, artf := range old { + if _, noDiff := new[name]; noDiff { + continue + } + if !requestedOnly || old[name].RequestedByOrder { + removed = append(removed, artf.ArtifactID) + } + } + + return ArtifactChangeset{ + Added: added, + Removed: removed, + Updated: updated, + } +} + +// DetectArtifactChanges computes the artifact changes between an old recipe (which can be empty) and a new recipe +func NewArtifactChangesetByIDMap(old, new ArtifactRecipeMap, requestedOnly bool) ArtifactChangeset { + return NewArtifactChangeset(NewNamedMapFromIDMap(old), NewNamedMapFromIDMap(new), requestedOnly) +} + +// DetectArtifactChanges computes the artifact changes between an old recipe (which can be empty) and a new recipe +func NewArtifactChangesetByRecipe(oldRecipe, newRecipe *inventory_models.Recipe, requestedOnly bool) ArtifactChangeset { + return NewArtifactChangeset(NewNamedMapFromRecipe(oldRecipe), NewNamedMapFromRecipe(newRecipe), requestedOnly) +} diff --git a/pkg/platform/runtime/artifact/download.go b/pkg/platform/runtime/artifact/download.go new file mode 100644 index 0000000000..3a3c576df5 --- /dev/null +++ b/pkg/platform/runtime/artifact/download.go @@ -0,0 +1,49 @@ +package artifact + +import ( + "strings" + + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/pkg/platform/api/headchef/headchef_models" +) + +type ArtifactDownload struct { + ArtifactID ArtifactID + UnsignedURI string + Checksum string +} + +// InstallerTestsSubstr is used to exclude test artifacts, we don't care about them +const InstallerTestsSubstr = "-tests." + +// NewDownloadsFromBuild extracts downloadable artifact information from the build status response +func NewDownloadsFromBuild(buildStatus *headchef_models.BuildStatusResponse) ([]ArtifactDownload, error) { + var downloads []ArtifactDownload + for _, a := range buildStatus.Artifacts { + if a.BuildState != nil && *a.BuildState == headchef_models.ArtifactBuildStateSucceeded && a.URI != "" { + if strings.HasPrefix(a.URI.String(), "s3://as-builds/noop/") { + continue + } + + downloads = append(downloads, ArtifactDownload{ArtifactID: *a.ArtifactID, UnsignedURI: a.URI.String()}) + } + } + + return downloads, nil +} + +func NewDownloadsFromCamelBuild(buildStatus *headchef_models.BuildStatusResponse) ([]ArtifactDownload, error) { + for _, a := range buildStatus.Artifacts { + if a.BuildState != nil && *a.BuildState == headchef_models.ArtifactBuildStateSucceeded && a.URI != "" { + if strings.Contains(a.URI.String(), InstallerTestsSubstr) { + continue + } + if strings.HasSuffix(a.URI.String(), ".tar.gz") || strings.HasSuffix(a.URI.String(), ".zip") { + return []ArtifactDownload{{ArtifactID: *a.ArtifactID, UnsignedURI: a.URI.String()}}, nil + } + + } + } + + return nil, errs.New("No download found in build response.") +} diff --git a/pkg/platform/runtime/artifact/recipe.go b/pkg/platform/runtime/artifact/recipe.go new file mode 100644 index 0000000000..f3e28afff2 --- /dev/null +++ b/pkg/platform/runtime/artifact/recipe.go @@ -0,0 +1,137 @@ +package artifact + +import ( + "fmt" + + "github.com/ActiveState/cli/internal/logging" + "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models" + monomodel "github.com/ActiveState/cli/pkg/platform/model" + "github.com/go-openapi/strfmt" + "github.com/thoas/go-funk" +) + +// ArtifactRecipe comprises useful information about an artifact that we extracted from a recipe +type ArtifactRecipe struct { + ArtifactID ArtifactID + Name string + Namespace string + Version *string + RequestedByOrder bool + + Dependencies []ArtifactID +} + +// ArtifactRecipeMap maps artifact ids to artifact information extracted from a recipe +type ArtifactRecipeMap = map[ArtifactID]ArtifactRecipe + +// ArtifactNamedRecipeMap maps artifact names to artifact information extracted from a recipe +type ArtifactNamedRecipeMap = map[string]ArtifactRecipe + +// NameWithVersion returns a string @ if artifact has a version specified, otherwise it returns just the name +func (a ArtifactRecipe) NameWithVersion() string { + version := "" + if a.Version != nil { + version = fmt.Sprintf("@%s", *a.Version) + } + return a.Name + version +} + +// NewMapFromRecipe parses a recipe and returns a map of ArtifactRecipe structures that we can interpret for our purposes +func NewMapFromRecipe(recipe *inventory_models.Recipe) ArtifactRecipeMap { + res := make(map[ArtifactID]ArtifactRecipe) + if recipe == nil { + return res + } + // map from the ingredient version ID to the artifact ID (needed for the dependency resolution) + iv2artMap := make(map[strfmt.UUID]ArtifactID) + for _, ri := range recipe.ResolvedIngredients { + a := ri.ArtifactID + iv2artMap[*ri.IngredientVersion.IngredientVersionID] = a + } + for _, ri := range recipe.ResolvedIngredients { + namespace := *ri.Ingredient.PrimaryNamespace + if !monomodel.NamespaceMatch(namespace, monomodel.NamespaceLanguageMatch) && + !monomodel.NamespaceMatch(namespace, monomodel.NamespacePackageMatch) && + !monomodel.NamespaceMatch(namespace, monomodel.NamespaceBundlesMatch) { + continue + } + a := ri.ArtifactID + name := *ri.Ingredient.Name + version := ri.IngredientVersion.Version + requestedByOrder := len(ri.ResolvedRequirements) > 0 + + // Resolve dependencies + var deps []ArtifactID + for _, dep := range ri.Dependencies { + if dep.IngredientVersionID == nil { + continue + } + // If this is a bundle, we need to add all dependencies, as the dependent ingredients are added as Build dependencies + if !monomodel.NamespaceMatch(namespace, monomodel.NamespaceBundlesMatch) && !funk.Contains(dep.DependencyTypes, inventory_models.DependencyTypeRuntime) { + continue + } + aid, ok := iv2artMap[*dep.IngredientVersionID] + if !ok { + logging.Error("Could not map ingredient version id %s to artifact id", *dep.IngredientVersionID) + } + deps = append(deps, aid) + } + + res[a] = ArtifactRecipe{ + ArtifactID: a, + Name: name, + Namespace: namespace, + Version: version, + RequestedByOrder: requestedByOrder, + Dependencies: deps, + } + } + + return res +} + +// RecursiveDependenciesFor computes the recursive dependencies for an ArtifactID a using artifacts as a lookup table +func RecursiveDependenciesFor(a ArtifactID, artifacts ArtifactRecipeMap) []ArtifactID { + allDeps := make(map[ArtifactID]struct{}) + artf, ok := artifacts[a] + if !ok { + return nil + } + toCheck := artf.Dependencies + + for len(toCheck) > 0 { + var newToCheck []ArtifactID + for _, a := range toCheck { + if _, ok := allDeps[a]; ok { + continue + } + artf, ok := artifacts[a] + if !ok { + continue + } + newToCheck = append(newToCheck, artf.Dependencies...) + allDeps[a] = struct{}{} + } + toCheck = newToCheck + } + + res := make([]ArtifactID, 0, len(allDeps)) + for a := range allDeps { + res = append(res, a) + } + return res +} + +// NewNamedMapFromRecipe parses a recipe and returns a map of ArtifactRecipe structures that we can interpret for our purposes +func NewNamedMapFromRecipe(recipe *inventory_models.Recipe) ArtifactNamedRecipeMap { + return NewNamedMapFromIDMap(NewMapFromRecipe(recipe)) +} + +// NewNamedMapFromIDMap converts an ArtifactRecipeMap to a ArtifactNamedRecipeMap +func NewNamedMapFromIDMap(am ArtifactRecipeMap) ArtifactNamedRecipeMap { + res := make(map[string]ArtifactRecipe) + for _, a := range am { + res[a.Name] = a + } + return res +} diff --git a/pkg/platform/runtime/assembler.go b/pkg/platform/runtime/assembler.go deleted file mode 100644 index a3a26531e1..0000000000 --- a/pkg/platform/runtime/assembler.go +++ /dev/null @@ -1,119 +0,0 @@ -package runtime - -import ( - "github.com/ActiveState/cli/internal/unarchiver" - "github.com/ActiveState/cli/pkg/platform/api/headchef/headchef_models" -) - -// EnvGetter provides a function to return variables for a runtime environment -// The provided function should construct the environment from cached values only. -type EnvGetter interface { - // GetEnv returns a map between environment variable names and their values - GetEnv(inherit bool, projectDir string) (map[string]string, error) -} - -// Assembler extends the EnvGetter by functions that allow the -// runtime environment to be installed through downloads from the internet. -type Assembler interface { - EnvGetter - DownloadDirectoryProvider - - // ArtifactsToDownload returns the artifacts that need to be downloaded - ArtifactsToDownload() []*HeadChefArtifact - - // BuildEngine returns the build engine that this runtime has been created - // with - BuildEngine() BuildEngine - - // InstallerExtension is used to identify whether an artifact is one that we - // should care about - InstallerExtension() string - - // Unarchiver initializes and returns the unarchiver for the expected - // artifact archive format - Unarchiver() unarchiver.Unarchiver - - /* HOOKS */ - - // PreInstall is invoked by the installer after all artifact archives are - // downloaded, but before they are unpacked. - PreInstall() error - - // PreUnpackArtifact is invoked by the installer for every artifact archive - // before it is being unpacked. - PreUnpackArtifact(artf *HeadChefArtifact) error - - // PostUnpackArtifact is invoked by the installer for every artifact archive - // after it has been unpacked into its temporary installation directory tmpRuntimeDir - // Here, the final relocation to InstallationDirectory() needs to take place. - PostUnpackArtifact(artf *HeadChefArtifact, tmpRuntimeDir string, archivePath string, cb func()) error - - // PostInstall is called after all artifacts have been successfully installed - PostInstall() error - - // IsInstalled returns whether the artifacts have been successfully installed already - IsInstalled() bool -} - -// BuildEngine describes the build engine that was used to build the runtime -type BuildEngine int - -const ( - // UnknownEngine represents an engine unknown to the runtime. - UnknownEngine BuildEngine = iota - - // Camel is the legacy build engine, that builds Active{Python,Perl,Tcl} - // distributions - Camel - - // Alternative is the new alternative build orchestration framework - Alternative - - // Hybrid wraps Camel. - Hybrid -) - -// BuildEngineFromResponse handles a headchef build status response and returns -// the relevant engine. -func BuildEngineFromResponse(resp *headchef_models.BuildStatusResponse) BuildEngine { - if resp == nil || resp.BuildEngine == nil { - return UnknownEngine - } - - switch *resp.BuildEngine { - case headchef_models.BuildStatusResponseBuildEngineCamel: - return Camel - case headchef_models.BuildStatusResponseBuildEngineAlternative: - return Alternative - case headchef_models.BuildStatusResponseBuildEngineHybrid: - return Hybrid - default: - return UnknownEngine - } -} - -func (be BuildEngine) String() string { - switch be { - case Camel: - return headchef_models.BuildStatusResponseBuildEngineCamel - case Alternative: - return headchef_models.BuildStatusResponseBuildEngineAlternative - case Hybrid: - return headchef_models.BuildStatusResponseBuildEngineHybrid - default: - return "unknown" - } -} - -func parseBuildEngine(be string) BuildEngine { - switch be { - case headchef_models.BuildStatusResponseBuildEngineAlternative: - return Alternative - case headchef_models.BuildStatusResponseBuildEngineCamel: - return Camel - case headchef_models.BuildStatusResponseBuildEngineHybrid: - return Hybrid - default: - return UnknownEngine - } -} diff --git a/pkg/platform/runtime/camel.go b/pkg/platform/runtime/camel.go deleted file mode 100644 index 17ce0b63f6..0000000000 --- a/pkg/platform/runtime/camel.go +++ /dev/null @@ -1,423 +0,0 @@ -package runtime - -import ( - "bytes" - "encoding/json" - "html/template" - "io/ioutil" - "os" - "path/filepath" - rt "runtime" - "strings" - - "github.com/go-openapi/strfmt" - - "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/errs" - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/logging" - "github.com/ActiveState/cli/internal/unarchiver" -) - -var _ EnvGetter = &CamelEnv{} -var _ Assembler = &CamelInstall{} - -const envFile = "activestate.env.json" -const deleteMarker = "!#DELETE#!" - -// CamelEnv holds all the meta-data necessary to activate a runtime -// environment for a Camel build -type CamelEnv struct { - commitID strfmt.UUID - runtimeDir string - env map[string]string -} - -// CamelInstall provides methods to download and install camel artifacts -type CamelInstall struct { - CamelEnv - artifacts []*HeadChefArtifact -} - -// NewCamelEnv returns a new camel runtime assembler -// It filters the provided artifact list for use-able artifacts -func NewCamelEnv(commitID strfmt.UUID, cacheDir string) (*CamelEnv, error) { - ce := &CamelEnv{commitID, cacheDir, map[string]string{}} - return ce, nil -} - -// NewCamelInstall creates a new camel installation -func NewCamelInstall(commitID strfmt.UUID, cacheDir string, artifacts []*HeadChefArtifact) (*CamelInstall, error) { - ce, err := NewCamelEnv(commitID, cacheDir) - if err != nil { - return nil, err - } - ci := &CamelInstall{*ce, []*HeadChefArtifact{}} - - for _, artf := range artifacts { - // filter artifacts - if artf.URI == "" { - continue - } - - filename := filepath.Base(artf.URI.String()) - if !strings.HasSuffix(filename, ci.InstallerExtension()) || strings.Contains(filename, InstallerTestsSubstr) { - continue - } - - ci.artifacts = append(ci.artifacts, artf) - } - - if len(ci.artifacts) == 0 { - return ci, &ErrInvalidArtifact{locale.NewError("err_no_valid_artifact")} - } - - return ci, nil -} - -// InstallerExtension returns the expected file extension for archive file names -// We expect .zip for Windows and .tar.gz otherwise -func (ci *CamelInstall) InstallerExtension() string { - if rt.GOOS == "windows" { - return ".zip" - } - return ".tar.gz" -} - -// Unarchiver initializes and returns an Unarchiver instance that is able to -// unpack the downloaded artifact archives. -func (ci *CamelInstall) Unarchiver() unarchiver.Unarchiver { - if rt.GOOS == "windows" { - return unarchiver.NewZip() - } - return unarchiver.NewTarGz() -} - -// BuildEngine always returns Camel -func (ci *CamelInstall) BuildEngine() BuildEngine { - return Camel -} - -// DownloadDirectory returns the download directory for a given artifact -// Each artifact is downloaded into its own temporary directory -func (ci *CamelInstall) DownloadDirectory(artf *HeadChefArtifact) (string, error) { - downloadDir, err := ioutil.TempDir("", "state-runtime-downloader") - if err != nil { - return downloadDir, errs.Wrap(err, "TempDir failed") - } - return downloadDir, nil -} - -// ArtifactsToDownload returns the artifacts that we need to download for this project -// It filters out all artifacts for which the final installation directory does not include a completion marker yet -func (ci *CamelInstall) ArtifactsToDownload() []*HeadChefArtifact { - return ci.artifacts -} - -// PreInstall attempts to clean the runtime-directory. Failures are only logged to rollbar and do not cause the installation to fail. -func (ci *CamelInstall) PreInstall() error { - if fileutils.DirExists(ci.runtimeDir) { - empty, err := fileutils.IsEmptyDir(ci.runtimeDir) - if err != nil { - logging.Error("Could not check if target runtime dir is empty, this could cause issues.. %v", err) - } else if !empty { - logging.Debug("Removing existing runtime") - if err := os.RemoveAll(ci.runtimeDir); err != nil { - logging.Error("Could not empty out target runtime dir prior to install, this could cause issues.. %v", err) - } - } - } - return nil -} - -// PreUnpackArtifact ensures that the final installation directory exists and is -// useable. -// Note: It will remove a previous installation -func (ci *CamelInstall) PreUnpackArtifact(artf *HeadChefArtifact) error { - if fileutils.FileExists(ci.runtimeDir) { - // install-dir exists, but is a regular file - return &ErrInstallDirInvalid{locale.NewInputError("installer_err_installdir_isfile", "", ci.runtimeDir)} - } - - if fileutils.DirExists(ci.runtimeDir) { - // remove previous installation - if err := os.RemoveAll(ci.runtimeDir); err != nil { - return errs.Wrap(err, "failed to remove spurious previous installation") - } - } - - if err := fileutils.MkdirUnlessExists(ci.runtimeDir); err != nil { - return err - } - - return nil -} - -// PostUnpackArtifact parses the metadata file, runs the Relocation function (if -// necessary) and moves the artifact to its final destination -func (ci *CamelInstall) PostUnpackArtifact(artf *HeadChefArtifact, tmpRuntimeDir string, archivePath string, cb func()) error { - archiveName := strings.TrimSuffix(filepath.Base(archivePath), filepath.Ext(archivePath)) - - // the above only strips .gz, so account for .tar.gz use-case - // it's fine to run this on windows cause those files won't end in .tar anyway - archiveName = strings.TrimSuffix(archiveName, ".tar") - - // Detect the install dir (in the tarball) - // Python runtimes on MacOS work where they are unarchived so we do not - // need to do any detection of the install directory - var tmpInstallDir string - installDirs := strings.Split(constants.RuntimeInstallDirs, ",") - for _, dir := range installDirs { - currentDir := filepath.Join(tmpRuntimeDir, archiveName, dir) - if fileutils.DirExists(currentDir) { - tmpInstallDir = currentDir - } - } - if tmpInstallDir == "" { - // If no installDir was found assume the root of the archive - tmpInstallDir = filepath.Join(tmpRuntimeDir, archiveName) - } - - if err := fileutils.MoveAllFilesCrossDisk(tmpInstallDir, ci.runtimeDir); err != nil { - logging.Error("moving files from %s after unpacking runtime: %v", tmpInstallDir, err) - - // It is possible that we get an Access Denied error (on Windows) while moving files to the installation directory. - // Eg., https://rollbar.com/activestate/state-tool/items/297/occurrences/118875103987/ - // This might happen due to virus software or other access control software running on the user's machine, - // and therefore we forward this information to the user. - if os.IsPermission(err) { - return locale.NewInputError("installer_err_runtime_move_files_access_denied", "", ci.runtimeDir, constants.ForumsURL) - } - return locale.WrapError(err, "installer_err_runtime_move_files_failed", "", tmpInstallDir, ci.runtimeDir) - } - - tmpMetaFile := filepath.Join(tmpRuntimeDir, archiveName, constants.RuntimeMetaFile) - if fileutils.FileExists(tmpMetaFile) { - target := filepath.Join(ci.runtimeDir, constants.RuntimeMetaFile) - if err := fileutils.MkdirUnlessExists(filepath.Dir(target)); err != nil { - return err - } - if err := os.Rename(tmpMetaFile, target); err != nil { - return errs.Wrap(err, "os.Rename failed") - } - } - - tmpRelocFile := filepath.Join(tmpRuntimeDir, archiveName, "support/reloc.txt") - if fileutils.FileExists(tmpRelocFile) { - target := filepath.Join(ci.runtimeDir, "support/reloc.txt") - if err := fileutils.MkdirUnlessExists(filepath.Dir(target)); err != nil { - return err - } - if err := os.Rename(tmpRelocFile, target); err != nil { - return errs.Wrap(err, "rename %s:%s failed", tmpRelocFile, target) - } - } - - if err := os.RemoveAll(tmpRuntimeDir); err != nil { - logging.Error("removing %s after unpacking runtime: %v", tmpRuntimeDir, err) - return locale.WrapError(err, "installer_err_runtime_rm_installdir", "", tmpRuntimeDir) - } - - metaData, err := InitMetaData(ci.runtimeDir) - if err != nil { - return err - } - - if err = Relocate(metaData, cb); err != nil { - return err - } - - if metaData.hasBinaryFile(constants.ActivePerlExecutable) { - err := installPPMShim(filepath.Join(metaData.Path, metaData.BinaryLocations[0].Path)) - if err != nil { - return locale.WrapError(err, "ppm_install_err") - } - } - - ci.env = ci.appendEnv(ci.env, metaData) - - return nil -} - -func (ci *CamelInstall) appendEnv(env map[string]string, meta *MetaData) map[string]string { - // Unset AffectedEnv - if meta.AffectedEnv != "" { - env[meta.AffectedEnv] = deleteMarker - } - - for k, v := range meta.Env { - env[k] = v - } - - // Set up PATH according to binary locations - for _, v := range meta.BinaryLocations { - path := v.Path - if v.Relative { - path = filepath.Join(ci.runtimeDir, path) - } - env["PATH"] = prependPath(env["PATH"], path) - } - - // Add DLL dir to PATH on Windows - if meta.RelocationTargetBinaries != "" && rt.GOOS == "windows" { - env["PATH"] = prependPath(env["PATH"], filepath.Join(ci.runtimeDir, meta.RelocationTargetBinaries)) - } - - return env -} - -// Relocate will look through all of the files in this installation and replace any -// character sequence in those files containing the given prefix. -func Relocate(metaData *MetaData, cb func()) error { - prefix := metaData.RelocationDir - - for _, tr := range metaData.TargetedRelocations { - path := filepath.Join(metaData.Path, tr.InDir) - err := fileutils.ReplaceAllInDirectory(path, tr.SearchString, tr.Replacement, - // only replace text files for now - func(_ string, fileBytes []byte) bool { - return !fileutils.IsBinary(fileBytes) - }) - if err != nil { - return errs.Wrap(err, "ReplaceAllInDirectory (Relocate) %s - %s:%s failed", path, tr.SearchString, tr.Replacement) - } - } - - if len(prefix) == 0 || prefix == metaData.Path { - return nil - } - logging.Debug("relocating '%s' to '%s'", prefix, metaData.Path) - binariesSeparate := rt.GOOS == "linux" && metaData.RelocationTargetBinaries != "" - - relocFilePath := filepath.Join(metaData.Path, "support", "reloc.txt") - relocMap := map[string]bool{} - if fileutils.FileExists(relocFilePath) { - relocMap = loadRelocationFile(relocFilePath) - } - - // Replace plain text files - err := fileutils.ReplaceAllInDirectory(metaData.Path, prefix, metaData.Path, - // Check if we want to include this - func(p string, contents []byte) bool { - suffix := strings.TrimPrefix(p, metaData.Path) - if relocMap[suffix] { - return true - } - if !strings.HasSuffix(p, filepath.FromSlash(constants.RuntimeMetaFile)) && (!binariesSeparate || !fileutils.IsBinary(contents)) { - cb() - return true - } - return false - }) - if err != nil { - return errs.Wrap(err, "ReplaceAllInDirectory (plain text) %s - %s:%s failed", metaData.Path, prefix, metaData.Path) - } - - if binariesSeparate { - replacement := filepath.Join(metaData.Path, metaData.RelocationTargetBinaries) - // Replace binary files - err = fileutils.ReplaceAllInDirectory(metaData.Path, prefix, replacement, - // Binaries only - func(p string, contents []byte) bool { - if fileutils.IsBinary(contents) { - cb() - return true - } - return false - }) - - if err != nil { - return errs.Wrap(err, "ReplaceAllInDirectory (binaries) %s - %s:%s failed", metaData.Path, prefix, replacement) - } - } - - return nil -} - -// GetEnv returns the environment that is needed to use the installed runtime -func (ce *CamelEnv) GetEnv(inherit bool, projectDir string) (map[string]string, error) { - var env map[string]string - - envData, err := fileutils.ReadFile(filepath.Join(ce.runtimeDir, envFile)) - if err != nil { - return env, errs.Wrap(err, "Could not read "+envFile) - } - - if err := json.Unmarshal(envData, &env); err != nil { - return env, errs.Wrap(err, "Could not unmarshal "+envFile) - } - - if inherit { - env["PATH"] = prependPath(os.Getenv("PATH"), env["PATH"]) - } - - templateMeta := struct { - ProjectDir string - }{projectDir} - - resultEnv := map[string]string{} - for k, v := range env { - if v == deleteMarker { - continue - } - - // Dirty workaround until https://www.pivotaltracker.com/story/show/172033094 is implemented - // This avoids projectDir dependant env vars from being written - if projectDir == "" && strings.Contains(v, "ProjectDir") { - continue - } - - valueTemplate, err := template.New(k).Parse(v) - if err != nil { - logging.Error("Skipping env value with invalid value: %s:%s, error: %v", k, v, err) - continue - } - var realValue bytes.Buffer - err = valueTemplate.Execute(&realValue, templateMeta) - if err != nil { - logging.Error("Skipping env value whose value could not be parsed: %s:%s, error: %v", k, v, err) - continue - } - resultEnv[k] = realValue.String() - } - return resultEnv, nil -} - -// PostInstall creates completion markers for all artifact directories -func (ci *CamelInstall) PostInstall() error { - env, err := json.Marshal(ci.env) - if err != nil { - return errs.Wrap(err, "Could not marshal camel environment") - } - - if err := fileutils.WriteFile(filepath.Join(ci.runtimeDir, envFile), env); err != nil { - return errs.Wrap(err, "Could not write "+envFile) - } - - return nil -} - -// IsInstalled checks if completion marker files exist for all artifacts -func (ci *CamelInstall) IsInstalled() bool { - marker := filepath.Join(ci.runtimeDir, constants.RuntimeInstallationCompleteMarker) - if !fileutils.FileExists(marker) { - return false - } - - contents, err := fileutils.ReadFile(marker) - if err != nil { - logging.Error("Could not read marker: %v", err) - return false - } - - return string(contents) == ci.commitID.String() -} - -func prependPath(PATH, prefix string) string { - var suffix string - if PATH != "" { - suffix = string(os.PathListSeparator) + PATH - } - return prefix + suffix -} diff --git a/pkg/platform/runtime/camel_linux_test.go b/pkg/platform/runtime/camel_linux_test.go deleted file mode 100644 index 23af29dfb7..0000000000 --- a/pkg/platform/runtime/camel_linux_test.go +++ /dev/null @@ -1,135 +0,0 @@ -// +build linux - -package runtime_test - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/ActiveState/archiver" - "github.com/go-openapi/strfmt" - "github.com/stretchr/testify/suite" - - "github.com/ActiveState/cli/internal/environment" - "github.com/ActiveState/cli/internal/fileutils" - pMock "github.com/ActiveState/cli/internal/progress/mock" - "github.com/ActiveState/cli/pkg/platform/runtime" -) - -type CamelLinuxRuntimeTestSuite struct { - suite.Suite - - dataDir string -} - -func (suite *CamelLinuxRuntimeTestSuite) BeforeTest(suiteName, testName string) { - root, err := environment.GetRootPath() - suite.Require().NoError(err, "failure obtaining root path") - - suite.dataDir = filepath.Join(root, "pkg", "platform", "runtime", "testdata") - -} - -func (suite *CamelLinuxRuntimeTestSuite) TestRelocate() { - - cacheDir, err := ioutil.TempDir("", "cli-installer-test-cache") - suite.Require().NoError(err) - defer os.RemoveAll(cacheDir) - - relocationPrefix := "######################################## RELOCATE ME ########################################" - - fileutils.CopyFile(filepath.Join(suite.dataDir, "relocate/bin/python3"), filepath.Join(cacheDir, "relocate/bin/python3")) - - binary := "relocate/binary" - fileutils.CopyFile(filepath.Join(suite.dataDir, binary), filepath.Join(cacheDir, binary)) - - text := "relocate/text.go" - fileutils.CopyFile(filepath.Join(suite.dataDir, text), filepath.Join(cacheDir, text)) - - // Mock metaData - metaData := &runtime.MetaData{ - Path: filepath.Join(cacheDir, "relocate"), - RelocationDir: relocationPrefix, - BinaryLocations: []runtime.MetaDataBinary{ - runtime.MetaDataBinary{ - Path: "bin", - Relative: true, - }, - }, - Env: map[string]string{}, - } - - metaData.Prepare() - suite.Equal("lib", metaData.RelocationTargetBinaries) - - installDir := filepath.Join(cacheDir, "relocate") - - counter := pMock.NewMockIncrementer() - - err = runtime.Relocate(metaData, func() { counter.Increment() }) - suite.Require().NoError(err) - - suite.Assert().Equal(3, counter.Count, "3 files relocated") - - // test text - suite.Contains(string(fileutils.ReadFileUnsafe(filepath.Join(cacheDir, text))), fmt.Sprintf("-- %s --", installDir)) - - // test binary - libDir := filepath.Join(cacheDir, "relocate/lib") - binaryData := fileutils.ReadFileUnsafe(filepath.Join(cacheDir, binary)) - suite.True(len(bytes.Split(binaryData, []byte(libDir))) > 1, "Correctly injects "+libDir) -} - -func (suite *CamelLinuxRuntimeTestSuite) genCacheDir() (string, func()) { - - cacheDir, err := ioutil.TempDir("", "cli-camel-cache-dir") - suite.Require().NoError(err, "cache dir created") - return cacheDir, func() { os.RemoveAll(cacheDir) } -} - -func (suite *CamelLinuxRuntimeTestSuite) Test_PostUnpackWithFailures() { - cases := []struct { - name string - archiveName string - expectedError error - }{ - {"RuntimeMissingPythonExecutable", "python-missing-python-binary.tar.gz", &runtime.ErrMetaData{}}, - {"PythonFoundButNotExecutable", "python-noexec-python.tar.gz", &runtime.ErrNotExecutable{}}, - {"InstallerFailsToGetPrefixes", "python-fail-prefixes.tar.gz", &runtime.ErrNoPrefixes{}}, - } - - for _, tc := range cases { - suite.Run(tc.name, func() { - cacheDir, cacheCleanup := suite.genCacheDir() - defer cacheCleanup() - runtimeDir, err := ioutil.TempDir("", "cli-camel-runtime-dir") - defer os.RemoveAll(runtimeDir) - - archivePath := filepath.Join(suite.dataDir, tc.archiveName) - suite.Require().NoError(err, "runtime dir created") - err = archiver.Unarchive(archivePath, runtimeDir) - suite.Require().NoError(err, "could not unarchive test archive %s", archivePath) - - artifact, _ := headchefArtifact(archivePath) - counter := pMock.NewMockIncrementer() - - cr, err := runtime.NewCamelInstall(strfmt.UUID(""), cacheDir, []*runtime.HeadChefArtifact{artifact}) - suite.Require().NoError(err, "camel runtime assembler initialized") - err = fileutils.MkdirUnlessExists(cacheDir) - suite.Require().NoError(err, "creating installation directory") - err = cr.PostUnpackArtifact(artifact, runtimeDir, archivePath, func() { counter.Increment() }) - - suite.Require().Error(err) - suite.ErrorAs(err, &tc.expectedError) - suite.Assert().Equal(0, counter.Count) - }) - } -} - -func Test_CamelLinuxRuntimeTestSuite(t *testing.T) { - suite.Run(t, new(CamelLinuxRuntimeTestSuite)) -} diff --git a/pkg/platform/runtime/camel_test.go b/pkg/platform/runtime/camel_test.go deleted file mode 100644 index cd5d539247..0000000000 --- a/pkg/platform/runtime/camel_test.go +++ /dev/null @@ -1,93 +0,0 @@ -package runtime_test - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/go-openapi/strfmt" - "github.com/stretchr/testify/suite" - - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/pkg/platform/runtime" -) - -type CamelRuntimeTestSuite struct { - suite.Suite -} - -func (suite *CamelRuntimeTestSuite) genCacheDir() (string, func()) { - - cacheDir, err := ioutil.TempDir("", "cli-camel-cache-dir") - suite.Require().NoError(err, "cache dir created") - return cacheDir, func() { os.RemoveAll(cacheDir) } -} - -func (suite *CamelRuntimeTestSuite) Test_InitializeWithInvalidArtifacts() { - - invalidExtension, _ := headchefArtifact("invalid-artifact.unknown") - testArtifact, _ := headchefArtifact("invalid-artifact-tests.tar.gz") - noURIArtifact, _ := headchefArtifact("") - - cacheDir, cacheCleanup := suite.genCacheDir() - defer cacheCleanup() - - _, err := runtime.NewCamelInstall(strfmt.UUID(""), cacheDir, []*runtime.HeadChefArtifact{ - invalidExtension, - testArtifact, - noURIArtifact, - }) - errt := &runtime.ErrInvalidArtifact{} - suite.Error(err, &errt) -} - -func (suite *CamelRuntimeTestSuite) Test_PreUnpackArtifact() { - cacheDir, cacheCleanup := suite.genCacheDir() - defer cacheCleanup() - - cases := []struct { - name string - prepFunc func(installDir string) - expectedError error - }{ - {"InstallationDirectoryIsFile", func(installDir string) { - baseDir := filepath.Dir(installDir) - err := fileutils.MkdirUnlessExists(baseDir) - suite.Require().NoError(err) - err = ioutil.WriteFile(installDir, []byte{}, 0666) - suite.Require().NoError(err) - }, &runtime.ErrInstallDirInvalid{}}, - {"InstallationDirectoryIsNotEmpty", func(installDir string) { - err := fileutils.MkdirUnlessExists(installDir) - suite.Require().NoError(err) - err = ioutil.WriteFile(filepath.Join(installDir, "dummy"), []byte{}, 0666) - suite.Require().NoError(err) - }, nil}, - {"InstallationDirectoryIsOkay", func(installDir string) {}, nil}, - } - - archivePath := "does-not-matter-here" + camelInstallerExtension() - artifact, _ := headchefArtifact(archivePath) - for _, tc := range cases { - suite.Run(tc.name, func() { - cr, err := runtime.NewCamelInstall(strfmt.UUID(""), cacheDir, []*runtime.HeadChefArtifact{artifact}) - suite.Require().NoError(err) - - os.RemoveAll(cacheDir) - defer os.RemoveAll(cacheDir) - - tc.prepFunc(cacheDir) - err = cr.PreUnpackArtifact(artifact) - if tc.expectedError == nil { - suite.Require().NoError(err) - } else { - suite.ErrorAs(err, &tc.expectedError) - } - }) - } -} - -func Test_CamelRuntimeTestSuite(t *testing.T) { - suite.Run(t, new(CamelRuntimeTestSuite)) -} diff --git a/pkg/platform/runtime/download.go b/pkg/platform/runtime/download.go deleted file mode 100644 index b44777f215..0000000000 --- a/pkg/platform/runtime/download.go +++ /dev/null @@ -1,228 +0,0 @@ -package runtime - -import ( - "errors" - "net/url" - "path" - "path/filepath" - - "github.com/go-openapi/strfmt" - - "github.com/ActiveState/cli/internal/analytics" - "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/download" - "github.com/ActiveState/cli/internal/errs" - "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/logging" - "github.com/ActiveState/cli/internal/progress" - "github.com/ActiveState/cli/pkg/platform/api" - "github.com/ActiveState/cli/pkg/platform/api/buildlogstream" - "github.com/ActiveState/cli/pkg/platform/api/headchef" - "github.com/ActiveState/cli/pkg/platform/api/headchef/headchef_models" - "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models" - "github.com/ActiveState/cli/pkg/platform/api/mono/mono_models" - "github.com/ActiveState/cli/pkg/platform/authentication" - "github.com/ActiveState/cli/pkg/platform/model" - "github.com/ActiveState/cli/pkg/project" -) - -// ensure that Downloader implements the Download interface -var _ Downloader = &Download{} - -// InstallerTestsSubstr is used to exclude test artifacts, we don't care about them -const InstallerTestsSubstr = "-tests." - -type ErrNoCommit struct{ *locale.LocalizedError } - -type ErrInvalidArtifact struct{ *locale.LocalizedError } - -// HeadChefArtifact is a convenient type alias cause swagger generates some really shitty code -type HeadChefArtifact = headchef_models.Artifact - -// FetchArtifactsResult stores the information needed by the installer to -// install and assemble a runtime environment. -// This information is extracted from a build request response in the -// FetchArtifacts() method -type FetchArtifactsResult struct { - BuildEngine BuildEngine - Artifacts []*HeadChefArtifact - RecipeID strfmt.UUID -} - -// DownloadDirectoryProvider provides download directories for individual artifacts -type DownloadDirectoryProvider interface { - - // DownloadDirectory returns the download path for a given artifact - DownloadDirectory(artf *HeadChefArtifact) (string, error) -} - -// Downloader defines the behavior required to be a runtime downloader. -type Downloader interface { - // Download will attempt to download some runtime locally and return back the filename of - // the downloaded archive or a Failure. - Download(artifacts []*HeadChefArtifact, d DownloadDirectoryProvider, progress *progress.Progress) (files map[string]*HeadChefArtifact, err error) - - // FetchArtifacts will fetch artifact - FetchArtifacts(recipe *inventory_models.Recipe, project *mono_models.Project) (*FetchArtifactsResult, error) -} - -// Download is the main struct for orchestrating the download of all the artifacts belonging to a runtime -type Download struct { - runtime *Runtime - orgID string - private bool -} - -// NewDownload creates a new RuntimeDownload using all custom args -func NewDownload(runtime *Runtime) Downloader { - return &Download{ - runtime: runtime, - } -} - -// FetchArtifacts will retrieve artifact information from the head-chef (eg language installers) -// The first return argument specifies whether we are dealing with an alternative build -func (r *Download) FetchArtifacts(recipe *inventory_models.Recipe, platProj *mono_models.Project) (*FetchArtifactsResult, error) { - result := &FetchArtifactsResult{} - - buildAnnotations := headchef.BuildAnnotations{ - CommitID: r.runtime.CommitID().String(), - Project: r.runtime.ProjectName(), - Organization: r.runtime.Owner(), - } - - orgID := strfmt.UUID(constants.ValidZeroUUID) - projectID := strfmt.UUID(constants.ValidZeroUUID) - if platProj != nil { - orgID = platProj.OrganizationID - projectID = platProj.ProjectID - } - - logging.Debug("sending request to head-chef") - buildRequest, err := headchef.NewBuildRequest(*recipe.RecipeID, orgID, projectID, buildAnnotations) - if err != nil { - return result, err - } - buildStatus := headchef.InitClient().RequestBuild(buildRequest) - - for { - select { - case resp := <-buildStatus.Completed: - if len(resp.Artifacts) == 0 { - return result, locale.NewInputError("err_no_artifacts") - } - - result.BuildEngine = BuildEngineFromResponse(resp) - if result.BuildEngine == UnknownEngine { - return result, locale.NewError("installer_err_engine_unknown") - } - - if resp.RecipeID == nil { - return result, locale.NewError("err_corrupted_build_request_response") - } - result.RecipeID = *resp.RecipeID - result.Artifacts = resp.Artifacts - logging.Debug("request engine=%v, recipeID=%s", result.BuildEngine, result.RecipeID.String()) - return result, nil - - case msg := <-buildStatus.Failed: - logging.Debug("BuildFailed: %s", msg) - return result, locale.NewInputError("build_status_failed", "", r.projectURL(), msg) - - case resp := <-buildStatus.Started: - analytics.Event(catRuntime, actBuild) - - logging.Debug("BuildStarted") - namespaced := project.Namespaced{ - Owner: r.runtime.owner, - Project: r.runtime.projectName, - } - analytics.EventWithLabel( - analytics.CatBuild, analytics.ActBuildProject, namespaced.String(), - ) - - // For non-alternate builds we do not support in-progress builds - engine := BuildEngineFromResponse(resp) - if engine != Alternative && engine != Hybrid { - return result, locale.NewInputError("build_status_in_progress", "", r.projectURL()) - } - - if err := r.waitForArtifacts(recipe); err != nil { - return nil, locale.WrapError(err, "err_wait_artifacts", "Error happened while waiting for packages") - } - return r.FetchArtifacts(recipe, platProj) - - case err := <-buildStatus.RunError: - logging.Debug("Failure: %v", err) - - switch { - case errors.Is(err, headchef.ErrBuildResp): - return result, locale.WrapError(err, "build_status_unknown_error", "", err.Error(), r.projectURL()) - default: - return result, locale.WrapError(err, "build_status_unknown", "", r.projectURL()) - } - } - } -} - -func (r *Download) waitForArtifacts(recipe *inventory_models.Recipe) error { - logstream := buildlogstream.NewRequest(recipe, r.runtime.msgHandler) - if err := logstream.Wait(); err != nil { - return errs.Wrap(err, "Error happened while waiting for builds to complete") - } - - return nil -} - -func (r *Download) projectURL() string { - url := api.GetServiceURL(api.ServiceHeadChef) - url.Path = path.Join(r.runtime.owner, r.runtime.projectName) - return url.String() -} - -// Download is the main function used to kick off the runtime download -func (r *Download) Download(artifacts []*HeadChefArtifact, dp DownloadDirectoryProvider, progress *progress.Progress) (files map[string]*HeadChefArtifact, err error) { - files = map[string]*HeadChefArtifact{} - entries := []*download.Entry{} - - for _, artf := range artifacts { - artifactURL, err := url.Parse(artf.URI.String()) - if err != nil { - return files, locale.NewError("err_artifact_invalid_url") - } - u, err := model.SignS3URL(artifactURL) - if err != nil { - return files, err - } - - // Ideally we'd be passing authentication down the chain somehow, but for now this would require way too much - // additional plumbing, so we're going to use the global version until the higher level architecture is refactored - auth := authentication.Get() - uid := "00000000-0000-0000-0000-000000000000" - if auth.Authenticated() { - uid = auth.UserID().String() - } - - q := u.Query() - q.Set("x-uuid", uid) // x-uuid is used so our analytics can filter out activator traffic - - // Disabled for now as `x-` seems to interact with signing negatively - // And adding it to the URL to be signed just drops it from the resulting URL - // u.RawQuery = q.Encode() - - targetDir, err := dp.DownloadDirectory(artf) - if err != nil { - return files, err - } - - targetPath := filepath.Join(targetDir, filepath.Base(u.Path)) - entries = append(entries, &download.Entry{ - Path: targetPath, - Download: u.String(), - }) - files[targetPath] = artf - } - - downloader := download.New(entries, 1, progress) - return files, downloader.Download() -} diff --git a/pkg/platform/runtime/envdef/environment.go b/pkg/platform/runtime/envdef/environment.go index dcfad90882..57653f40bb 100644 --- a/pkg/platform/runtime/envdef/environment.go +++ b/pkg/platform/runtime/envdef/environment.go @@ -113,13 +113,22 @@ func NewEnvironmentDefinition(fp string) (*EnvironmentDefinition, error) { // WriteFile marshals an environment definition to a file func (ed *EnvironmentDefinition) WriteFile(filepath string) error { - blob, err := json.MarshalIndent(ed, "", " ") + blob, err := ed.Marshal() if err != nil { return err } return ioutil.WriteFile(filepath, blob, 0666) } +// WriteFile marshals an environment definition to a file +func (ed *EnvironmentDefinition) Marshal() ([]byte, error) { + blob, err := json.MarshalIndent(ed, "", " ") + if err != nil { + return []byte(""), err + } + return blob, nil +} + // ExpandVariables expands substitution strings specified in the environment variable values. // Right now, the only valid substition string is `${INSTALLDIR}` which is being replaced // with the base of the installation directory for a given project @@ -323,7 +332,10 @@ func (ed *EnvironmentDefinition) GetEnvBasedOn(envLookup func(string) (string, b } } } - res[pev.Name] = pev.ValueString() + // only add environment variable if at least one value is set (This allows us to remove variables from the environment.) + if len(ev.Values) > 0 { + res[pev.Name] = pev.ValueString() + } } return res, nil } diff --git a/pkg/platform/runtime/envdef/file_transform.go b/pkg/platform/runtime/envdef/file_transform.go index 19782e76ba..cb11bd77c4 100644 --- a/pkg/platform/runtime/envdef/file_transform.go +++ b/pkg/platform/runtime/envdef/file_transform.go @@ -83,11 +83,10 @@ func (ft *FileTransform) relocateFile(fileBytes []byte, replacement string) ([]b quoteEscapeFind := regexp.QuoteMeta(ft.Pattern) // replacementRegex matches the search Pattern plus subsequent text up to the string termination character (pad, which usually is 0x00) - replacementRegex, err := regexp.Compile(fmt.Sprintf(`%s([^\\x%02x]*)`, quoteEscapeFind, pad)) + replacementRegex, err := regexp.Compile(fmt.Sprintf(`%s([^\x%02x]*)`, quoteEscapeFind, pad)) if err != nil { return fileBytes, errs.Wrap(err, "Failed to compile replacement regular expression.") } - return replacementRegex.ReplaceAll(fileBytes, paddedReplaceBytes), nil } @@ -135,9 +134,9 @@ func (ft *FileTransform) ApplyTransform(baseDir string, constants Constants) err } // ApplyFileTransforms applies all file transformations to the files in the base directory -func (ed *EnvironmentDefinition) ApplyFileTransforms(baseDir string, constants Constants) error { +func (ed *EnvironmentDefinition) ApplyFileTransforms(installDir string, constants Constants) error { for _, ft := range ed.Transforms { - err := ft.ApplyTransform(filepath.Join(baseDir, ed.InstallDir), constants) + err := ft.ApplyTransform(installDir, constants) if err != nil { return err } diff --git a/pkg/platform/runtime/envdef/file_transform_test.go b/pkg/platform/runtime/envdef/file_transform_test.go index 97604460f4..89d118f6aa 100644 --- a/pkg/platform/runtime/envdef/file_transform_test.go +++ b/pkg/platform/runtime/envdef/file_transform_test.go @@ -20,11 +20,11 @@ func TestRelocateFile(t *testing.T) { }{ { "null-padded", "/ghi", &nullCharacter, false, - "/ghi/something/else\u0000\u0000\u0000\u0000", + "/ghi/something/else\u0000\u0000\u0000\u0000text\u0000", }, { "text-only", "/ghi", nil, false, - "/ghi/something/else\u0000", + "/ghi/something/else\u0000text\u0000", }, { "invalid-padding", "/ghi", &invalidPad, true, "", @@ -42,12 +42,12 @@ func TestRelocateFile(t *testing.T) { PadWith: c.PadWith, } - res, err := ft.relocateFile([]byte("/abcdef/something/else\u0000"), c.Replacement) + res, err := ft.relocateFile([]byte("/abcdef/something/else\u0000text\u0000"), c.Replacement) if c.HasError != (err != nil) { tt.Fatalf("relocateFile returned with err: %v", err) } if err == nil { - assert.Equal(tt, res, []byte(c.Expected)) + assert.Equal(tt, []byte(c.Expected), res) } }) } diff --git a/pkg/platform/runtime/hybrid.go b/pkg/platform/runtime/hybrid.go deleted file mode 100644 index e6f8d543d7..0000000000 --- a/pkg/platform/runtime/hybrid.go +++ /dev/null @@ -1,20 +0,0 @@ -package runtime - -var _ EnvGetter = &HybridRuntime{} -var _ Assembler = &HybridInstall{} - -// HybridRuntime holds all the meta-data necessary to activate a runtime -// environment for a Hybrid build. It is currently leveraging the behavior of -// CamelRuntime. -type HybridRuntime struct { - *CamelEnv -} - -type HybridInstall struct { - *CamelInstall -} - -// BuildEngine always returns Hybrid -func (hr *HybridInstall) BuildEngine() BuildEngine { - return Hybrid -} diff --git a/pkg/platform/runtime/installer.go b/pkg/platform/runtime/installer.go deleted file mode 100644 index 8e127d44f1..0000000000 --- a/pkg/platform/runtime/installer.go +++ /dev/null @@ -1,491 +0,0 @@ -package runtime - -import ( - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strings" - - "github.com/go-openapi/strfmt" - "github.com/gobuffalo/packr" - "github.com/google/uuid" - "github.com/vbauerster/mpb/v4" - - "github.com/ActiveState/cli/internal/analytics" - "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/errs" - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/logging" - "github.com/ActiveState/cli/internal/progress" - "github.com/ActiveState/cli/internal/strutils" - "github.com/ActiveState/cli/internal/unarchiver" - "github.com/ActiveState/cli/pkg/platform/api/buildlogstream" - "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models" - "github.com/ActiveState/cli/pkg/platform/api/mono/mono_models" - "github.com/ActiveState/cli/pkg/platform/model" -) - -// runtime analytics values -const ( - catRuntime = "runtime" - actStart = "start" - actBuild = "build" - actDownload = "download" - actCache = "cache" - actSuccess = "success" - actFailure = "failure" - lblAssembler = "assembler" - lblEnv = "env" - lblArtifacts = "install-artifacts" -) - -// During installation after all files are unpacked to a temporary directory, the progress bar should advanced this much. -// This leaves room to advance the progress bar further while renaming strings in the unpacked files. -const percentReportedAfterUnpack = 85 - -type ErrInstallDirInvalid struct{ *locale.LocalizedError } - -type ErrArchiveInvalid struct{ *locale.LocalizedError } - -type ErrPrePlatform struct{ *locale.LocalizedError } - -type ErrNotExecutable struct{ *locale.LocalizedError } - -type ErrNoPrefixes struct{ *locale.LocalizedError } - -type MessageHandler interface { - buildlogstream.MessageHandler - ChangeSummary(map[strfmt.UUID][]strfmt.UUID, map[strfmt.UUID][]strfmt.UUID, map[strfmt.UUID]*inventory_models.ResolvedIngredient) - DownloadStarting() - InstallStarting() -} - -// Installer implements an Installer that works with a runtime.Downloader and a -// runtime.Installer. Effectively, upon calling Install, the Installer will first -// try and Download an archive, then it will try to install that downloaded archive. -type Installer struct { - runtime *Runtime - runtimeDownloader Downloader - envAccessed bool -} - -// NewInstaller creates a new RuntimeInstaller -func NewInstaller(runtime *Runtime) *Installer { - installer := &Installer{ - runtime: runtime, - runtimeDownloader: NewDownload(runtime), - envAccessed: false, - } - - return installer -} - -// Install will download the installer archive and invoke InstallFromArchive -func (installer *Installer) Install() (envGetter EnvGetter, freshInstallation bool, err error) { - if installer.runtime.IsCachedRuntime() { - ar, err := installer.RuntimeEnv() - if err == nil { - return ar, true, nil - } - logging.Error("Failed to retrieve cached assembler: %v", err) - } - assembler, err := installer.Assembler() - if err != nil { - analytics.EventWithLabel(catRuntime, actFailure, lblAssembler) - return nil, false, err - } - - eg, fresh, err := installer.InstallArtifacts(assembler) - if err != nil { - analytics.EventWithLabel(catRuntime, actFailure, lblArtifacts) - } else { - analytics.Event(catRuntime, actSuccess) - } - return eg, fresh, err -} - -// Env will grab the environment information for the given runtime. This will request build info. -func (installer *Installer) Env() (envGetter EnvGetter, err error) { - if installer.runtime.IsCachedRuntime() { - ar, err := installer.RuntimeEnv() - if err == nil { - return ar, nil - } - logging.Error("Failed to retrieve cached assembler: %v", err) - } - return installer.Assembler() -} - -// IsInstalled will check if the installer has already ran (ie. the artifacts already exist at the target dir) -func (installer *Installer) IsInstalled() (bool, error) { - if installer.runtime.IsCachedRuntime() { - return true, nil - } - assembler, err := installer.Assembler() - if err != nil { - return false, err - } - - return assembler.IsInstalled(), nil -} - -// RuntimeEnv returns the runtime environment specialization all constructed from cached values -func (installer *Installer) RuntimeEnv() (EnvGetter, error) { - r, err := installer.runtimeEnv() - if !installer.envAccessed { - if err == nil { - analytics.Event(catRuntime, actSuccess) - } else { - analytics.EventWithLabel(catRuntime, actFailure, lblEnv) - } - } - installer.envAccessed = true - return r, err -} - -func (installer *Installer) runtimeEnv() (EnvGetter, error) { - buildEngine, err := installer.runtime.BuildEngine() - if err != nil { - return nil, locale.WrapError(err, "installer_err_engine_unknown") - } - switch buildEngine { - case Alternative: - return NewAlternativeEnv(installer.runtime.runtimeDir) - case Camel: - return NewCamelEnv(installer.runtime.commitID, installer.runtime.runtimeDir) - case Hybrid: - cr, err := NewCamelEnv(installer.runtime.commitID, installer.runtime.runtimeDir) - if err != nil { - return nil, err - } - - return &HybridRuntime{cr}, nil - default: - return nil, locale.NewError("installer_err_engine_unknown") - } -} - -// Assembler returns a new runtime assembler for the given checkpoint and artifacts -func (installer *Installer) Assembler() (Assembler, error) { - if err := installer.validateCheckpoint(); err != nil { - return nil, err - } - - var project *mono_models.Project - if installer.runtime.Owner() != "" && installer.runtime.ProjectName() != "" { - var err error - project, err = model.FetchProjectByName(installer.runtime.Owner(), installer.runtime.ProjectName()) - if err != nil { - return nil, errs.Wrap(err, "Fetch project failed") - } - } - - recipe, err := model.ResolveRecipe(installer.runtime.commitID, installer.runtime.owner, installer.runtime.projectName, project) - if err != nil { - return nil, errs.Wrap(err, "ResolveRecipe failed") - } - - // Run Change Summary - ingredientMap := model.IngredientVersionMap(recipe) - directDeps, recursiveDeps := model.ParseDepTree(recipe.ResolvedIngredients, ingredientMap) - installer.runtime.msgHandler.ChangeSummary(directDeps, recursiveDeps, ingredientMap) - - artifacts, err := installer.runtimeDownloader.FetchArtifacts(recipe, project) - if err != nil { - return nil, err - } - - switch artifacts.BuildEngine { - case Alternative: - return NewAlternativeInstall(installer.runtime.runtimeDir, artifacts.Artifacts, artifacts.RecipeID) - case Camel: - return NewCamelInstall(installer.runtime.commitID, installer.runtime.runtimeDir, artifacts.Artifacts) - case Hybrid: - ci, err := NewCamelInstall(installer.runtime.commitID, installer.runtime.runtimeDir, artifacts.Artifacts) - if err != nil { - return nil, err - } - - return &HybridInstall{ci}, nil - default: - return nil, locale.NewError("installer_err_engine_unknown") - } -} - -// InstallArtifacts installs all artifacts provided by a runtime assembler -func (installer *Installer) InstallArtifacts(runtimeAssembler Assembler) (envGetter EnvGetter, freshInstallation bool, err error) { - if runtimeAssembler.IsInstalled() { - // write complete marker and build engine files in case they don't exist yet - err := installer.runtime.MarkInstallationComplete() - if err != nil { - return nil, false, locale.WrapError(err, "installer_mark_complete_err", "Failed to mark the installation as complete.") - } - err = installer.runtime.StoreBuildEngine(runtimeAssembler.BuildEngine()) - if err != nil { - return nil, false, locale.WrapError(err, "installer_store_build_engine_err", "Failed to store build engine value.") - } - - logging.Debug("runtime already successfully installed") - return runtimeAssembler, false, nil - } - - downloadArtfs := runtimeAssembler.ArtifactsToDownload() - unpackArchives := map[string]*HeadChefArtifact{} - - progressOut := os.Stderr - if strings.ToLower(os.Getenv(constants.NonInteractive)) == "true" { - progressOut = nil - } - - downloadProgress := progress.New(mpb.WithOutput(progressOut)) - if len(downloadArtfs) != 0 { - if installer.runtime.msgHandler != nil { - installer.runtime.msgHandler.DownloadStarting() - } - - if len(downloadArtfs) > 0 { - analytics.Event(catRuntime, actDownload) - - archives, err := installer.runtimeDownloader.Download(downloadArtfs, runtimeAssembler, downloadProgress) - if err != nil { - downloadProgress.Cancel() - downloadProgress.Close() - return nil, false, err - } - - for k, v := range archives { - unpackArchives[k] = v - } - } - } - downloadProgress.Close() - - if installer.runtime.msgHandler != nil { - installer.runtime.msgHandler.InstallStarting() - } - - installProgress := progress.New(mpb.WithOutput(progressOut)) - err = installer.InstallFromArchives(unpackArchives, runtimeAssembler, installProgress) - if err != nil { - installProgress.Cancel() - installProgress.Close() - return nil, false, err - } - installProgress.Close() - - // We still want to run PostInstall because even though no new artifact might be downloaded we still might be - // deleting some already cached ones - err = runtimeAssembler.PostInstall() - if err != nil { - return nil, false, errs.Wrap(err, "error during post installation step") - } - - err = installer.runtime.StoreBuildEngine(runtimeAssembler.BuildEngine()) - if err != nil { - return nil, false, locale.WrapError(err, "installer_store_build_engine_err", "Failed to store build engine value.") - } - - err = installer.runtime.MarkInstallationComplete() - if err != nil { - return nil, false, errs.Wrap(err, "error marking installation as complete") - } - - return runtimeAssembler, true, nil -} - -// validateCheckpoint tries to see if the checkpoint has any chance of succeeding -func (installer *Installer) validateCheckpoint() error { - if installer.runtime.commitID == "" { - return &ErrNoCommit{locale.NewInputError("installer_err_runtime_no_commitid")} - } - - checkpoint, _, err := model.FetchCheckpointForCommit(installer.runtime.commitID) - if err != nil { - return err - } - - for _, change := range checkpoint { - if model.NamespaceMatch(change.Namespace, model.NamespacePrePlatformMatch) { - return &ErrPrePlatform{locale.NewInputError("installer_err_runtime_preplatform")} - } - } - - return nil -} - -// InstallFromArchives will unpack the installer archive, locate the install script, and then use the installer -// script to install a runtime to the configured runtime dir. Any failures during this process will result in a -// failed installation and the install-dir being removed. -func (installer *Installer) InstallFromArchives(archives map[string]*HeadChefArtifact, a Assembler, pg *progress.Progress) error { - var bar *progress.TotalBar - if len(archives) > 0 { - bar = pg.AddTotalBar(locale.T("installing"), len(archives)) - } - - err := a.PreInstall() - if err != nil { - pg.Cancel() - return err - } - - for archivePath, artf := range archives { - if err := installer.InstallFromArchive(archivePath, artf, a, pg); err != nil { - pg.Cancel() - return err - } - bar.Increment() - } - - return nil -} - -// InstallFromArchive will unpack artifact and install it -func (installer *Installer) InstallFromArchive(archivePath string, artf *HeadChefArtifact, a Assembler, progress *progress.Progress) error { - - err := a.PreUnpackArtifact(artf) - if err != nil { - return err - } - - installDir := installer.runtime.runtimeDir - tmpRuntimeDir, upb, err := installer.unpackArchive(a.Unarchiver(), archivePath, installDir, progress) - if err != nil { - removeInstallDir(installDir) - return err - } - - err = a.PostUnpackArtifact(artf, tmpRuntimeDir, archivePath, func() { upb.Increment() }) - if err != nil { - removeInstallDir(installDir) - return err - } - upb.Complete() - - return nil -} - -func (installer *Installer) unpackArchive(ua unarchiver.Unarchiver, archivePath string, installDir string, p *progress.Progress) (string, *progress.UnpackBar, error) { - if err := installer.validateArchive(ua, archivePath); err != nil { - return "", nil, err - } - - tmpRuntimeDir := filepath.Join(installDir, uuid.New().String()) - - logging.Debug("Unarchiving %s", archivePath) - - // During unpacking we count the number of files to unpack - var numUnpackedFiles int - ua.SetNotifier(func(_ string, _ int64, isDir bool) { - if !isDir { - numUnpackedFiles++ - } - }) - - // Prepare destination directory and open the archive file - archiveFile, archiveSize, err := ua.PrepareUnpacking(archivePath, tmpRuntimeDir) - logging.Debug("Unarchiving %s -> %s %d\n\n\n", archivePath, tmpRuntimeDir, archiveSize) - if err != nil { - return tmpRuntimeDir, nil, &ErrArchiveInvalid{locale.WrapError(err, "err_unpack_prepare", "Could not prepare archive directory")} - - } - defer archiveFile.Close() - - // create an unpack bar and wrap the archiveFile, when we are done unpacking the - // bar should say `percentReportedAfterUnpack`%. - upb := p.AddUnpackBar(archiveSize, percentReportedAfterUnpack) - wrappedStream := progress.NewReaderProxy(upb.Bar(), upb, archiveFile) - - // unpack it - logging.Debug("Unarchiving to: %s", tmpRuntimeDir) - err = ua.Unarchive(wrappedStream, archiveSize, tmpRuntimeDir) - if err != nil { - return tmpRuntimeDir, nil, &ErrArchiveInvalid{locale.WrapError(err, "err_unpack", "Unarchiving failed")} - } - - // report that we are unpacked. - upb.Complete() - - logging.Debug("Unpacked %d files\n", numUnpackedFiles) - - // We rescale the progress bar, such that after all files are touched once, - // we reach 100% (touching here means, renaming strings in Relocate()) - upb.ReScale(numUnpackedFiles) - - return tmpRuntimeDir, upb, nil -} - -// validateArchive ensures the given path to archive is an actual file and that its suffix is a well-known -// suffix for tar+gz files. -func (installer *Installer) validateArchive(ua unarchiver.Unarchiver, archivePath string) error { - if !fileutils.FileExists(archivePath) { - return &ErrArchiveInvalid{locale.NewError("installer_err_archive_notfound", "", archivePath)} - } else if err := ua.CheckExt(archivePath); err != nil { - return &ErrArchiveInvalid{locale.WrapError(err, "installer_err_archive_badext", "", archivePath)} - } - return nil -} - -func removeInstallDir(installDir string) { - if err := os.RemoveAll(installDir); err != nil { - logging.Errorf("attempting to remove install dir '%s': %v", installDir, err) - } -} - -// installPPMShim installs an executable shell script and a BAT file that is executed instead of PPM in the specified path. -// It calls the `state _ppm` sub-command printing deprecation messages. -func installPPMShim(binPath string) error { - // remove old ppm command if it existed before - ppmExeName := "ppm" - if runtime.GOOS == "windows" { - ppmExeName = "ppm.exe" - } - ppmExe := filepath.Join(binPath, ppmExeName) - if fileutils.FileExists(ppmExe) { - err := os.Remove(ppmExe) - if err != nil { - return errs.Wrap(err, "failed to remove existing ppm %s", ppmExe) - } - } - - box := packr.NewBox("../../../assets/ppm") - ppmBytes := box.Bytes("ppm.sh") - shim := filepath.Join(binPath, "ppm") - // remove shim if it existed before, so we can overwrite (ok to drop error here) - _ = os.Remove(shim) - - exe, err := os.Executable() - if err != nil { - return errs.Wrap(err, "Could not get executable") - } - - tplParams := map[string]interface{}{"exe": exe} - ppmStr, err := strutils.ParseTemplate(string(ppmBytes), tplParams) - if err != nil { - return errs.Wrap(err, "Could not parse ppm.sh template") - } - - err = ioutil.WriteFile(shim, []byte(ppmStr), 0755) - if err != nil { - return errs.Wrap(err, "failed to write shim command %s", shim) - } - if runtime.GOOS == "windows" { - ppmBatBytes := box.Bytes("ppm.bat") - shim := filepath.Join(binPath, "ppm.bat") - // remove shim if it existed before, so we can overwrite (ok to drop error here) - _ = os.Remove(shim) - - ppmBatStr, err := strutils.ParseTemplate(string(ppmBatBytes), tplParams) - if err != nil { - return errs.Wrap(err, "Could not parse ppm.sh template") - } - - err = ioutil.WriteFile(shim, []byte(ppmBatStr), 0755) - if err != nil { - return errs.Wrap(err, "failed to write shim command %s", shim) - } - } - - return nil -} diff --git a/pkg/platform/runtime/installer_lin_test.go b/pkg/platform/runtime/installer_lin_test.go deleted file mode 100644 index d2010e9889..0000000000 --- a/pkg/platform/runtime/installer_lin_test.go +++ /dev/null @@ -1,151 +0,0 @@ -// +build linux - -package runtime_test - -// Tests in this file apply to all platforms, but mocking them again for each individual platform is a waste of time. -// It's fairly reliable to say that if a test here succeeds on linux it'll succeed on other platforms, and if it fails -// it'll fail on other platforms. -// I'm sure there'll be exceptions, but for the moment it just isn't worth the timesink to mock these for each platform. - -import ( - "fmt" - "io/ioutil" - "os" - "path" - "testing" - - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/suite" - - "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/environment" - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/locale" - "github.com/ActiveState/cli/internal/logging" - pMock "github.com/ActiveState/cli/internal/progress/mock" - "github.com/ActiveState/cli/internal/runbits" - "github.com/ActiveState/cli/internal/testhelpers/outputhelper" - "github.com/ActiveState/cli/internal/unarchiver" - "github.com/ActiveState/cli/pkg/platform/runtime" - rmock "github.com/ActiveState/cli/pkg/platform/runtime/mock" - "github.com/ActiveState/cli/pkg/projectfile" -) - -type InstallerLinuxTestSuite struct { - suite.Suite - - cacheDir string - dataDir string - installDir string - installer *runtime.Installer - rmock *rmock.Mock -} - -func (suite *InstallerLinuxTestSuite) BeforeTest(suiteName, testName string) { - root, err := environment.GetRootPath() - suite.Require().NoError(err, "failure obtaining root path") - - suite.dataDir = path.Join(root, "pkg", "platform", "runtime", "testdata") - - projectURL := fmt.Sprintf("https://%s/string/string?commitID=00010001-0001-0001-0001-000100010001", constants.PlatformURL) - pjfile := projectfile.Project{ - Project: projectURL, - } - pjfile.Persist() - - suite.cacheDir, err = ioutil.TempDir("", "cli-installer-test-cache") - suite.Require().NoError(err) - - suite.installDir, err = ioutil.TempDir("", "cli-installer-test-install") - suite.Require().NoError(err) - - msgHandler := runbits.NewRuntimeMessageHandler(&outputhelper.TestOutputer{}) - r, err := runtime.NewRuntime("", suite.cacheDir, "00010001-0001-0001-0001-000100010001", "string", "string", msgHandler) - suite.Require().NoError(err) - r.SetInstallPath(suite.cacheDir) - suite.installer = runtime.NewInstaller(r) - suite.Require().NotNil(suite.installer) -} - -func (suite *InstallerLinuxTestSuite) AfterTest(suiteName, testName string) { - if err := os.RemoveAll(suite.cacheDir); err != nil { - logging.Warningf("Could not remove runtimeDir: %v\n", err) - } - if err := os.RemoveAll(suite.installDir); err != nil { - logging.Warningf("Could not remove installDir: %v\n", err) - } -} - -func (suite *InstallerLinuxTestSuite) setMocks(a *rmock.Assembler, unpackingOk bool) { - a.On("PreInstall").Return(nil) - a.On("PreUnpackArtifact", mock.Anything).Return(nil) - a.On("Unarchiver").Return(unarchiver.NewTarGz()) - if unpackingOk { - a.On("PostUnpackArtifact").Return(nil) - } -} -func (suite *InstallerLinuxTestSuite) TestInstall_ArchiveDoesNotExist() { - prg := pMock.NewTestProgress() - defer prg.Close() - mockAssembler := new(rmock.Assembler) - suite.setMocks(mockAssembler, false) - _, archives := headchefArtifact("/no/such/archive.tar.gz") - err := suite.installer.InstallFromArchives(archives, mockAssembler, prg.Progress) - - prg.AssertCloseAfterCancellation(suite.T()) - - mockAssembler.AssertExpectations(suite.T()) - - suite.Require().Error(err) - errt := &runtime.ErrArchiveInvalid{} - suite.ErrorAs(err, &errt) - suite.Equal(locale.Tr("installer_err_archive_notfound", "/no/such/archive.tar.gz"), err.Error()) -} - -func (suite *InstallerLinuxTestSuite) TestInstall_ArchiveNotTarGz() { - prg := pMock.NewTestProgress() - defer prg.Close() - - invalidArchive := path.Join(suite.dataDir, "empty.archive") - - err := fileutils.Touch(invalidArchive) - suite.Require().NoError(err) - - mockAssembler := new(rmock.Assembler) - suite.setMocks(mockAssembler, false) - - _, archives := headchefArtifact(invalidArchive) - - err = suite.installer.InstallFromArchives(archives, mockAssembler, prg.Progress) - - mockAssembler.AssertExpectations(suite.T()) - - prg.AssertCloseAfterCancellation(suite.T()) - suite.Require().Error(err) - errt := &runtime.ErrArchiveInvalid{} - suite.ErrorAs(err, &errt) - suite.Equal(locale.Tr("installer_err_archive_badext", invalidArchive), err.Error()) -} - -func (suite *InstallerLinuxTestSuite) TestInstall_BadArchive() { - prg := pMock.NewTestProgress() - defer prg.Close() - - badArchive := path.Join(suite.dataDir, "badarchive.tar.gz") - mockAssembler := new(rmock.Assembler) - suite.setMocks(mockAssembler, false) - - _, archives := headchefArtifact(badArchive) - err := suite.installer.InstallFromArchives(archives, mockAssembler, prg.Progress) - - prg.AssertCloseAfterCancellation(suite.T()) - - mockAssembler.AssertExpectations(suite.T()) - suite.Require().Error(err) - errt := &runtime.ErrArchiveInvalid{} - suite.ErrorAs(err, &errt) -} - -func Test_InstallerLinuxTestSuite(t *testing.T) { - suite.Run(t, new(InstallerLinuxTestSuite)) -} diff --git a/pkg/platform/runtime/installer_test.go b/pkg/platform/runtime/installer_test.go deleted file mode 100644 index 5fb4903f86..0000000000 --- a/pkg/platform/runtime/installer_test.go +++ /dev/null @@ -1,126 +0,0 @@ -package runtime_test - -import ( - "fmt" - "io/ioutil" - "os" - "path" - "path/filepath" - rt "runtime" - "testing" - - "github.com/go-openapi/strfmt" - "github.com/stretchr/testify/suite" - - "github.com/ActiveState/cli/internal/constants" - "github.com/ActiveState/cli/internal/environment" - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/logging" - pmock "github.com/ActiveState/cli/internal/progress/mock" - "github.com/ActiveState/cli/internal/runbits" - "github.com/ActiveState/cli/internal/testhelpers/outputhelper" - "github.com/ActiveState/cli/pkg/platform/runtime" - rmock "github.com/ActiveState/cli/pkg/platform/runtime/mock" - "github.com/ActiveState/cli/pkg/projectfile" -) - -type InstallerTestSuite struct { - suite.Suite - - dataDir string - cacheDir string - downloadDir string - installer *runtime.Installer - rmock *rmock.Mock - prg *pmock.TestProgress -} - -func (suite *InstallerTestSuite) BeforeTest(suiteName, testName string) { - root, err := environment.GetRootPath() - suite.Require().NoError(err, "failure obtaining root path") - - suite.dataDir = path.Join(root, "pkg", "platform", "runtime", "testdata") - - suite.rmock = rmock.Init() - suite.rmock.MockFullRuntime() - - projectURL := fmt.Sprintf("https://%s/string/string?commitID=00010001-0001-0001-0001-000100010001", constants.PlatformURL) - pjfile := projectfile.Project{ - Project: projectURL, - } - pjfile.Persist() - - suite.cacheDir, err = ioutil.TempDir("", "") - suite.Require().NoError(err) - - suite.downloadDir, err = ioutil.TempDir("", "cli-installer-test-download") - suite.Require().NoError(err) - - suite.prg = pmock.NewTestProgress() - - msgHandler := runbits.NewRuntimeMessageHandler(&outputhelper.TestOutputer{}) - r, err := runtime.NewRuntime("", suite.cacheDir, "00010001-0001-0001-0001-000100010001", "string", "string", msgHandler) - suite.Require().NoError(err) - r.SetInstallPath(suite.cacheDir) - suite.installer = runtime.NewInstaller(r) - suite.Require().NotNil(suite.installer) -} - -func (suite *InstallerTestSuite) AfterTest(suiteName, testName string) { - suite.rmock.Close() - if err := os.RemoveAll(suite.cacheDir); err != nil { - logging.Warningf("Could not remove runtimeDir: %v\n", err) - } - if err := os.RemoveAll(suite.downloadDir); err != nil { - logging.Warningf("Could not remove downloadDir: %v\n", err) - } - suite.prg.Close() -} - -func (suite *InstallerTestSuite) testRelocation(archiveName string, executable string) { - archive := archiveName + camelInstallerExtension() - - artifact, archives := headchefArtifact(path.Join(suite.dataDir, archive)) - - envGetter, err := runtime.NewCamelInstall(strfmt.UUID(""), suite.cacheDir, []*runtime.HeadChefArtifact{artifact}) - suite.Require().NoError(err, "camel runtime assembler initialized") - suite.Require().NotEmpty(suite.cacheDir, "Installs artifacts") - - err = suite.installer.InstallFromArchives(archives, envGetter, suite.prg.Progress) - suite.Require().NoError(err) - - suite.prg.AssertProperClose(suite.T()) - - pathToExecutable := filepath.Join(suite.cacheDir, "bin", executable) - suite.Require().FileExists(pathToExecutable, executable+" exists") - - ascriptContents := string(fileutils.ReadFileUnsafe(path.Join(suite.cacheDir, "bin", "a-script"))) - suite.Contains(ascriptContents, pathToExecutable) -} - -func (suite *InstallerTestSuite) TestInstall_Python_RelocationSuccessful() { - suite.testRelocation("python-good-installer", constants.ActivePython3Executable) -} - -func (suite *InstallerTestSuite) TestInstall_Python_Legacy_RelocationSuccessful() { - if rt.GOOS == "darwin" { - suite.T().Skip("Our macOS Python builds do not use relocation, so this will fail if it has to auto detect relocation paths") - } - suite.testRelocation("python-good-installer-nometa", constants.ActivePython3Executable) -} - -func (suite *InstallerTestSuite) TestInstall_Perl_RelocationSuccessful() { - suite.testRelocation("perl-good-installer", constants.ActivePerlExecutable) -} - -func (suite *InstallerTestSuite) TestInstall_Perl_Legacy_RelocationSuccessful() { - if rt.GOOS == "darwin" { - suite.T().Skip("PERL NOT YET SUPPORTED ON MAC") - return - } - suite.testRelocation("perl-good-installer-nometa", constants.ActivePerlExecutable) -} - -func Test_InstallerTestSuite(t *testing.T) { - suite.Run(t, new(InstallerTestSuite)) -} diff --git a/pkg/platform/runtime/internal_test.go b/pkg/platform/runtime/internal_test.go deleted file mode 100644 index b5ee32fd5a..0000000000 --- a/pkg/platform/runtime/internal_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package runtime - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "strings" - "testing" - - "github.com/go-openapi/strfmt" - "github.com/stretchr/testify/suite" - - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/testhelpers/httpmock" - "github.com/ActiveState/cli/pkg/platform/api" - graphMock "github.com/ActiveState/cli/pkg/platform/api/graphql/request/mock" - "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models" - authMock "github.com/ActiveState/cli/pkg/platform/authentication/mock" - "github.com/ActiveState/cli/pkg/platform/model" - "github.com/ActiveState/cli/pkg/projectfile" -) - -type InternalTestSuite struct { - suite.Suite - - cacheDir string - downloadDir string - installer *Installer - authMock *authMock.Mock - httpmock *httpmock.HTTPMock - graphMock *graphMock.Mock -} - -type MessageHandlerMock struct{} - -func (m MessageHandlerMock) BuildStarting(totalArtifacts int) {} -func (m MessageHandlerMock) BuildFinished() {} -func (m MessageHandlerMock) ArtifactBuildStarting(artifactName string) {} -func (m MessageHandlerMock) ArtifactBuildCached(artifactName string) {} -func (m MessageHandlerMock) ArtifactBuildCompleted(artifactName string, number, total int) {} -func (m MessageHandlerMock) ArtifactBuildFailed(artifactName string, errorMsg string) {} - -func (m MessageHandlerMock) ChangeSummary(map[strfmt.UUID][]strfmt.UUID, map[strfmt.UUID][]strfmt.UUID, map[strfmt.UUID]*inventory_models.ResolvedIngredient) { -} -func (m MessageHandlerMock) DownloadStarting() {} -func (m MessageHandlerMock) InstallStarting() {} - -func (suite *InternalTestSuite) BeforeTest(suiteName, testName string) { - suite.authMock = authMock.Init() - suite.authMock.MockLoggedin() - suite.httpmock = httpmock.Activate(api.GetServiceURL(api.ServiceMono).String()) - - pjfile := projectfile.Project{ - Project: model.ProjectURL("string", "string", "00010001-0001-0001-0001-000100010001"), - } - pjfile.Persist() - - var err error - suite.cacheDir, err = ioutil.TempDir("", "") - suite.Require().NoError(err) - - suite.downloadDir, err = ioutil.TempDir("", "cli-installer-test-download") - suite.Require().NoError(err) - - msgHandler := MessageHandlerMock{} - r, err := NewRuntime("", suite.cacheDir, "00010001-0001-0001-0001-000100010001", "string", "string", msgHandler) - suite.Require().NoError(err) - r.SetInstallPath(suite.cacheDir) - suite.installer = NewInstaller(r) - suite.Require().NotNil(suite.installer) - - suite.graphMock = graphMock.Init() -} - -func (suite *InternalTestSuite) AfterTest(suiteName, testName string) { - projectfile.Reset() - suite.authMock.Close() - httpmock.DeActivate() - suite.graphMock.Close() -} - -func (suite *InternalTestSuite) TestValidateCheckpointNoCommit() { - msgHandler := MessageHandlerMock{} - r, err := NewRuntime("", suite.cacheDir, "", "string", "string", msgHandler) - suite.Require().NoError(err) - r.SetInstallPath(suite.cacheDir) - suite.installer = NewInstaller(r) - suite.Require().NotNil(suite.installer) - - err = suite.installer.validateCheckpoint() - errt := &ErrNoCommit{} - suite.ErrorAs(err, &errt) -} - -func (suite *InternalTestSuite) TestValidateCheckpointPrePlatform() { - suite.graphMock.CheckpointWithPrePlatform(graphMock.NoOptions) - err := suite.installer.validateCheckpoint() - errt := &ErrPrePlatform{} - suite.ErrorAs(err, &errt) -} - -func (suite *InternalTestSuite) TestPPMShim() { - dir := fileutils.TempDirUnsafe() - err := installPPMShim(dir) - suite.Require().NoError(err) - - exe, err := os.Executable() - suite.Require().NoError(err) - - suite.FileExists(filepath.Join(dir, "ppm")) - p := string(fileutils.ReadFileUnsafe(filepath.Join(dir, "ppm"))) - suite.True(strings.Index(p, exe) != -1, fmt.Sprintf("%s should contain %s", p, exe)) - if runtime.GOOS == "windows" { - suite.FileExists(filepath.Join(dir, "ppm.bat")) - p = string(fileutils.ReadFileUnsafe(filepath.Join(dir, "ppm.bat"))) - suite.True(strings.Index(p, exe) != -1, fmt.Sprintf("%s should contain %s", p, exe)) - } - -} - -func TestInternalTestSuite(t *testing.T) { - suite.Run(t, new(InternalTestSuite)) -} diff --git a/pkg/platform/runtime/legacy.go b/pkg/platform/runtime/legacy.go new file mode 100644 index 0000000000..5d660e6c2f --- /dev/null +++ b/pkg/platform/runtime/legacy.go @@ -0,0 +1,41 @@ +package runtime + +import ( + "bytes" + "html/template" + "strings" + + "github.com/ActiveState/cli/internal/logging" +) + +// injectProjectDir replaces {{.ProjectDir}} with the current project in environment variables +// if projectDir is unspecified, the corresponding environment variables are extracted +// This is a dirty workaround until https://www.pivotaltracker.com/story/show/172033094 is implemented +func injectProjectDir(env map[string]string, projectDir string) map[string]string { + templateMeta := struct { + ProjectDir string + }{projectDir} + + resultEnv := map[string]string{} + for k, v := range env { + // Dirty workaround until https://www.pivotaltracker.com/story/show/172033094 is implemented + // This avoids projectDir dependant env vars from being written + if projectDir == "" && strings.Contains(v, "ProjectDir") { + continue + } + + valueTemplate, err := template.New(k).Parse(v) + if err != nil { + logging.Error("Skipping env value with invalid value: %s:%s, error: %v", k, v, err) + continue + } + var realValue bytes.Buffer + err = valueTemplate.Execute(&realValue, templateMeta) + if err != nil { + logging.Error("Skipping env value whose value could not be parsed: %s:%s, error: %v", k, v, err) + continue + } + resultEnv[k] = realValue.String() + } + return resultEnv +} diff --git a/pkg/platform/runtime/mock/assembler.go b/pkg/platform/runtime/mock/assembler.go deleted file mode 100644 index 7d6d730014..0000000000 --- a/pkg/platform/runtime/mock/assembler.go +++ /dev/null @@ -1,76 +0,0 @@ -package mock - -import ( - testifyMock "github.com/stretchr/testify/mock" - "github.com/ActiveState/cli/internal/unarchiver" - "github.com/ActiveState/cli/pkg/platform/runtime" -) - -var _ runtime.EnvGetter = &Assembler{} -var _ runtime.Assembler = &Assembler{} - -type Assembler struct { - testifyMock.Mock -} - -func (a *Assembler) DownloadDirectory(artf *runtime.HeadChefArtifact) (string, error) { - args := a.Called(artf) - return args.String(0), args.Get(1).(error) -} -func (a *Assembler) GetEnv(inherit bool, projectDir string) (map[string]string, error) { - args := a.Called() - return args.Get(0).(map[string]string), args.Get(1).(error) -} - -func (a *Assembler) ArtifactsToDownload() []*runtime.HeadChefArtifact { - args := a.Called() - return args.Get(0).([]*runtime.HeadChefArtifact) -} - -func (a *Assembler) PreInstall() error { - args := a.Called() - if args.Get(0) == nil { - return nil - } - return args.Get(0).(error) -} - -func (a *Assembler) PreUnpackArtifact(artf *runtime.HeadChefArtifact) error { - args := a.Called(artf) - if args.Get(0) == nil { - return nil - } - return args.Get(0).(error) -} - -func (a *Assembler) PostUnpackArtifact(artf *runtime.HeadChefArtifact, tmpRuntimeDir string, archivePath string, cb func()) error { - args := a.Called(artf, tmpRuntimeDir, archivePath, cb) - if args.Get(0) == nil { - return nil - } - return args.Get(0).(error) -} - -func (a *Assembler) PostInstall() error { - args := a.Called() - return args.Get(0).(error) -} - -func (a *Assembler) IsInstalled() bool { - args := a.Called() - return args.Get(0).(bool) -} - -func (a *Assembler) InstallerExtension() string { - return ".tar.gz" -} - -func (a *Assembler) Unarchiver() unarchiver.Unarchiver { - args := a.Called() - return args.Get(0).(unarchiver.Unarchiver) -} - -func (a *Assembler) BuildEngine() runtime.BuildEngine { - args := a.Called() - return args.Get(0).(runtime.BuildEngine) -} diff --git a/pkg/platform/runtime/mock/downloader.go b/pkg/platform/runtime/mock/downloader.go deleted file mode 100644 index 284e631b1a..0000000000 --- a/pkg/platform/runtime/mock/downloader.go +++ /dev/null @@ -1,24 +0,0 @@ -package mock - -import ( - testifyMock "github.com/stretchr/testify/mock" -) - -// Downloader is a testify Mock object. -type Downloader struct { - testifyMock.Mock -} - -// NewMockDownloader returns a new testify/mock.Mock Downloader. -func NewMockDownloader() *Downloader { - return &Downloader{} -} - -// Download for Downloader. -func (downloader *Downloader) Download() (string, error) { - args := downloader.Called() - if err := args.Get(1); err != nil { - return args.String(0), err.(error) - } - return args.String(0), nil -} diff --git a/pkg/platform/runtime/mock/installer.go b/pkg/platform/runtime/mock/installer.go deleted file mode 100644 index 67b05f6713..0000000000 --- a/pkg/platform/runtime/mock/installer.go +++ /dev/null @@ -1,34 +0,0 @@ -package mock - -import ( - testifyMock "github.com/stretchr/testify/mock" -) - -// Installer is a testify Mock object. -type Installer struct { - testifyMock.Mock -} - -// NewMockInstaller returns a new testify/mock.Mock Installer. -func NewMockInstaller() *Installer { - return &Installer{} -} - -// InstallDir for Installer. -func (installer *Installer) InstallDir() string { - args := installer.Called() - return args.String(0) -} - -// Install for Installer. -func (installer *Installer) Install() error { - installer.Called() - return nil -} - -// InstallFromArchive for Installer. -func (installer *Installer) InstallFromArchive(archive string) error { - installer.Called() - return nil -} - diff --git a/pkg/platform/runtime/model/buildengine.go b/pkg/platform/runtime/model/buildengine.go new file mode 100644 index 0000000000..0969b76a94 --- /dev/null +++ b/pkg/platform/runtime/model/buildengine.go @@ -0,0 +1,57 @@ +package model + +import "github.com/ActiveState/cli/pkg/platform/api/headchef/headchef_models" + +// BuildEngine describes the build engine that was used to build the runtime +type BuildEngine int + +const ( + // UnknownEngine represents an engine unknown to the runtime. + UnknownEngine BuildEngine = iota + + // Camel is the legacy build engine, that builds Active{Python,Perl,Tcl} + // distributions + Camel + + // Alternative is the new alternative build orchestration framework + Alternative + + // Hybrid wraps Camel. + Hybrid +) + +// buildEngineFromResponse handles a headchef build status response and returns +// the relevant engine. +func buildEngineFromResponse(resp *headchef_models.BuildStatusResponse) BuildEngine { + if resp == nil || resp.BuildEngine == nil { + return UnknownEngine + } + + return ParseBuildEngine(*resp.BuildEngine) +} + +func (be BuildEngine) String() string { + switch be { + case Camel: + return headchef_models.BuildStatusResponseBuildEngineCamel + case Alternative: + return headchef_models.BuildStatusResponseBuildEngineAlternative + case Hybrid: + return headchef_models.BuildStatusResponseBuildEngineHybrid + default: + return "unknown" + } +} + +func ParseBuildEngine(be string) BuildEngine { + switch be { + case headchef_models.BuildStatusResponseBuildEngineAlternative: + return Alternative + case headchef_models.BuildStatusResponseBuildEngineCamel: + return Camel + case headchef_models.BuildStatusResponseBuildEngineHybrid: + return Hybrid + default: + return UnknownEngine + } +} diff --git a/pkg/platform/runtime/model/default.go b/pkg/platform/runtime/model/default.go new file mode 100644 index 0000000000..8e0db244ed --- /dev/null +++ b/pkg/platform/runtime/model/default.go @@ -0,0 +1,76 @@ +package model + +import ( + "net/url" + + "github.com/go-openapi/strfmt" + + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/pkg/platform/api/headchef" + "github.com/ActiveState/cli/pkg/platform/api/headchef/headchef_models" + "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models" + "github.com/ActiveState/cli/pkg/platform/model" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" +) + +// var _ runtime.ClientProvider = &Default{} + +// Model is the default client that actually talks to the backend +type Model struct{} + +// NewDefault is the constructor for the Model client +func NewDefault() *Model { + return &Model{} +} + +func (m *Model) ResolveRecipe(commitID strfmt.UUID, owner, projectName string) (*inventory_models.Recipe, error) { + return model.ResolveRecipe(commitID, owner, projectName) +} + +func (m *Model) RequestBuild(recipeID, commitID strfmt.UUID, owner, project string) (headchef.BuildStatusEnum, *headchef_models.BuildStatusResponse, error) { + return model.RequestBuild(recipeID, commitID, owner, project) +} + +func (m *Model) SignS3URL(uri *url.URL) (*url.URL, error) { + return model.SignS3URL(uri) +} + +// BuildResult is the unified response of a Build request +type BuildResult struct { + BuildEngine BuildEngine + Recipe *inventory_models.Recipe + BuildStatusResponse *headchef_models.BuildStatusResponse + BuildStatus headchef.BuildStatusEnum + BuildReady bool +} + +func (b *BuildResult) OrderedArtifacts() []artifact.ArtifactID { + res := make([]artifact.ArtifactID, 0, len(b.BuildStatusResponse.Artifacts)) + for _, a := range b.BuildStatusResponse.Artifacts { + res = append(res, *a.ArtifactID) + } + return res +} + +// FetchBuildResult requests a build for a resolved recipe and returns the result in a BuildResult struct +func (m *Model) FetchBuildResult(commitID strfmt.UUID, owner, project string) (*BuildResult, error) { + recipe, err := m.ResolveRecipe(commitID, owner, project) + if err != nil { + return nil, locale.WrapError(err, "setup_build_resolve_recipe_err", "Could not resolve recipe for project {{.V0}}/{{.V1}}#{{.V2}}", owner, project, commitID.String()) + } + + bse, resp, err := m.RequestBuild(*recipe.RecipeID, commitID, owner, project) + if err != nil { + return nil, locale.WrapError(err, "headchef_build_err", "Could not request build for {{.V0}}/{{.V1}}#{{.V2}}", owner, project, commitID.String()) + } + + engine := buildEngineFromResponse(resp) + + return &BuildResult{ + BuildEngine: engine, + Recipe: recipe, + BuildStatusResponse: resp, + BuildStatus: bse, + BuildReady: bse == headchef.Completed, + }, nil +} diff --git a/pkg/platform/runtime/runtime.go b/pkg/platform/runtime/runtime.go index 03ddd1d9d4..928e9d42a5 100644 --- a/pkg/platform/runtime/runtime.go +++ b/pkg/platform/runtime/runtime.go @@ -1,145 +1,128 @@ package runtime import ( - "path/filepath" + "os" "strings" - "github.com/go-openapi/strfmt" - "github.com/ActiveState/cli/internal/analytics" "github.com/ActiveState/cli/internal/constants" "github.com/ActiveState/cli/internal/errs" - "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/internal/hash" "github.com/ActiveState/cli/internal/locale" "github.com/ActiveState/cli/internal/logging" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/ActiveState/cli/pkg/platform/runtime/model" + "github.com/ActiveState/cli/pkg/platform/runtime/setup" + "github.com/ActiveState/cli/pkg/platform/runtime/setup/events" + "github.com/ActiveState/cli/pkg/platform/runtime/store" ) type Runtime struct { - runtimeDir string - commitID strfmt.UUID - owner string - projectName string - msgHandler MessageHandler - installer *Installer + target setup.Targeter + store *store.Store + model *model.Model + envAccessed bool } -func NewRuntime(projectDir, cachePath string, commitID strfmt.UUID, owner string, projectName string, msgHandler MessageHandler) (*Runtime, error) { - var resolvedProjectDir string - if projectDir != "" { - var err error - projectDir = strings.TrimSuffix(projectDir, constants.ConfigFileName) - resolvedProjectDir, err = fileutils.ResolveUniquePath(projectDir) - if err != nil { - return nil, locale.WrapError(err, "err_new_runtime_unique_path", "Failed to resolve a unique file path to the project dir.") - } - logging.Debug("In NewRuntime: resolved project dir is: %s", resolvedProjectDir) - } +// DisabledRuntime is an empty runtime that is only created when constants.DisableRuntime is set to true in the environment +var DisabledRuntime = &Runtime{} - installPath := filepath.Join(cachePath, hash.ShortHash(resolvedProjectDir)) - r := &Runtime{ - runtimeDir: installPath, - commitID: commitID, - owner: owner, - projectName: projectName, - msgHandler: msgHandler, - } +// NeedsUpdateError is an error returned when the runtime is not completely installed yet. +type NeedsUpdateError struct{ error } - r.installer = NewInstaller(r) - - analytics.Event(catRuntime, actStart) - if r.IsCachedRuntime() { - analytics.Event(catRuntime, actCache) - } - - return r, nil +// IsNeedsUpdateError checks if the error is a NeedsUpdateError +func IsNeedsUpdateError(err error) bool { + return errs.Matches(err, &NeedsUpdateError{}) } -func (r *Runtime) SetInstallPath(installPath string) { - logging.Debug("SetInstallPath: %s", installPath) - r.runtimeDir = installPath -} +func new(target setup.Targeter) (*Runtime, error) { + rt := &Runtime{target: target} + rt.model = model.NewDefault() -func (r *Runtime) InstallPath() string { - return r.runtimeDir -} - -// IsCachedRuntime checks if the requested runtime is already available ie., -// the runtime installation completed successful (marker file found) AND the requested commitID did not change -func (r *Runtime) IsCachedRuntime() bool { - marker := filepath.Join(r.runtimeDir, constants.RuntimeInstallationCompleteMarker) - if !fileutils.FileExists(marker) { - logging.Debug("Marker does not exist: %s", marker) - return false + var err error + if rt.store, err = store.New(target.Dir()); err != nil { + return nil, errs.Wrap(err, "Could not create runtime store") } - contents, err := fileutils.ReadFile(marker) - if err != nil { - logging.Error("Could not read marker: %v", err) - return false + if !rt.store.MatchesCommit(target.CommitUUID()) { + return rt, &NeedsUpdateError{errs.New("Runtime requires setup.")} } - logging.Debug("IsCachedRuntime for %s, %s==%s", marker, string(contents), r.commitID.String()) - return string(contents) == r.commitID.String() + return rt, nil } -// MarkInstallationComplete writes the installation complete marker to the runtime directory -func (r *Runtime) MarkInstallationComplete() error { - markerFile := filepath.Join(r.runtimeDir, constants.RuntimeInstallationCompleteMarker) - markerDir := filepath.Dir(markerFile) - err := fileutils.MkdirUnlessExists(markerDir) - if err != nil { - return errs.Wrap(err, "could not create completion marker directory") +// New attempts to create a new runtime from local storage. If it fails with a NeedsUpdateError, Update() needs to be called to update the locally stored runtime. +func New(target setup.Targeter) (*Runtime, error) { + if strings.ToLower(os.Getenv(constants.DisableRuntime)) == "true" { + return DisabledRuntime, nil } - err = fileutils.WriteFile(markerFile, []byte(r.commitID.String())) - if err != nil { - return errs.Wrap(err, "could not set completion marker") - } - return nil -} + analytics.Event(analytics.CatRuntime, analytics.ActRuntimeStart) -// StoreBuildEngine stores the build engine value in the runtime directory -func (r *Runtime) StoreBuildEngine(buildEngine BuildEngine) error { - storeFile := filepath.Join(r.runtimeDir, constants.RuntimeBuildEngineStore) - storeDir := filepath.Dir(storeFile) - logging.Debug("Storing build engine %s at %s", buildEngine.String(), storeFile) - err := fileutils.MkdirUnlessExists(storeDir) - if err != nil { - return errs.Wrap(err, "Could not create completion marker directory.") + r, err := new(target) + if err == nil { + analytics.Event(analytics.CatRuntime, analytics.ActRuntimeCache) } - err = fileutils.WriteFile(storeFile, []byte(buildEngine.String())) - if err != nil { - return errs.Wrap(err, "Could not store build engine string.") - } - return nil + return r, err } -// BuildEngine returns the runtime build engine value stored in the runtime directory -func (r *Runtime) BuildEngine() (BuildEngine, error) { - storeFile := filepath.Join(r.runtimeDir, constants.RuntimeBuildEngineStore) +// Update updates the runtime by downloading all necessary artifacts from the Platform and installing them locally. +// This function is usually called, after New() returned with a NeedsUpdateError +func (r *Runtime) Update(msgHandler *events.RuntimeEventHandler) error { + logging.Debug("Updating %s#%s @ %s", r.target.Name(), r.target.CommitUUID(), r.target.Dir()) + + // Run the setup function (the one that produces runtime events) in the background... + prod := events.NewRuntimeEventProducer() + var setupErr error + go func() { + defer prod.Close() + + if err := setup.New(r.target, prod).Update(); err != nil { + setupErr = errs.Wrap(err, "Update failed") + return + } + rt, err := new(r.target) + if err != nil { + setupErr = errs.Wrap(err, "Could not reinitialize runtime after update") + return + } + *r = *rt + }() - data, err := fileutils.ReadFile(storeFile) + // ... and handle and wait for the runtime events in the main thread + err := msgHandler.WaitForAllEvents(prod.Events()) if err != nil { - return UnknownEngine, errs.Wrap(err, "Could not read build engine cache store.") + logging.Error("Error handling update events: %v", err) } - return parseBuildEngine(string(data)), nil -} - -// Env will grab the environment information for the given runtime. -// This currently just aliases to installer, pending further refactoring -func (r *Runtime) Env() (EnvGetter, error) { - return r.installer.Env() -} + // when the msg handler returns, *r and setupErr are updated. -func (r *Runtime) CommitID() strfmt.UUID { - return r.commitID + return setupErr } -func (r *Runtime) Owner() string { - return r.owner +// Environ returns a key-value map of the environment variables that need to be set for this runtime +// inherit includes environment variables set on the system +// projectDir is only used for legacy camel builds +func (r *Runtime) Environ(inherit bool, projectDir string) (map[string]string, error) { + if r == DisabledRuntime { + return nil, errs.New("Called Environ() on a disabled runtime.") + } + env, err := r.store.Environ(inherit) + if !r.envAccessed { + if err != nil { + analytics.EventWithLabel(analytics.CatRuntime, analytics.ActRuntimeFailure, analytics.LblRtFailEnv) + } else { + analytics.Event(analytics.CatRuntime, analytics.ActRuntimeSuccess) + } + r.envAccessed = true + } + return injectProjectDir(env, projectDir), err } -func (r *Runtime) ProjectName() string { - return r.projectName +// Artifacts returns a map of artifact information extracted from the recipe +func (r *Runtime) Artifacts() (map[artifact.ArtifactID]artifact.ArtifactRecipe, error) { + recipe, err := r.store.Recipe() + if err != nil { + return nil, locale.WrapError(err, "runtime_artifacts_recipe_load_err", "Failed to load recipe for your runtime. Please re-install the runtime.") + } + artifacts := artifact.NewMapFromRecipe(recipe) + return artifacts, nil } diff --git a/pkg/platform/runtime/runtime_test.go b/pkg/platform/runtime/runtime_test.go deleted file mode 100644 index c5b4d83dc2..0000000000 --- a/pkg/platform/runtime/runtime_test.go +++ /dev/null @@ -1,92 +0,0 @@ -package runtime_test - -import ( - "fmt" - "path" - - "github.com/go-openapi/strfmt" - - "github.com/ActiveState/cli/pkg/platform/runtime" -) - -func headchefArtifact(artifactPath string) (*runtime.HeadChefArtifact, map[string]*runtime.HeadChefArtifact) { - artifactID := strfmt.UUID("00010001-0001-0001-0001-000100010001") - ingredientVersionID := strfmt.UUID("00030003-0003-0003-0003-000300030003") - uri := strfmt.URI("https://test.tld/" + path.Join(artifactPath)) - artifact := &runtime.HeadChefArtifact{ - ArtifactID: &artifactID, - IngredientVersionID: ingredientVersionID, - URI: uri, - } - archives := map[string]*runtime.HeadChefArtifact{} - archives[artifactPath] = artifact - return artifact, archives -} - -type artifactsResultMockOption func(*runtime.FetchArtifactsResult) *runtime.FetchArtifactsResult - -func mockFetchArtifactsResult(options ...artifactsResultMockOption) *runtime.FetchArtifactsResult { - recipeID := strfmt.UUID("00020002-0002-0002-0002-0002-00020000200002") - res := &runtime.FetchArtifactsResult{ - RecipeID: recipeID, - Artifacts: []*runtime.HeadChefArtifact{}, - BuildEngine: runtime.Alternative, - } - for _, opt := range options { - res = opt(res) - } - return res -} - -func withRegularArtifacts(numArtifacts int) artifactsResultMockOption { - return func(res *runtime.FetchArtifactsResult) *runtime.FetchArtifactsResult { - - for i := 0; i < numArtifacts; i++ { - uri := fmt.Sprintf("https://test.tld/artifact%d/artifact.tar.gz", i) - artifactID := strfmt.UUID(fmt.Sprintf("00010001-0001-0001-0001-00010001000%d", i)) - ingredientVersionID := strfmt.UUID(fmt.Sprintf("00020001-0001-0001-0001-00010001000%d", i)) - res.Artifacts = append(res.Artifacts, &runtime.HeadChefArtifact{ - ArtifactID: &artifactID, - IngredientVersionID: ingredientVersionID, - URI: strfmt.URI(uri), - }) - } - return res - } -} - -func withURIArtifact(uri string) artifactsResultMockOption { - return func(res *runtime.FetchArtifactsResult) *runtime.FetchArtifactsResult { - - artifactID := strfmt.UUID("00010003-0001-0001-0001-000100010001") - ingredientVersionID := strfmt.UUID("00020001-0001-0001-0001-000100010001") - res.Artifacts = append(res.Artifacts, &runtime.HeadChefArtifact{ - ArtifactID: &artifactID, - IngredientVersionID: ingredientVersionID, - URI: strfmt.URI(uri), - }) - return res - } -} - -func withTerminalArtifacts(numArtifacts int) artifactsResultMockOption { - return func(res *runtime.FetchArtifactsResult) *runtime.FetchArtifactsResult { - - for i := 0; i < numArtifacts; i++ { - uri := fmt.Sprintf("https://test.tld/terminal_artifact%d/artifact.tar.gz", i) - artifactID := strfmt.UUID(fmt.Sprintf("00010002-0001-0001-0001-00010001000%d", i)) - res.Artifacts = append(res.Artifacts, &runtime.HeadChefArtifact{ - ArtifactID: &artifactID, - URI: strfmt.URI(uri), - }) - } - return res - } -} - -// camelInstallerExtension returns the installer extension for camel artifacts without caring -// about the CamelRuntime. This is useful to mock OS independent artifact file names. -func camelInstallerExtension() string { - crTemp := &runtime.CamelInstall{} - return crTemp.InstallerExtension() -} diff --git a/pkg/platform/runtime/setup/buildlog/buildlog.go b/pkg/platform/runtime/setup/buildlog/buildlog.go new file mode 100644 index 0000000000..f2e7ebac62 --- /dev/null +++ b/pkg/platform/runtime/setup/buildlog/buildlog.go @@ -0,0 +1,158 @@ +package buildlog + +import ( + "github.com/go-openapi/strfmt" + + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/internal/logging" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" +) + +type message struct { + Type string `json:"type"` + CacheHit bool `json:"cache_hit"` + ErrorMessage *string `json:"error_message,omitempty"` + ArtifactID *strfmt.UUID `json:"artifact_id,omitempty"` + ArtifactURI *string `json:"artifact_uri,omitempty"` + ArtifactChecksum *string `json:"artifact_checksum,omitempty"` + LogURI *string `json:"log_uri,omitempty"` +} + +type logRequest struct { + RecipeID string `json:"recipeID"` +} + +func (m message) Err() string { + if m.ErrorMessage == nil { + return "" + } + return *m.ErrorMessage +} + +// BuildLogConnector describes how to interact with a build log connection +type BuildLogConnector interface { + ReadJSON(interface{}) error + WriteJSON(interface{}) error +} + +type Events interface { + BuildStarting(total int) + BuildFinished() + ArtifactBuildStarting(artifactID artifact.ArtifactID, artifactName string) + ArtifactBuildCached(artifactID artifact.ArtifactID) + ArtifactBuildCompleted(artifactID artifact.ArtifactID) + ArtifactBuildFailed(artifactID artifact.ArtifactID, errorMessage string) +} + +// BuildLog is an implementation of a build log +type BuildLog struct { + ch chan artifact.ArtifactDownload + errCh chan error +} + +// New creates a new instance that allows us to wait for incoming build log information +// TODO: Decide if we maybe want a fail-fast option where we return on the first artifact_failed message +func New(artifactMap map[artifact.ArtifactID]artifact.ArtifactRecipe, conn BuildLogConnector, events Events, recipeID strfmt.UUID) (*BuildLog, error) { + ch := make(chan artifact.ArtifactDownload) + errCh := make(chan error) + + total := len(artifactMap) + events.BuildStarting(total) + + go func() { + defer close(ch) + defer close(errCh) + defer events.BuildFinished() + + var artifactErr error + for { + var msg message + err := conn.ReadJSON(&msg) + if err != nil { + errCh <- err + return + } + logging.Debug("Received response: " + msg.Type) + + var artf artifact.ArtifactRecipe + var artifactMapped bool + if msg.ArtifactID != nil { + artf, artifactMapped = artifactMap[*msg.ArtifactID] + } + var artifactName string + if artifactMapped { + artifactName = artf.NameWithVersion() + } + + switch msg.Type { + case "build_failed": + errCh <- locale.WrapError(artifactErr, "err_logstream_build_failed", "Build failed with error message: {{.V0}}.", msg.Err()) + return + case "build_succeeded": + return + case "artifact_started": + if !artifactMapped { + logging.Debug("build log streamer started unmapped artifact ID %s", msg.ArtifactID) + continue + } + // NOTE: fix to ignore current noop "final pkg artifact" + if msg.ArtifactID != nil && *msg.ArtifactID == recipeID { + break + } + if msg.CacheHit { + events.ArtifactBuildCached(*msg.ArtifactID) + } else { + events.ArtifactBuildStarting(*msg.ArtifactID, artifactName) + } + case "artifact_succeeded": + if !artifactMapped { + logging.Debug("build log streamer finished unmapped artifact ID %s", msg.ArtifactID) + continue + } + + // NOTE: fix to ignore current noop "final pkg artifact" + if msg.ArtifactID != nil && *msg.ArtifactID == recipeID { + break + } + events.ArtifactBuildCompleted(*msg.ArtifactID) + if msg.ArtifactID == nil || msg.ArtifactURI == nil || msg.ArtifactChecksum == nil { + errCh <- errs.New("artifact_succeeded message was incomplete") + return + } + ch <- artifact.ArtifactDownload{ArtifactID: *msg.ArtifactID, UnsignedURI: *msg.ArtifactURI, Checksum: *msg.ArtifactChecksum} + case "artifact_failed": + artifactErr = locale.WrapError(artifactErr, "err_artifact_failed", "Failed to build \"{{.V0}}\", error reported: {{.V1}}.", artifactName, msg.Err()) + events.ArtifactBuildFailed(*msg.ArtifactID, msg.Err()) + } + } + }() + + logging.Debug("sending websocket request for %s", recipeID.String()) + request := logRequest{RecipeID: recipeID.String()} + if err := conn.WriteJSON(request); err != nil { + return nil, errs.Wrap(err, "Could not write websocket request") + } + + return &BuildLog{ + ch: ch, + errCh: errCh, + }, nil +} + +// Wait waits for the build log to close because the build is done and all downloadable artifacts are here +func (bl *BuildLog) Wait() error { + var errs []error + for err := range bl.errCh { + errs = append(errs, err) + } + if len(errs) > 0 { + return errs[0] + } + return nil +} + +// BuiltArtifactsChannel returns the channel to listen for downloadable artifacts on +func (bl *BuildLog) BuiltArtifactsChannel() <-chan artifact.ArtifactDownload { + return bl.ch +} diff --git a/pkg/platform/runtime/setup/buildlog/buildlog_test.go b/pkg/platform/runtime/setup/buildlog/buildlog_test.go new file mode 100644 index 0000000000..a70496f755 --- /dev/null +++ b/pkg/platform/runtime/setup/buildlog/buildlog_test.go @@ -0,0 +1,228 @@ +package buildlog + +import ( + "errors" + "fmt" + "testing" + + "github.com/go-openapi/strfmt" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" +) + +type connectionMock struct { + CalledWrite int + messages []interface{} + readCount int +} + +func (cm *connectionMock) WriteJSON(interface{}) error { + cm.CalledWrite++ + return nil +} + +func (cm *connectionMock) ReadJSON(a interface{}) error { + am, ok := a.(*message) + if !ok { + panic("cannot convert to message pointer") + } + lv := cm.messages[cm.readCount] + cm.readCount++ + if err, ok := lv.(interface{ Error() string }); ok { + return err + } + *am = lv.(message) + + return nil +} + +func (cm *connectionMock) SendBuildStartedMessage() { + cm.messages = append(cm.messages, message{Type: "build_started"}) +} + +func (cm *connectionMock) SendBuildSucceededMessage() { + cm.messages = append(cm.messages, message{Type: "build_succeeded"}) +} + +func (cm *connectionMock) SendBuildFailedMessage(errMsg string) { + cm.messages = append(cm.messages, message{Type: "build_failed", ErrorMessage: &errMsg}) +} + +func (cm *connectionMock) SendArtifactStartedMessage(a artifact.ArtifactRecipe, isCacheHit bool) { + cm.messages = append( + cm.messages, message{ + Type: "artifact_started", + ArtifactID: &a.ArtifactID, + CacheHit: isCacheHit, + }) +} + +func (cm *connectionMock) SendArtifactSucceededMessage(a artifact.ArtifactRecipe) { + chksum := "123" + uri := fmt.Sprintf("uri://%s", a.Name) + cm.messages = append( + cm.messages, message{ + Type: "artifact_succeeded", + ArtifactID: &a.ArtifactID, + ArtifactChecksum: &chksum, + ArtifactURI: &uri, + }) +} + +func (cm *connectionMock) SendArtifactFailedMessage(a artifact.ArtifactRecipe, errMsg string) { + cm.messages = append( + cm.messages, message{ + Type: "artifact_failed", + ArtifactID: &a.ArtifactID, + ErrorMessage: &errMsg, + }) +} + +func (cm *connectionMock) ReadError(errMsg string) { + cm.messages = append(cm.messages, errors.New(errMsg)) +} + +type artifactFailedArg struct { + ArtifactID artifact.ArtifactID + ErrMessage string +} +type mockMessageHandler struct { + BuildStartingCalls []int + BuildFinishedCallCount int + ArtifactBuildStartingCalls []artifact.ArtifactID + ArtifactBuildCachedCalls []artifact.ArtifactID + ArtifactBuildSucceededCalls []artifact.ArtifactID + ArtifactBuildFailedCalls []artifactFailedArg +} + +func (mh *mockMessageHandler) BuildStarting(total int) { + mh.BuildStartingCalls = append(mh.BuildStartingCalls, total) +} +func (mh *mockMessageHandler) BuildFinished() { + mh.BuildFinishedCallCount++ +} +func (mh *mockMessageHandler) ArtifactBuildStarting(artifactID artifact.ArtifactID, artifactName string) { + mh.ArtifactBuildStartingCalls = append(mh.ArtifactBuildStartingCalls, artifactID) +} +func (mh *mockMessageHandler) ArtifactBuildCached(artifactID artifact.ArtifactID) { + mh.ArtifactBuildCachedCalls = append(mh.ArtifactBuildCachedCalls, artifactID) +} +func (mh *mockMessageHandler) ArtifactBuildCompleted(artifactID artifact.ArtifactID) { + mh.ArtifactBuildSucceededCalls = append(mh.ArtifactBuildSucceededCalls, artifactID) +} +func (mh *mockMessageHandler) ArtifactBuildFailed(artifactID artifact.ArtifactID, errorMessage string) { + mh.ArtifactBuildFailedCalls = append(mh.ArtifactBuildFailedCalls, artifactFailedArg{artifactID, errorMessage}) +} + +func TestBuildLog(t *testing.T) { + recipeID := strfmt.UUID("10000000-0000-0000-0000-000000000001") + ids := []artifact.ArtifactID{ + "00000000-0000-0000-0000-000000000001", + "00000000-0000-0000-0000-000000000002", + } + names := []string{ + "artifact1", + "artifact2", + } + artifacts := []artifact.ArtifactRecipe{ + {ArtifactID: ids[0], Name: names[0]}, + {ArtifactID: ids[1], Name: names[1]}, + {ArtifactID: recipeID, Name: "terminal-node"}, + } + artifactMap := map[artifact.ArtifactID]artifact.ArtifactRecipe{ + ids[0]: artifacts[0], + ids[1]: artifacts[1], + } + + tests := []struct { + Name string + ConnectionMock func(cm *connectionMock) + ExpectError bool + ExpectedDownloads int + ExpectedArtifactStarting []artifact.ArtifactID + ExpectedArtifactCached []artifact.ArtifactID + ExpectedArtifactSucceeded []artifact.ArtifactID + ExpectedArtifactFailed []artifactFailedArg + }{ + { + Name: "successful", + ConnectionMock: func(cm *connectionMock) { + cm.SendBuildStartedMessage() + cm.SendArtifactStartedMessage(artifacts[0], false) + cm.SendArtifactStartedMessage(artifacts[1], true) + cm.SendArtifactStartedMessage(artifacts[2], false) + cm.SendArtifactSucceededMessage(artifacts[0]) + cm.SendArtifactSucceededMessage(artifacts[1]) + cm.SendArtifactSucceededMessage(artifacts[2]) + cm.SendBuildSucceededMessage() + }, + ExpectError: false, + ExpectedDownloads: 2, + ExpectedArtifactStarting: []artifact.ArtifactID{ids[0]}, + ExpectedArtifactCached: []artifact.ArtifactID{ids[1]}, + ExpectedArtifactSucceeded: ids, + }, + { + Name: "failed", + ConnectionMock: func(cm *connectionMock) { + cm.SendBuildStartedMessage() + cm.SendArtifactStartedMessage(artifacts[0], false) + cm.SendArtifactStartedMessage(artifacts[1], false) + cm.SendArtifactSucceededMessage(artifacts[0]) + cm.SendArtifactFailedMessage(artifacts[1], "oh no") + cm.SendBuildFailedMessage("what a shame") + }, + ExpectError: true, + ExpectedDownloads: 1, + ExpectedArtifactStarting: ids, + ExpectedArtifactSucceeded: []artifact.ArtifactID{ids[0]}, + ExpectedArtifactFailed: []artifactFailedArg{{ids[1], "oh no"}}, + }, + { + Name: "connection read error", + ConnectionMock: func(cm *connectionMock) { + cm.SendBuildStartedMessage() + cm.ReadError("connection failure") + }, + ExpectError: true, + ExpectedDownloads: 0, + }, + } + + for _, tt := range tests { + t.Run(tt.Name, func(t *testing.T) { + + mmh := &mockMessageHandler{} + cm := &connectionMock{} + tt.ConnectionMock(cm) + + bl, err := New(artifactMap, cm, mmh, recipeID) + require.NoError(t, err) + + var downloads []artifact.ArtifactDownload + done := make(chan struct{}) + go func() { + defer func() { done <- struct{}{} }() + for d := range bl.BuiltArtifactsChannel() { + downloads = append(downloads, d) + } + }() + + err = bl.Wait() + if tt.ExpectError == (err == nil) { + t.Fatalf("Unexpected error value: %v", err) + } + <-done + assert.Len(t, downloads, tt.ExpectedDownloads) + assert.Equal(t, 1, cm.CalledWrite) + assert.Equal(t, []int{2}, mmh.BuildStartingCalls) + assert.Equal(t, 1, mmh.BuildFinishedCallCount) + assert.Equal(t, tt.ExpectedArtifactStarting, mmh.ArtifactBuildStartingCalls) + assert.Equal(t, tt.ExpectedArtifactCached, mmh.ArtifactBuildCachedCalls) + assert.Equal(t, tt.ExpectedArtifactSucceeded, mmh.ArtifactBuildSucceededCalls) + assert.Equal(t, tt.ExpectedArtifactFailed, mmh.ArtifactBuildFailedCalls) + }) + } +} diff --git a/pkg/platform/runtime/setup/events/consumer.go b/pkg/platform/runtime/setup/events/consumer.go new file mode 100644 index 0000000000..ec38efeabb --- /dev/null +++ b/pkg/platform/runtime/setup/events/consumer.go @@ -0,0 +1,147 @@ +package events + +import ( + "fmt" + + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/internal/logging" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" +) + +// ChangeSummaryDigester provides an action for the ChangeSummaryEvent. +type ChangeSummaryDigester interface { + ChangeSummary(artifact.ArtifactRecipeMap, artifact.ArtifactChangeset, artifact.ArtifactChangeset) error +} + +// ProgressDigester provides actions to display progress information during the setup of the runtime. +type ProgressDigester interface { + BuildStarted(totalArtifacts int64) error + BuildIncrement() error + BuildCompleted(withFailures bool) error + + InstallationStarted(totalArtifacts int64) error + InstallationIncrement() error + + ArtifactStepStarted(artifact.ArtifactID, string, string, int64, bool) error + ArtifactStepIncrement(artifact.ArtifactID, string, int64) error + ArtifactStepCompleted(artifact.ArtifactID, string) error + ArtifactStepFailure(artifact.ArtifactID, string) error + + Close() +} + +// RuntimeEventConsumer is a struct that handles incoming SetupUpdate events in a single go-routine such that they can be forwarded to a progress or summary digester. +// State-ful operations should be handled in this struct rather than in the digesters in order to keep the calls to the digesters as simple as possible. +type RuntimeEventConsumer struct { + progress ProgressDigester + summary ChangeSummaryDigester + totalArtifacts int64 + numBuildFailures int64 + numInstallFailures int64 +} + +func NewRuntimeEventConsumer(progress ProgressDigester, summary ChangeSummaryDigester) *RuntimeEventConsumer { + return &RuntimeEventConsumer{ + progress: progress, + summary: summary, + } +} + +// Consume consumes all events +func (eh *RuntimeEventConsumer) Consume(events <-chan SetupEventer) error { + for ev := range events { + err := eh.handleEvent(ev) + if err != nil { + // consume remaining events before returning, such that this consumer does not block the producing thread + for range events { + } + return errs.Wrap(err, "Cancelled event handling in consumer due to error: %v", err) + } + } + return nil +} + +func (eh *RuntimeEventConsumer) handleEvent(ev SetupEventer) error { + switch t := ev.(type) { + case ChangeSummaryEvent: + return eh.summary.ChangeSummary(t.Artifacts(), t.RequestedChangeset(), t.CompleteChangeset()) + case TotalArtifactEvent: + eh.totalArtifacts = int64(t.Total()) + return nil + case BuildStartEvent: + if eh.totalArtifacts == 0 { + return errs.New("total number of artifacts has not been set yet.") + } + return eh.progress.BuildStarted(eh.totalArtifacts) + case BuildCompleteEvent: + return eh.progress.BuildCompleted(eh.numBuildFailures > 0) + case ArtifactSetupEventer: + return eh.handleArtifactEvent(t) + default: + logging.Debug("Received unhandled event: %s", ev.String()) + } + + return nil +} + +func (eh *RuntimeEventConsumer) handleBuildArtifactEvent(ev ArtifactSetupEventer) error { + switch t := ev.(type) { + case ArtifactCompleteEvent: + return eh.progress.BuildIncrement() + case ArtifactFailureEvent: + eh.numBuildFailures++ + return nil + default: + logging.Debug("unhandled build artifact event: %s", t.String()) + } + return nil +} + +func (eh *RuntimeEventConsumer) handleArtifactEvent(ev ArtifactSetupEventer) error { + // Build updates do not have progress event, so we handle them separately. + if ev.Step() == Build { + return eh.handleBuildArtifactEvent(ev) + } + switch t := ev.(type) { + case ArtifactStartEvent: + // first download event starts the installation process + if t.Step() == Download { + if eh.totalArtifacts == 0 { + return errs.New("total number of artifacts has not been set yet.") + } + err := eh.progress.InstallationStarted(eh.totalArtifacts) + if err != nil { + return err + } + } + name, artBytes := t.ArtifactName(), t.Total() + // the install step does only count the number of files changed + countsBytes := t.Step() != Install + return eh.progress.ArtifactStepStarted(t.ArtifactID(), stepTitle(t.Step()), name, int64(artBytes), countsBytes) + case ArtifactProgressEvent: + by := t.Progress() + return eh.progress.ArtifactStepIncrement(t.ArtifactID(), stepTitle(t.Step()), int64(by)) + case ArtifactCompleteEvent: + // a completed installation event translates to a completed artifact + if t.Step() == Install { + err := eh.progress.InstallationIncrement() + if err != nil { + return err + } + } + return eh.progress.ArtifactStepCompleted(t.ArtifactID(), stepTitle(t.Step())) + case ArtifactFailureEvent: + eh.numInstallFailures++ + return eh.progress.ArtifactStepFailure(t.ArtifactID(), stepTitle(t.Step())) + default: + logging.Debug("Unhandled artifact event: %s", ev.String()) + } + + return nil +} + +// returns a localized string to describe a setup step +func stepTitle(step SetupStep) string { + return locale.T(fmt.Sprintf("artifact_progress_step_%s", step.String())) +} diff --git a/pkg/platform/runtime/setup/events/consumer_test.go b/pkg/platform/runtime/setup/events/consumer_test.go new file mode 100644 index 0000000000..a990ad9f94 --- /dev/null +++ b/pkg/platform/runtime/setup/events/consumer_test.go @@ -0,0 +1,209 @@ +package events + +import ( + "testing" + + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/stretchr/testify/assert" +) + +type mockProgressOutput struct { + buildStarted bool + buildCompleted bool + buildTotal int64 + buildCurrent int + installationStarted bool + installationTotal int64 + installationCurrent int + artifactStartedCalled int + artifactIncrementCalled int + artifactCompletedCalled int + artifactFailureCalled int +} + +func (mpo *mockProgressOutput) BuildStarted(total int64) error { + mpo.buildStarted = true + mpo.buildTotal = total + return nil +} +func (mpo *mockProgressOutput) BuildIncrement() error { + mpo.buildCurrent++ + return nil +} +func (mpo *mockProgressOutput) BuildCompleted(bool) error { + mpo.buildCompleted = true + return nil +} +func (mpo *mockProgressOutput) InstallationStarted(total int64) error { + mpo.installationStarted = true + mpo.installationTotal = total + return nil +} +func (mpo *mockProgressOutput) InstallationIncrement() error { + mpo.installationCurrent++ + return nil +} +func (mpo *mockProgressOutput) ArtifactStepStarted(artifact.ArtifactID, string, string, int64, bool) error { + mpo.artifactStartedCalled++ + return nil +} +func (mpo *mockProgressOutput) ArtifactStepIncrement(artifact.ArtifactID, string, int64) error { + mpo.artifactIncrementCalled++ + return nil +} +func (mpo *mockProgressOutput) ArtifactStepCompleted(artifact.ArtifactID, string) error { + mpo.artifactCompletedCalled++ + return nil +} +func (mpo *mockProgressOutput) ArtifactStepFailure(artifact.ArtifactID, string) error { + mpo.artifactFailureCalled++ + return nil +} +func (mpo *mockProgressOutput) Close() {} + +func TestRuntimeEventConsumer(t *testing.T) { + ids := []artifact.ArtifactID{"1", "2"} + names := []string{"artifact 1", "artifact 2"} + + baseEvents := []SetupEventer{ + newTotalArtifactEvent(2), + newArtifactStartEvent(Download, ids[0], names[0], 100), + newArtifactProgressEvent(Download, ids[0], 100), + newArtifactCompleteEvent(Download, ids[0]), + newArtifactStartEvent(Download, ids[1], names[1], 100), + newArtifactProgressEvent(Download, ids[1], 100), + newArtifactCompleteEvent(Download, ids[1]), + newArtifactStartEvent(Install, ids[0], names[0], 100), + newArtifactProgressEvent(Install, ids[0], 100), + newArtifactStartEvent(Install, ids[1], names[1], 100), + newArtifactProgressEvent(Install, ids[1], 100), + } + successEvents := append(baseEvents, + newArtifactCompleteEvent(Install, ids[0]), + newArtifactCompleteEvent(Install, ids[1]), + ) + failedEvents := append(baseEvents, + newArtifactFailureEvent(Install, ids[0], "error"), + newArtifactFailureEvent(Install, ids[1], "error"), + ) + withBuildSuccessEvents := append([]SetupEventer{ + newTotalArtifactEvent(2), + newBuildStartEvent(), + newArtifactCompleteEvent(Build, ids[0]), + newArtifactCompleteEvent(Build, ids[1]), + newBuildCompleteEvent(), + }, successEvents...) + buildFailureEvents := []SetupEventer{ + newTotalArtifactEvent(2), + newBuildStartEvent(), + newArtifactFailureEvent(Build, ids[0], "error"), + newArtifactFailureEvent(Build, ids[1], "error"), + newBuildCompleteEvent(), + } + + tests := []struct { + name string + events []SetupEventer + expectedBuildStarted bool + expectedBuildCompleted bool + expectedBuildTotal int64 + expectedBuildCurrent int + expectedInstallationStarted bool + expectedInstallationTotal int64 + expectedInstallationCurrent int + expectedArtifactStartedCalled int + expectedArtifactIncrementCalled int + expectedArtifactCompletedCalled int + expectedArtifactFailureCalled int + }{ + { + name: "no errors, no build", + events: successEvents, + expectedBuildStarted: false, + expectedBuildCompleted: false, + expectedBuildTotal: int64(0), + expectedBuildCurrent: 0, + expectedInstallationStarted: true, + expectedInstallationTotal: int64(2), + expectedInstallationCurrent: 2, + expectedArtifactStartedCalled: 4, + expectedArtifactIncrementCalled: 4, + expectedArtifactCompletedCalled: 4, + expectedArtifactFailureCalled: 0, + }, + { + name: "installation failure, no build", + events: failedEvents, + expectedBuildStarted: false, + expectedBuildCompleted: false, + expectedBuildTotal: int64(0), + expectedBuildCurrent: 0, + expectedInstallationStarted: true, + expectedInstallationTotal: int64(2), + expectedInstallationCurrent: 0, + expectedArtifactStartedCalled: 4, + expectedArtifactIncrementCalled: 4, + expectedArtifactCompletedCalled: 2, + expectedArtifactFailureCalled: 2, + }, + { + name: "no errors, with build", + events: withBuildSuccessEvents, + expectedBuildStarted: true, + expectedBuildCompleted: true, + expectedBuildTotal: int64(2), + expectedBuildCurrent: 2, + expectedInstallationStarted: true, + expectedInstallationTotal: int64(2), + expectedInstallationCurrent: 2, + expectedArtifactStartedCalled: 4, + expectedArtifactIncrementCalled: 4, + expectedArtifactCompletedCalled: 4, + expectedArtifactFailureCalled: 0, + }, + { + name: "build failures", + events: buildFailureEvents, + expectedBuildStarted: true, + expectedBuildCompleted: true, + expectedBuildTotal: int64(2), + expectedBuildCurrent: 0, + expectedInstallationStarted: false, + expectedInstallationTotal: int64(0), + expectedInstallationCurrent: 0, + expectedArtifactStartedCalled: 0, + expectedArtifactIncrementCalled: 0, + expectedArtifactCompletedCalled: 0, + expectedArtifactFailureCalled: 0, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + evCh := make(chan SetupEventer) + mock := &mockProgressOutput{} + consumer := NewRuntimeEventConsumer(mock, nil) + + go func() { + defer close(evCh) + for _, ev := range tc.events { + evCh <- ev + } + }() + err := consumer.Consume(evCh) + assert.NoError(t, err) + + assert.Equal(t, tc.expectedBuildStarted, mock.buildStarted) + assert.Equal(t, tc.expectedBuildCompleted, mock.buildCompleted) + assert.Equal(t, tc.expectedBuildTotal, mock.buildTotal) + assert.Equal(t, tc.expectedBuildCurrent, mock.buildCurrent) + assert.Equal(t, tc.expectedInstallationTotal, mock.installationTotal) + assert.Equal(t, tc.expectedInstallationCurrent, mock.installationCurrent) + assert.Equal(t, tc.expectedInstallationStarted, mock.installationStarted) + assert.Equal(t, tc.expectedArtifactStartedCalled, mock.artifactStartedCalled) + assert.Equal(t, tc.expectedArtifactIncrementCalled, mock.artifactIncrementCalled) + assert.Equal(t, tc.expectedArtifactCompletedCalled, mock.artifactCompletedCalled) + assert.Equal(t, tc.expectedArtifactFailureCalled, mock.artifactFailureCalled) + }) + } +} diff --git a/pkg/platform/runtime/setup/events/events.go b/pkg/platform/runtime/setup/events/events.go new file mode 100644 index 0000000000..9b9a37f71e --- /dev/null +++ b/pkg/platform/runtime/setup/events/events.go @@ -0,0 +1,231 @@ +// Package events handles the processing of setup events. As these events can be +// sent in parallel, all events are collected in a single go-routine to simplify +// their processing. +// +// The events are generated in the RuntimeEventProducer which exposes an events +// channel that can be consumed by the RuntimeEventConsumer. The consumer then +// delegates the event handling to digesters: ProgressDigester and +// ChangeSummaryDigester +// +--- RuntimeEventHandler -------------------------------------+ +// | | +// | +-----------------------+ | +// | ,-> | ChangeSummaryDigester | | +// +----------------------+ | +----------------------+ / +-----------------------+ | +// | RuntimeEventProducer | ---------> | | RuntimeEventConsumer | ---+ | +// +----------------------+ .Events() | +----------------------+ \ +------------------+ | +// | `-> | ProgressDigester | | +// | +------------------+ | +// +-------------------------------------------------------------+ +// The runbits package has default implementations for digesters, and the +// RuntimeEventHandler combines the consumer with its digesters. +package events + +// This file contains the definition of all events that the RuntimeEventProducer creates. + +import ( + "fmt" + + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" +) + +// SetupStep is the step the runtime setup routine is currently at. +type SetupStep int + +const ( + // Build refers to a remote building artifact + Build SetupStep = iota + // Download refers to a currently downloading artifact + Download + // Unpack refers to the step where an artifact tarball is currently being unpacked + Unpack + // Install refers to all the post-processing that needs to happen to get an artifact ready for use. + Install +) + +func (s SetupStep) String() string { + switch s { + case Build: + return "build" + case Download: + return "download" + case Unpack: + return "unpack" + case Install: + return "install" + default: + return "invalid" + } +} + +// SetupEventer is the interface that every setup event should implement +type SetupEventer interface { + // String returns a description of the event + String() string +} + +// ArtifactSetupEventer describes the methods for an event that reports progress on a specific artifact +type ArtifactSetupEventer interface { + SetupEventer + Step() SetupStep + ArtifactID() artifact.ArtifactID +} + +// baseEvent is a re-usable struct that implements the Step() and String() methods +type baseEvent struct { + name string + step SetupStep +} + +func newBaseEvent(name string, step SetupStep) baseEvent { + return baseEvent{name, step} +} + +func (be baseEvent) String() string { + return be.name +} + +func (be baseEvent) Step() SetupStep { + return be.step +} + +// artifactBaseEvent is a re-usable struct that implements the ArtifactEventer interface +type artifactBaseEvent struct { + baseEvent + artifactID artifact.ArtifactID +} + +func newArtifactBaseEvent(suffix string, step SetupStep, artifactID artifact.ArtifactID) artifactBaseEvent { + return artifactBaseEvent{newBaseEvent(fmt.Sprintf("artifact_%s_%s", step.String(), suffix), step), artifactID} +} + +// TotalArtifactEvent reports the number of total artifacts as soon as they are known +type TotalArtifactEvent struct { + total int +} + +// Total returns the number of artifacts that we are dealing with +func (te TotalArtifactEvent) Total() int { + return te.total +} + +func (te TotalArtifactEvent) String() string { + return "artifact_total" +} + +func newTotalArtifactEvent(total int) TotalArtifactEvent { + return TotalArtifactEvent{total} +} + +// BuildStartEvent reports the beginning of the remote build process +type BuildStartEvent struct { + baseEvent +} + +func newBuildStartEvent() BuildStartEvent { + return BuildStartEvent{newBaseEvent("build_start", Build)} +} + +// BuildCompleteEvent reports the successful completion of a build +type BuildCompleteEvent struct { + baseEvent +} + +func newBuildCompleteEvent() BuildCompleteEvent { + return BuildCompleteEvent{newBaseEvent("build_complete", Build)} +} + +func (be artifactBaseEvent) ArtifactID() artifact.ArtifactID { + return be.artifactID +} + +// ArtifactStartEvent is sent when an artifact enters a new processing step +type ArtifactStartEvent struct { + artifactBaseEvent + artifactName string + total int +} + +func newArtifactStartEvent(step SetupStep, artifactID artifact.ArtifactID, artifactName string, total int) ArtifactStartEvent { + return ArtifactStartEvent{newArtifactBaseEvent("start", step, artifactID), artifactName, total} +} + +// ArtifactName returns the name of the artifact that entered the new step +func (ase ArtifactStartEvent) ArtifactName() string { + return ase.artifactName +} + +// Total returns the total number of elements (usually bytes) that we expect for this artifact in the given step +func (ase ArtifactStartEvent) Total() int { + return ase.total +} + +// ArtifactProgressEvent is sent when the artifact has progressed in the given step +type ArtifactProgressEvent struct { + artifactBaseEvent + increment int +} + +// Progress returns the increment by which the artifact has progressed +func (ue ArtifactProgressEvent) Progress() int { + return ue.increment +} + +func newArtifactProgressEvent(step SetupStep, artifactID artifact.ArtifactID, increment int) ArtifactProgressEvent { + return ArtifactProgressEvent{newArtifactBaseEvent("progress", step, artifactID), increment} +} + +// ArtifactCompleteEvent is sent when an artifact step completed +type ArtifactCompleteEvent struct { + artifactBaseEvent +} + +func newArtifactCompleteEvent(step SetupStep, artifactID artifact.ArtifactID) ArtifactCompleteEvent { + return ArtifactCompleteEvent{newArtifactBaseEvent("complete", step, artifactID)} +} + +// ArtifactFailureEvent is sent when an artifact failed to process through the given step +type ArtifactFailureEvent struct { + artifactBaseEvent + errorMessage string +} + +// Failure returns a description of the error message +func (fe ArtifactFailureEvent) Failure() string { + return fe.errorMessage +} + +func newArtifactFailureEvent(step SetupStep, artifactID artifact.ArtifactID, errorMessage string) ArtifactFailureEvent { + return ArtifactFailureEvent{newArtifactBaseEvent("failure", step, artifactID), errorMessage} +} + +// ChangeSummaryEvent is sent when a the information to summarize the changes introduced by this runtime is available +type ChangeSummaryEvent struct { + artifacts map[artifact.ArtifactID]artifact.ArtifactRecipe + requested artifact.ArtifactChangeset + changed artifact.ArtifactChangeset +} + +func (cse ChangeSummaryEvent) String() string { + return "change_summary" +} + +// Artifacts returns the map of ArtifactRecipe structs extracted from the recipe +func (cse ChangeSummaryEvent) Artifacts() map[artifact.ArtifactID]artifact.ArtifactRecipe { + return cse.artifacts +} + +// RequestedChangeset returns the changeset information for artifacts that the user requested to change (add/remove/update) +func (cse ChangeSummaryEvent) RequestedChangeset() artifact.ArtifactChangeset { + return cse.requested +} + +// CompleteChangeset returns the changeset information for all artifacts that have changed relative to the locally installed runtime +func (cse ChangeSummaryEvent) CompleteChangeset() artifact.ArtifactChangeset { + return cse.changed +} + +func newChangeSummaryEvent(artifacts map[artifact.ArtifactID]artifact.ArtifactRecipe, requested artifact.ArtifactChangeset, changed artifact.ArtifactChangeset) ChangeSummaryEvent { + return ChangeSummaryEvent{ + artifacts, requested, changed, + } +} diff --git a/pkg/platform/runtime/setup/events/handler.go b/pkg/platform/runtime/setup/events/handler.go new file mode 100644 index 0000000000..8e483ed854 --- /dev/null +++ b/pkg/platform/runtime/setup/events/handler.go @@ -0,0 +1,28 @@ +package events + +import ( + "github.com/ActiveState/cli/internal/errs" +) + +type RuntimeEventHandler struct { + progress ProgressDigester + summary ChangeSummaryDigester +} + +func NewRuntimeEventHandler(progress ProgressDigester, summary ChangeSummaryDigester) *RuntimeEventHandler { + return &RuntimeEventHandler{progress, summary} +} + +// WaitForAllEvents prints output based on runtime events received on the events channel +func (rmh *RuntimeEventHandler) WaitForAllEvents(events <-chan SetupEventer) error { + // Asynchronous progress digester may need to be closed after + defer rmh.progress.Close() + + eh := NewRuntimeEventConsumer(rmh.progress, rmh.summary) + err := eh.Consume(events) + if err != nil { + return errs.Wrap(err, "Failed to consume runtime events") + } + + return nil +} diff --git a/pkg/platform/runtime/setup/events/incprogress.go b/pkg/platform/runtime/setup/events/incprogress.go new file mode 100644 index 0000000000..9ff1c64470 --- /dev/null +++ b/pkg/platform/runtime/setup/events/incprogress.go @@ -0,0 +1,31 @@ +package events + +import "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + +// IncrementalProgress is a wrapper around the events producer that can be used to report incremental progress of a step +// It sends a start event as soon as the total size is known, and sends byte increments through IncrBy +type IncrementalProgress struct { + p ArtifactStepProgresser + step SetupStep + artifactID artifact.ArtifactID + artifactName string +} + +type ArtifactStepProgresser interface { + ArtifactStepStarting(SetupStep, artifact.ArtifactID, string, int) + ArtifactStepProgress(SetupStep, artifact.ArtifactID, int) +} + +func NewIncrementalProgress(p ArtifactStepProgresser, step SetupStep, artifactID artifact.ArtifactID, artifactName string) *IncrementalProgress { + return &IncrementalProgress{ + p, step, artifactID, artifactName, + } +} + +func (spp *IncrementalProgress) TotalSize(total int) { + spp.p.ArtifactStepStarting(spp.step, spp.artifactID, spp.artifactName, total) +} + +func (spp *IncrementalProgress) IncrBy(by int) { + spp.p.ArtifactStepProgress(spp.step, spp.artifactID, by) +} diff --git a/pkg/platform/runtime/setup/events/producer.go b/pkg/platform/runtime/setup/events/producer.go new file mode 100644 index 0000000000..f1a3f1199e --- /dev/null +++ b/pkg/platform/runtime/setup/events/producer.go @@ -0,0 +1,77 @@ +package events + +import ( + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/go-openapi/strfmt" +) + +// RuntimeEventProducer implements a setup.MessageHandler, and translates the +// runtime messages into events communicated over a wrapped events channel. +// The events need to be consumed by the RuntimeEventConsumer. +type RuntimeEventProducer struct { + events chan SetupEventer +} + +func NewRuntimeEventProducer() *RuntimeEventProducer { + eventCh := make(chan SetupEventer) + return &RuntimeEventProducer{eventCh} +} + +func (r *RuntimeEventProducer) Events() <-chan SetupEventer { + return r.events +} + +func (r *RuntimeEventProducer) Close() { + close(r.events) +} +func (r *RuntimeEventProducer) event(be SetupEventer) { + r.events <- be +} + +func (r *RuntimeEventProducer) TotalArtifacts(total int) { + r.event(newTotalArtifactEvent(total)) +} + +func (r *RuntimeEventProducer) BuildStarting(_ int) { + r.event(newBuildStartEvent()) +} + +func (r *RuntimeEventProducer) BuildFinished() { + r.event(newBuildCompleteEvent()) +} + +func (r *RuntimeEventProducer) ArtifactBuildStarting(artifactID artifact.ArtifactID, artifactName string) { + r.event(newArtifactStartEvent(Build, artifactID, artifactName, 1)) +} + +func (r *RuntimeEventProducer) ArtifactBuildCached(artifactID artifact.ArtifactID) { + r.event(newArtifactCompleteEvent(Build, artifactID)) +} + +func (r *RuntimeEventProducer) ArtifactBuildCompleted(artifactID artifact.ArtifactID) { + r.event(newArtifactCompleteEvent(Build, artifactID)) +} + +func (r *RuntimeEventProducer) ArtifactBuildFailed(artifactID artifact.ArtifactID, errorMessage string) { + r.event(newArtifactFailureEvent(Build, artifactID, errorMessage)) +} + +func (r *RuntimeEventProducer) ChangeSummary(artifacts map[artifact.ArtifactID]artifact.ArtifactRecipe, requested artifact.ArtifactChangeset, changed artifact.ArtifactChangeset) { + r.event(newChangeSummaryEvent(artifacts, requested, changed)) +} + +func (r *RuntimeEventProducer) ArtifactStepStarting(step SetupStep, artifactID artifact.ArtifactID, artifactName string, total int) { + r.event(newArtifactStartEvent(step, artifactID, artifactName, total)) +} + +func (r *RuntimeEventProducer) ArtifactStepProgress(step SetupStep, artifactID artifact.ArtifactID, update int) { + r.event(newArtifactProgressEvent(step, artifactID, update)) +} + +func (r *RuntimeEventProducer) ArtifactStepCompleted(step SetupStep, artifactID strfmt.UUID) { + r.event(newArtifactCompleteEvent(step, artifactID)) +} + +func (r *RuntimeEventProducer) ArtifactStepFailed(step SetupStep, artifactID strfmt.UUID, errorMsg string) { + r.event(newArtifactFailureEvent(step, artifactID, errorMsg)) +} diff --git a/pkg/platform/runtime/setup/implementations/alternative/artifact.go b/pkg/platform/runtime/setup/implementations/alternative/artifact.go new file mode 100644 index 0000000000..f329905b66 --- /dev/null +++ b/pkg/platform/runtime/setup/implementations/alternative/artifact.go @@ -0,0 +1,47 @@ +package alternative + +import ( + "os" + "path/filepath" + + "github.com/ActiveState/cli/internal/constants" + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/internal/fileutils" + "github.com/ActiveState/cli/internal/logging" + "github.com/ActiveState/cli/internal/unarchiver" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/ActiveState/cli/pkg/platform/runtime/envdef" + "github.com/ActiveState/cli/pkg/platform/runtime/store" +) + +type ArtifactSetup struct { + artifactID artifact.ArtifactID + store *store.Store +} + +func NewArtifactSetup(artifactID artifact.ArtifactID, store *store.Store) *ArtifactSetup { + return &ArtifactSetup{artifactID, store} +} + +func (as *ArtifactSetup) EnvDef(tmpDir string) (*envdef.EnvironmentDefinition, error) { + path := filepath.Join(tmpDir, constants.RuntimeDefinitionFilename) + e, err := envdef.NewEnvironmentDefinition(path) + if err != nil { + return nil, errs.Wrap(err, "Could not load environment definitions for artifact.") + } + + // Remove the runtime.json file because we don't want it in the installdir + if err := os.Remove(path); err != nil { + logging.Error("Could not remove environment definition file: %s", path) + } + + return e, nil +} + +func (as *ArtifactSetup) Move(tmpDir string) error { + return fileutils.MoveAllFilesRecursively(tmpDir, as.store.InstallPath(), func(string, string) {}) +} + +func (as *ArtifactSetup) Unarchiver() unarchiver.Unarchiver { + return unarchiver.NewTarGz() +} diff --git a/pkg/platform/runtime/setup/implementations/alternative/runtime.go b/pkg/platform/runtime/setup/implementations/alternative/runtime.go new file mode 100644 index 0000000000..0d1271d3eb --- /dev/null +++ b/pkg/platform/runtime/setup/implementations/alternative/runtime.go @@ -0,0 +1,64 @@ +package alternative + +import ( + "os" + + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/internal/fileutils" + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/pkg/platform/api/headchef/headchef_models" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/ActiveState/cli/pkg/platform/runtime/store" + "github.com/go-openapi/strfmt" +) + +type Setup struct { + artifacts artifact.ArtifactRecipeMap + store *store.Store +} + +func NewSetup(store *store.Store, artifacts artifact.ArtifactRecipeMap) *Setup { + return &Setup{store: store, artifacts: artifacts} +} + +func (s *Setup) DeleteOutdatedArtifacts(changeset artifact.ArtifactChangeset, storedArtifacted store.StoredArtifactMap) error { + del := map[strfmt.UUID]struct{}{} + for _, upd := range changeset.Updated { + del[upd.FromID] = struct{}{} + } + for _, id := range changeset.Removed { + del[id] = struct{}{} + } + + for _, artf := range storedArtifacted { + if _, deleteMe := del[artf.ArtifactID]; !deleteMe { + continue + } + + for _, file := range artf.Files { + if !fileutils.TargetExists(file) { + continue // don't care it's already deleted (might have been deleted by another artifact that supplied the same file) + } + if err := os.Remove(file); err != nil { + return locale.WrapError(err, "err_rm_artf", "", "Could not remove old package file at {{.V0}}.", file) + } + } + + if err := s.store.DeleteArtifactStore(artf.ArtifactID); err != nil { + return errs.Wrap(err, "Could not delete artifact store") + } + } + + return nil +} + +func (s *Setup) ResolveArtifactName(a artifact.ArtifactID) string { + if artf, ok := s.artifacts[a]; ok { + return artf.Name + } + return locale.Tl("alternative_unknown_pkg_name", "unknown") +} + +func (s *Setup) DownloadsFromBuild(buildStatus *headchef_models.BuildStatusResponse) ([]artifact.ArtifactDownload, error) { + return artifact.NewDownloadsFromBuild(buildStatus) +} diff --git a/pkg/platform/runtime/ape_installer.go b/pkg/platform/runtime/setup/implementations/camel/ape_installer.go similarity index 90% rename from pkg/platform/runtime/ape_installer.go rename to pkg/platform/runtime/setup/implementations/camel/ape_installer.go index 131a5f088e..8f58fd89a3 100644 --- a/pkg/platform/runtime/ape_installer.go +++ b/pkg/platform/runtime/setup/implementations/camel/ape_installer.go @@ -1,4 +1,4 @@ -package runtime +package camel import ( "bufio" @@ -19,14 +19,14 @@ import ( // installActivePerl will unpack the installer archive, locate the install script, and then use the installer // script to install an ActivePerl runtime to the configured runtime dir. Any failures // during this process will result in a failed installation and the install-dir being removed. -func (m *MetaData) perlRelocationDir() (string, error) { +func (m *MetaData) perlRelocationDir(installRoot string) (string, error) { relocFile := filepath.Join("bin", "reloc_perl") if runtime.GOOS == "windows" { relocFile = filepath.Join("bin", "config_data") } - relocFilePath := filepath.Join(m.Path, relocFile) + relocFilePath := filepath.Join(installRoot, relocFile) if !fileutils.FileExists(relocFilePath) { - return "", locale.NewError("installer_err_runtime_no_file", "", m.Path, relocFile) + return "", locale.NewError("installer_err_runtime_no_file", "", installRoot, relocFile) } f, err := os.Open(relocFilePath) @@ -48,7 +48,7 @@ func (m *MetaData) perlRelocationDir() (string, error) { rx := regexp.MustCompile(fmt.Sprintf(`#!(.*)%sbin`, separator)) match := rx.FindStringSubmatch(line) if len(match) != 2 { - return "", &ErrNoPrefixes{locale.NewError("installer_err_fail_obtain_prefixes", "", m.Path)} + return "", &ErrNoPrefixes{locale.NewError("installer_err_fail_obtain_prefixes", "", installRoot)} } return match[1], nil diff --git a/pkg/platform/runtime/apy_installer.go b/pkg/platform/runtime/setup/implementations/camel/apy_installer.go similarity index 92% rename from pkg/platform/runtime/apy_installer.go rename to pkg/platform/runtime/setup/implementations/camel/apy_installer.go index fa1abaf9c7..27f14b43f3 100644 --- a/pkg/platform/runtime/apy_installer.go +++ b/pkg/platform/runtime/setup/implementations/camel/apy_installer.go @@ -1,4 +1,4 @@ -package runtime +package camel import ( "os/exec" @@ -15,13 +15,13 @@ import ( // InstallFromArchive will unpack the installer archive, locate the install script, and then use the installer // script to install an ActivePython runtime to the configured runtime dir. Any failures // during this process will result in a failed installation and the install-dir being removed. -func (m *MetaData) pythonRelocationDir() (string, error) { - python, err := locatePythonExecutable(m.Path) +func (m *MetaData) pythonRelocationDir(installRoot string) (string, error) { + python, err := locatePythonExecutable(installRoot) if err != nil { return "", err } - prefix, err := extractPythonRelocationPrefix(m.Path, python) + prefix, err := extractPythonRelocationPrefix(installRoot, python) if err != nil { return "", err } diff --git a/pkg/platform/runtime/setup/implementations/camel/artifact.go b/pkg/platform/runtime/setup/implementations/camel/artifact.go new file mode 100644 index 0000000000..26ba31acd6 --- /dev/null +++ b/pkg/platform/runtime/setup/implementations/camel/artifact.go @@ -0,0 +1,223 @@ +package camel + +import ( + "bytes" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "strings" + + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/internal/fileutils" + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/internal/unarchiver" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/ActiveState/cli/pkg/platform/runtime/envdef" + "github.com/ActiveState/cli/pkg/platform/runtime/store" + "github.com/thoas/go-funk" +) + +type ErrNotExecutable struct{ *locale.LocalizedError } + +type ErrNoPrefixes struct{ *locale.LocalizedError } + +type ArtifactSetup struct { + artifactID artifact.ArtifactID + store *store.Store +} + +func NewArtifactSetup(artifactID artifact.ArtifactID, store *store.Store) *ArtifactSetup { + return &ArtifactSetup{artifactID, store} +} + +func (as *ArtifactSetup) EnvDef(tmpDir string) (*envdef.EnvironmentDefinition, error) { + // camel archives are structured like this + // / + // / + // artifact contents ... + // metadata.json + + // First: We need to identify the values for and + + var archiveName string + fs, err := ioutil.ReadDir(tmpDir) + if err != nil { + return nil, errs.Wrap(err, "Could not read temporary installation directory %s", tmpDir) + } + for _, f := range fs { + if f.IsDir() { + archiveName = f.Name() + } + } + if archiveName == "" { + return nil, errs.New("Expected sub-directory in extracted artifact tarball.") + } + + tmpBaseDir := filepath.Join(tmpDir, archiveName) + + // parse the legacy metadata + md, err := InitMetaData(tmpBaseDir) + if err != nil { + return nil, errs.Wrap(err, "Could not load meta data definitions for camel artifact.") + } + + // convert file relocation commands into an envdef.FileTransform slice + transforms, err := convertToFileTransforms(tmpBaseDir, md.InstallDir, md) + if err != nil { + return nil, errs.Wrap(err, "Could not determine file transformations") + } + + // convert environment variables into an envdef.EnvironmentVariable slice + vars := convertToEnvVars(md) + + ed := &envdef.EnvironmentDefinition{ + InstallDir: filepath.Join(archiveName, md.InstallDir), + Transforms: transforms, + Env: vars, + } + + return ed, nil +} + +func convertToEnvVars(metadata *MetaData) []envdef.EnvironmentVariable { + var res []envdef.EnvironmentVariable + if metadata.AffectedEnv != "" { + res = append(res, envdef.EnvironmentVariable{ + Name: metadata.AffectedEnv, + Values: []string{}, + Inherit: false, + Join: envdef.Disallowed, + }) + } + for k, v := range metadata.Env { + res = append(res, envdef.EnvironmentVariable{ + Name: k, + Values: []string{v}, + Inherit: false, + }) + } + var binPaths []string + + // set up PATH according to binary locations + for _, v := range metadata.BinaryLocations { + path := v.Path + if v.Relative { + path = filepath.Join("${INSTALLDIR}", path) + } + binPaths = append(binPaths, path) + } + + // Add DLL dir to PATH on Windows + if runtime.GOOS == "windows" && metadata.RelocationTargetBinaries != "" { + binPaths = append(binPaths, filepath.Join("${INSTALLDIR}", metadata.RelocationTargetBinaries)) + + } + + res = append(res, envdef.EnvironmentVariable{ + Name: "PATH", + Values: funk.ReverseStrings(binPaths), + Inherit: true, + Join: envdef.Prepend, + Separator: string(os.PathListSeparator), + }) + + return res +} + +func paddingForBinaryFile(isBinary bool) *string { + if !isBinary { + return nil + } + pad := "\000" + return &pad +} + +func convertToFileTransforms(tmpBaseDir string, relInstDir string, metadata *MetaData) ([]envdef.FileTransform, error) { + var res []envdef.FileTransform + instDir := filepath.Join(tmpBaseDir, relInstDir) + for _, tr := range metadata.TargetedRelocations { + // walk through files in tr.InDir and find files that need replacements. For those we create a FileTransform element + trans, err := fileTransformsInDir(instDir, filepath.Join(instDir, tr.InDir), tr.SearchString, tr.Replacement, func(_ string, _ bool) bool { return true }) + if err != nil { + return res, errs.Wrap(err, "Failed convert targeted relocations") + } + res = append(res, trans...) + } + + // metadata.RelocationDir is the string to search for and replace with ${INSTALLDIR} + if metadata.RelocationDir == "" { + return res, nil + } + binariesSeparate := runtime.GOOS == "linux" && metadata.RelocationTargetBinaries != "" + + relocFilePath := filepath.Join(tmpBaseDir, "support", "reloc.txt") + relocMap := map[string]bool{} + if fileutils.FileExists(relocFilePath) { + relocMap = loadRelocationFile(relocFilePath) + } + + trans, err := fileTransformsInDir(instDir, instDir, metadata.RelocationDir, "${INSTALLDIR}", func(path string, isBinary bool) bool { + return relocMap[path] || !binariesSeparate || !isBinary + }) + if err != nil { + return res, errs.Wrap(err, "Could not determine transformations in installation directory") + } + res = append(res, trans...) + + if binariesSeparate { + trans, err := fileTransformsInDir(instDir, instDir, metadata.RelocationDir, "${INSTALLDIR}", func(_ string, isBinary bool) bool { + return isBinary + }) + if err != nil { + return res, errs.Wrap(err, "Could not determine separate binary transformations in installation directory") + } + res = append(res, trans...) + } + return res, nil +} + +// fileTransformsInDir walks through all the files in searchDir and creates a FileTransform item for files that contain searchString and pass the filter function +func fileTransformsInDir(instDir string, searchDir string, searchString string, replacement string, filter func(string, bool) bool) ([]envdef.FileTransform, error) { + var res []envdef.FileTransform + + err := filepath.Walk(searchDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if info.IsDir() { + return nil + } + + b, err := ioutil.ReadFile(path) + if err != nil { + return errs.Wrap(err, "Could not read file path %s", path) + } + + // relativePath is the path relative to the installation directory + relativePath := strings.TrimPrefix(path, instDir) + isBinary := fileutils.IsBinary(b) + if !filter(relativePath, isBinary) { + return nil + } + if bytes.Contains(b, []byte(searchString)) { + res = append(res, envdef.FileTransform{ + In: []string{relativePath}, + Pattern: searchString, + With: replacement, + PadWith: paddingForBinaryFile(isBinary), + }) + } + + return nil + }) + return res, err +} + +func (as *ArtifactSetup) Unarchiver() unarchiver.Unarchiver { + if runtime.GOOS == "windows" { + return unarchiver.NewZip() + } + return unarchiver.NewTarGz() +} diff --git a/pkg/platform/runtime/metadata.go b/pkg/platform/runtime/setup/implementations/camel/metadata.go similarity index 75% rename from pkg/platform/runtime/metadata.go rename to pkg/platform/runtime/setup/implementations/camel/metadata.go index 1a40448717..feb14de768 100644 --- a/pkg/platform/runtime/metadata.go +++ b/pkg/platform/runtime/setup/implementations/camel/metadata.go @@ -1,9 +1,10 @@ -package runtime +package camel import ( "encoding/json" "os" "path/filepath" + "strings" "github.com/ActiveState/cli/internal/constants" "github.com/ActiveState/cli/internal/errs" @@ -25,8 +26,8 @@ type TargetedRelocation struct { // MetaData is used to parse the metadata.json file type MetaData struct { - // Path is the directory containing the meta file - Path string + // InstallDir is the root directory of the artifact files that we need to copy on the user's machine + InstallDir string // AffectedEnv is an environment variable that we should ensure is not set, as it might conflict with the artifact AffectedEnv string `json:"affected_env"` @@ -59,9 +60,9 @@ type MetaDataBinary struct { } // InitMetaData will create an instance of MetaData based on the metadata.json file found under the given artifact install dir -func InitMetaData(installDir string) (*MetaData, error) { +func InitMetaData(rootDir string) (*MetaData, error) { var metaData *MetaData - metaFile := filepath.Join(installDir, constants.RuntimeMetaFile) + metaFile := filepath.Join(rootDir, "support", constants.RuntimeMetaFile) if fileutils.FileExists(metaFile) { contents, err := fileutils.ReadFile(metaFile) if err != nil { @@ -80,8 +81,20 @@ func InitMetaData(installDir string) (*MetaData, error) { metaData.Env = map[string]string{} } - metaData.Path = installDir - err := metaData.Prepare() + var relInstallDir string + installDirs := strings.Split(constants.RuntimeInstallDirs, ",") + for _, dir := range installDirs { + if fileutils.DirExists(filepath.Join(rootDir, dir)) { + relInstallDir = dir + } + } + + if relInstallDir == "" { + logging.Debug("Did not find an installation directory relative to metadata file.") + } + + metaData.InstallDir = relInstallDir + err := metaData.Prepare(filepath.Join(rootDir, relInstallDir)) if err != nil { return nil, err } @@ -107,11 +120,11 @@ func ParseMetaData(contents []byte) (*MetaData, error) { return metaData, nil } -func (m *MetaData) hasBinaryFile(executable string) bool { +func (m *MetaData) hasBinaryFile(root string, executable string) bool { for _, dir := range m.BinaryLocations { parent := "" if dir.Relative { - parent = m.Path + parent = root } bin := filepath.Join(parent, dir.Path, executable) if fileutils.FileExists(bin) { @@ -129,6 +142,10 @@ func (m *MetaData) setPythonEnv() { logging.Debug("Not setting PYTHONPATH as the user already has it set") } + // This is broken for two reasons: + // 1. Checking in the OS environment will only happen on installation, but at a later point, the OS environment might have changed, and we will overwrite the user's choice here + // 2. python code does not need to depend on PYTHONIOENCODING as pointed out here: https://stackoverflow.com/a/9942822 + // Follow up story is here: https://www.pivotaltracker.com/story/show/177407383 if os.Getenv("PYTHONIOENCODING") == "" { m.Env["PYTHONIOENCODING"] = "utf-8" } else { diff --git a/pkg/platform/runtime/metadata_test.go b/pkg/platform/runtime/setup/implementations/camel/metadata_test.go similarity index 86% rename from pkg/platform/runtime/metadata_test.go rename to pkg/platform/runtime/setup/implementations/camel/metadata_test.go index 102e1ba787..cb706b18b4 100644 --- a/pkg/platform/runtime/metadata_test.go +++ b/pkg/platform/runtime/setup/implementations/camel/metadata_test.go @@ -1,13 +1,12 @@ -package runtime_test +package camel_test import ( "io/ioutil" "os" "testing" + "github.com/ActiveState/cli/pkg/platform/runtime/setup/implementations/camel" "github.com/stretchr/testify/suite" - - "github.com/ActiveState/cli/pkg/platform/runtime" ) type MetaDataTestSuite struct { @@ -39,7 +38,7 @@ func (suite *MetaDataTestSuite) TestMetaData() { "relocation_dir": "/relocate" }` - metaData, err := runtime.ParseMetaData([]byte(contents)) + metaData, err := camel.ParseMetaData([]byte(contents)) suite.Require().NoError(err) suite.Equal("PYTHONPATH", metaData.AffectedEnv) suite.Equal("/relocate", metaData.RelocationDir) diff --git a/pkg/platform/runtime/prepare_lin_win.go b/pkg/platform/runtime/setup/implementations/camel/prepare_lin_win.go similarity index 71% rename from pkg/platform/runtime/prepare_lin_win.go rename to pkg/platform/runtime/setup/implementations/camel/prepare_lin_win.go index 7df84e9f56..6a168af930 100644 --- a/pkg/platform/runtime/prepare_lin_win.go +++ b/pkg/platform/runtime/setup/implementations/camel/prepare_lin_win.go @@ -1,6 +1,6 @@ // +build !darwin -package runtime +package camel import ( "runtime" @@ -12,7 +12,7 @@ import ( // Prepare will assume the LibLocation in cases where the metadata // doesn't contain it and we know what it should be -func (m *MetaData) Prepare() error { +func (m *MetaData) Prepare(installRoot string) error { // BinaryLocations if m.BinaryLocations == nil || len(m.BinaryLocations) == 0 { m.BinaryLocations = []MetaDataBinary{ @@ -24,7 +24,7 @@ func (m *MetaData) Prepare() error { } // Python - if m.hasBinaryFile(constants.ActivePython3Executable) || m.hasBinaryFile(constants.ActivePython2Executable) { + if m.hasBinaryFile(installRoot, constants.ActivePython3Executable) || m.hasBinaryFile(installRoot, constants.ActivePython2Executable) { logging.Debug("Detected Python artifact, ensuring backwards compatibility") // RelocationTargetBinaries @@ -38,7 +38,7 @@ func (m *MetaData) Prepare() error { // RelocationDir if m.RelocationDir == "" { var err error - if m.RelocationDir, err = m.pythonRelocationDir(); err != nil { + if m.RelocationDir, err = m.pythonRelocationDir(installRoot); err != nil { return err } } @@ -46,13 +46,13 @@ func (m *MetaData) Prepare() error { m.setPythonEnv() //Perl - } else if m.hasBinaryFile(constants.ActivePerlExecutable) { + } else if m.hasBinaryFile(installRoot, constants.ActivePerlExecutable) { logging.Debug("Detected Perl artifact, ensuring backwards compatibility") // RelocationDir if m.RelocationDir == "" { var err error - if m.RelocationDir, err = m.perlRelocationDir(); err != nil { + if m.RelocationDir, err = m.perlRelocationDir(installRoot); err != nil { return err } } @@ -61,11 +61,11 @@ func (m *MetaData) Prepare() error { m.AffectedEnv = "PERL5LIB" } } else { - logging.Debug("No language detected for %s", m.Path) + logging.Debug("No language detected for %s", installRoot) } if m.RelocationDir == "" { - return locale.NewError("installer_err_runtime_missing_meta", "", m.Path) + return locale.NewError("installer_err_runtime_missing_meta", "", installRoot) } return nil diff --git a/pkg/platform/runtime/prepare_lin_win_test.go b/pkg/platform/runtime/setup/implementations/camel/prepare_lin_win_test.go similarity index 82% rename from pkg/platform/runtime/prepare_lin_win_test.go rename to pkg/platform/runtime/setup/implementations/camel/prepare_lin_win_test.go index 4a5af4d5f5..5c193d6423 100644 --- a/pkg/platform/runtime/prepare_lin_win_test.go +++ b/pkg/platform/runtime/setup/implementations/camel/prepare_lin_win_test.go @@ -1,6 +1,6 @@ // +build !darwin -package runtime_test +package camel_test import ( "fmt" @@ -10,7 +10,7 @@ import ( "strings" "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/pkg/platform/runtime" + "github.com/ActiveState/cli/pkg/platform/runtime/setup/implementations/camel" ) func (suite *MetaDataTestSuite) TestMetaData_Prepare() { @@ -19,7 +19,7 @@ func (suite *MetaDataTestSuite) TestMetaData_Prepare() { "binaries_in": [ { "path": "%s", - "relative": 1 + "relative": 0 } ], "relocation_dir": "/relocate" @@ -41,10 +41,10 @@ func (suite *MetaDataTestSuite) TestMetaData_Prepare() { suite.Require().NoError(err) contents := fmt.Sprintf(template, tempDir) - metaData, err := runtime.ParseMetaData([]byte(contents)) + metaData, err := camel.ParseMetaData([]byte(contents)) suite.Require().NoError(err) - err = metaData.Prepare() + err = metaData.Prepare(suite.dir) suite.Require().NoError(err) suite.Require().NotEmpty(metaData.Env["PYTHONIOENCODING"]) } diff --git a/pkg/platform/runtime/prepare_mac.go b/pkg/platform/runtime/setup/implementations/camel/prepare_mac.go similarity index 80% rename from pkg/platform/runtime/prepare_mac.go rename to pkg/platform/runtime/setup/implementations/camel/prepare_mac.go index 323caaa40b..9b72b4c4f9 100644 --- a/pkg/platform/runtime/prepare_mac.go +++ b/pkg/platform/runtime/setup/implementations/camel/prepare_mac.go @@ -1,6 +1,6 @@ // +build darwin -package runtime +package camel import ( "io/ioutil" @@ -17,7 +17,7 @@ import ( // Prepare ensures Metadata can handle Python runtimes on MacOS. // These runtimes do not include metadata files as they should // be runnable from where they are unarchived -func (m *MetaData) Prepare() error { +func (m *MetaData) Prepare(installRoot string) error { frameWorkDir := "Library/Frameworks/Python.framework/Versions/" m.BinaryLocations = []MetaDataBinary{ MetaDataBinary{ @@ -26,14 +26,14 @@ func (m *MetaData) Prepare() error { }, } - if !m.hasBinaryFile(constants.ActivePython3Executable) && !m.hasBinaryFile(constants.ActivePython2Executable) { - logging.Debug("No language detected for %s", m.Path) + if !m.hasBinaryFile(installRoot, constants.ActivePython3Executable) && !m.hasBinaryFile(installRoot, constants.ActivePython2Executable) { + logging.Debug("No language detected for %s", installRoot) return nil } m.setPythonEnv() - libDir := filepath.Join(m.Path, frameWorkDir, "Current", "lib") + libDir := filepath.Join(installRoot, frameWorkDir, "Current", "lib") dirRe := regexp.MustCompile(`python\d+.\d+`) files, err := ioutil.ReadDir(libDir) @@ -60,7 +60,7 @@ func (m *MetaData) Prepare() error { // the binaries are actually in a versioned directory // this version is likely the same as the found above, but it doesn't hurt to get explicitly dirRe = regexp.MustCompile(`\d+(?:\.\d+)+`) - files, err = ioutil.ReadDir(filepath.Join(m.Path, frameWorkDir)) + files, err = ioutil.ReadDir(filepath.Join(installRoot, frameWorkDir)) if err != nil { return errs.Wrap(err, "OS failure") } @@ -83,7 +83,7 @@ func (m *MetaData) Prepare() error { m.TargetedRelocations = []TargetedRelocation{TargetedRelocation{ InDir: filepath.Join(frameWorkDir, "Current", "bin"), SearchString: "#!" + filepath.Join("/", relVersionedFrameWorkDir), - Replacement: "#!" + filepath.Join(m.Path, relVersionedFrameWorkDir), + Replacement: "#!" + filepath.Join("${INSTALLDIR}", relVersionedFrameWorkDir), }} } diff --git a/pkg/platform/runtime/prepare_mac_test.go b/pkg/platform/runtime/setup/implementations/camel/prepare_mac_test.go similarity index 81% rename from pkg/platform/runtime/prepare_mac_test.go rename to pkg/platform/runtime/setup/implementations/camel/prepare_mac_test.go index 6f88e7e7cc..8a788fd687 100644 --- a/pkg/platform/runtime/prepare_mac_test.go +++ b/pkg/platform/runtime/setup/implementations/camel/prepare_mac_test.go @@ -1,6 +1,6 @@ // +build darwin -package runtime_test +package camel_test import ( "fmt" @@ -8,7 +8,7 @@ import ( "path/filepath" "github.com/ActiveState/cli/internal/fileutils" - "github.com/ActiveState/cli/pkg/platform/runtime" + "github.com/ActiveState/cli/pkg/platform/runtime/setup/implementations/camel" ) func (suite *MetaDataTestSuite) TestMetaData_Prepare() { @@ -50,18 +50,17 @@ func (suite *MetaDataTestSuite) TestMetaData_Prepare() { suite.Require().NoError(err) contents := fmt.Sprintf(template, tempDir) - metaData, err := runtime.ParseMetaData([]byte(contents)) - metaData.Path = suite.dir + metaData, err := camel.ParseMetaData([]byte(contents)) suite.Require().NoError(err) - err = metaData.Prepare() + err = metaData.Prepare(suite.dir) suite.Require().NoError(err) - suite.Require().NotEmpty(metaData.Env["PYTHONIOENCODING"]) + suite.Assert().NotEmpty(metaData.Env["PYTHONIOENCODING"]) suite.Len(metaData.TargetedRelocations, 1, "expected one targeted relocation") - suite.Equal(runtime.TargetedRelocation{ + suite.Equal(camel.TargetedRelocation{ InDir: relBinDir, SearchString: "#!" + filepath.Join("/", relVersionedDir), - Replacement: "#!" + versionedDir, + Replacement: "#!" + filepath.Join("${INSTALLDIR}", relVersionedDir), }, metaData.TargetedRelocations[0], suite.dir) } diff --git a/pkg/platform/runtime/setup/implementations/camel/runtime.go b/pkg/platform/runtime/setup/implementations/camel/runtime.go new file mode 100644 index 0000000000..686685b897 --- /dev/null +++ b/pkg/platform/runtime/setup/implementations/camel/runtime.go @@ -0,0 +1,33 @@ +package camel + +import ( + "os" + + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/internal/logging" + "github.com/ActiveState/cli/pkg/platform/api/headchef/headchef_models" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/ActiveState/cli/pkg/platform/runtime/store" +) + +type Setup struct { + store *store.Store +} + +func NewSetup(s *store.Store) *Setup { + return &Setup{s} +} + +func (s *Setup) DeleteOutdatedArtifacts(_ artifact.ArtifactChangeset, _ store.StoredArtifactMap) error { + err := os.RemoveAll(s.store.InstallPath()) + logging.Error("Error removing previous camel installation: %v", err) + return nil +} + +func (s *Setup) ResolveArtifactName(_ artifact.ArtifactID) string { + return locale.Tl("camel_bundle_name", "bundle") +} + +func (s *Setup) DownloadsFromBuild(buildStatus *headchef_models.BuildStatusResponse) ([]artifact.ArtifactDownload, error) { + return artifact.NewDownloadsFromCamelBuild(buildStatus) +} diff --git a/pkg/platform/runtime/setup/ppmshim.go b/pkg/platform/runtime/setup/ppmshim.go new file mode 100644 index 0000000000..d4de90649b --- /dev/null +++ b/pkg/platform/runtime/setup/ppmshim.go @@ -0,0 +1,70 @@ +package setup + +import ( + "io/ioutil" + "os" + "path/filepath" + "runtime" + + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/internal/fileutils" + "github.com/ActiveState/cli/internal/strutils" + "github.com/gobuffalo/packr" +) + +// installPPMShim installs an executable shell script and a BAT file that is executed instead of PPM in the specified path. +// It calls the `state _ppm` sub-command printing deprecation messages. +func installPPMShim(binPath string) error { + // remove old ppm command if it existed before + ppmExeName := "ppm" + if runtime.GOOS == "windows" { + ppmExeName = "ppm.exe" + } + ppmExe := filepath.Join(binPath, ppmExeName) + if fileutils.FileExists(ppmExe) { + err := os.Remove(ppmExe) + if err != nil { + return errs.Wrap(err, "failed to remove existing ppm %s", ppmExe) + } + } + + box := packr.NewBox("../../../../assets/ppm") + ppmBytes := box.Bytes("ppm.sh") + shim := filepath.Join(binPath, "ppm") + // remove shim if it existed before, so we can overwrite (ok to drop error here) + _ = os.Remove(shim) + + exe, err := os.Executable() + if err != nil { + return errs.Wrap(err, "Could not get executable") + } + + tplParams := map[string]interface{}{"exe": exe} + ppmStr, err := strutils.ParseTemplate(string(ppmBytes), tplParams) + if err != nil { + return errs.Wrap(err, "Could not parse ppm.sh template") + } + + err = ioutil.WriteFile(shim, []byte(ppmStr), 0755) + if err != nil { + return errs.Wrap(err, "failed to write shim command %s", shim) + } + if runtime.GOOS == "windows" { + ppmBatBytes := box.Bytes("ppm.bat") + shim := filepath.Join(binPath, "ppm.bat") + // remove shim if it existed before, so we can overwrite (ok to drop error here) + _ = os.Remove(shim) + + ppmBatStr, err := strutils.ParseTemplate(string(ppmBatBytes), tplParams) + if err != nil { + return errs.Wrap(err, "Could not parse ppm.sh template") + } + + err = ioutil.WriteFile(shim, []byte(ppmBatStr), 0755) + if err != nil { + return errs.Wrap(err, "failed to write shim command %s", shim) + } + } + + return nil +} diff --git a/pkg/platform/runtime/setup/setup.go b/pkg/platform/runtime/setup/setup.go new file mode 100644 index 0000000000..faf4e6f175 --- /dev/null +++ b/pkg/platform/runtime/setup/setup.go @@ -0,0 +1,485 @@ +package setup + +import ( + "context" + "net/url" + "os" + "path/filepath" + "strings" + "sync" + + "github.com/gammazero/workerpool" + "github.com/go-openapi/strfmt" + + "github.com/ActiveState/cli/internal/analytics" + "github.com/ActiveState/cli/internal/constants" + "github.com/ActiveState/cli/internal/download" + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/internal/fileutils" + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/internal/logging" + "github.com/ActiveState/cli/internal/proxyreader" + "github.com/ActiveState/cli/internal/unarchiver" + "github.com/ActiveState/cli/pkg/platform/api/buildlogstream" + "github.com/ActiveState/cli/pkg/platform/api/headchef" + "github.com/ActiveState/cli/pkg/platform/api/headchef/headchef_models" + "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models" + apimodel "github.com/ActiveState/cli/pkg/platform/model" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/ActiveState/cli/pkg/platform/runtime/envdef" + "github.com/ActiveState/cli/pkg/platform/runtime/model" + "github.com/ActiveState/cli/pkg/platform/runtime/setup/buildlog" + "github.com/ActiveState/cli/pkg/platform/runtime/setup/events" + "github.com/ActiveState/cli/pkg/platform/runtime/setup/implementations/alternative" + "github.com/ActiveState/cli/pkg/platform/runtime/setup/implementations/camel" + "github.com/ActiveState/cli/pkg/platform/runtime/store" + "github.com/ActiveState/cli/pkg/project" + "github.com/faiface/mainthread" +) + +// MaxConcurrency is maximum number of parallel artifact installations +const MaxConcurrency = 10 + +// NotInstalledError is an error returned when the runtime is not completely installed yet. +var NotInstalledError = errs.New("Runtime is not completely installed.") + +// ArtifactSetupErrors combines all errors that can happen while installing artifacts in parallel +type ArtifactSetupErrors struct { + errs []error +} + +func (a *ArtifactSetupErrors) Error() string { + var errors []string + for _, err := range a.errs { + errors = append(errors, errs.Join(err, " :: ").Error()) + } + return "Not all artifacts could be installed, errors:\n" + strings.Join(errors, "\n") +} + +// Errors returns the individual error messages collected from all failing artifact installations +func (a *ArtifactSetupErrors) Errors() []error { + return a.errs +} + +// UserError returns a message including all user-facing sub-error messages +func (a *ArtifactSetupErrors) UserError() string { + var errStrings []string + for _, err := range a.errs { + errStrings = append(errStrings, locale.JoinErrors(err, " :: ").UserError()) + } + return locale.Tl("setup_artifacts_err", "Not all artifacts could be installed:\n{{.V0}}", strings.Join(errStrings, "\n")) +} + +// Events is the interface for callback functions that are called during +// runtime set-up when progress messages can be forwarded to the user +type Events interface { + buildlog.Events + + // ChangeSummary summarizes the changes to the current project during the InstallRuntime() call. + // This summary is printed as soon as possible, providing the State Tool user with an idea of the complexity of the requested build. + // The arguments are for the changes introduced in the latest commit that this Setup is setting up. + ChangeSummary(artifacts map[artifact.ArtifactID]artifact.ArtifactRecipe, requested artifact.ArtifactChangeset, changed artifact.ArtifactChangeset) + TotalArtifacts(total int) + ArtifactStepStarting(events.SetupStep, artifact.ArtifactID, string, int) + ArtifactStepProgress(events.SetupStep, artifact.ArtifactID, int) + ArtifactStepCompleted(events.SetupStep, artifact.ArtifactID) + ArtifactStepFailed(events.SetupStep, artifact.ArtifactID, string) +} + +type Targeter interface { + CommitUUID() strfmt.UUID + Name() string + Owner() string + Dir() string +} + +// Setup provides methods to setup a fully-function runtime that *only* requires interactions with the local file system. +type Setup struct { + model ModelProvider + target Targeter + events Events + store *store.Store +} + +// ModelProvider is the interface for all functions that involve backend communication +type ModelProvider interface { + ResolveRecipe(commitID strfmt.UUID, owner, projectName string) (*inventory_models.Recipe, error) + RequestBuild(recipeID, commitID strfmt.UUID, owner, project string) (headchef.BuildStatusEnum, *headchef_models.BuildStatusResponse, error) + FetchBuildResult(commitID strfmt.UUID, owner, project string) (*model.BuildResult, error) + SignS3URL(uri *url.URL) (*url.URL, error) +} + +type Setuper interface { + DeleteOutdatedArtifacts(artifact.ArtifactChangeset, store.StoredArtifactMap) error + ResolveArtifactName(artifact.ArtifactID) string + DownloadsFromBuild(buildStatus *headchef_models.BuildStatusResponse) ([]artifact.ArtifactDownload, error) +} + +// ArtifactSetuper is the interface for an implementation of artifact setup functions +// These need to be specialized for each BuildEngine type +type ArtifactSetuper interface { + EnvDef(tmpInstallDir string) (*envdef.EnvironmentDefinition, error) + Unarchiver() unarchiver.Unarchiver +} + +// New returns a new Setup instance that can install a Runtime locally on the machine. +func New(target Targeter, msgHandler Events) *Setup { + return NewWithModel(target, msgHandler, model.NewDefault()) +} + +// NewWithModel returns a new Setup instance with a customized model eg., for testing purposes +func NewWithModel(target Targeter, msgHandler Events, model ModelProvider) *Setup { + return &Setup{model, target, msgHandler, nil} +} + +// Update installs the runtime locally (or updates it if it's already partially installed) +func (s *Setup) Update() error { + err := s.update() + if err != nil { + analytics.EventWithLabel(analytics.CatRuntime, analytics.ActRuntimeFailure, analytics.LblRtFailUpdate) + return err + } + return nil +} + +func (s *Setup) update() error { + // Request build + buildResult, err := s.model.FetchBuildResult(s.target.CommitUUID(), s.target.Owner(), s.target.Name()) + if err != nil { + return errs.Wrap(err, "Failed to fetch build result") + } + + if buildResult.BuildStatus == headchef.Started { + analytics.Event(analytics.CatRuntime, analytics.ActRuntimeBuild) + ns := project.Namespaced{ + Owner: s.target.Owner(), + Project: s.target.Name(), + } + analytics.EventWithLabel(analytics.CatRuntime, analytics.ActBuildProject, ns.String()) + } + + // Compute and handle the change summary + artifacts := artifact.NewMapFromRecipe(buildResult.Recipe) + + s.store, err = store.New(s.target.Dir()) + if err != nil { + return errs.Wrap(err, "Could not create runtime store") + } + oldRecipe, err := s.store.Recipe() + if err != nil { + logging.Debug("Could not load existing recipe. Maybe it is a new installation: %v", err) + } + requestedArtifacts := artifact.NewArtifactChangesetByRecipe(oldRecipe, buildResult.Recipe, true) + changedArtifacts := artifact.NewArtifactChangesetByRecipe(oldRecipe, buildResult.Recipe, false) + s.events.ChangeSummary(artifacts, requestedArtifacts, changedArtifacts) + + setup, err := s.selectSetupImplementation(buildResult.BuildEngine, artifacts) + if err != nil { + return errs.Wrap(err, "Failed to select setup implementation") + } + + storedArtifacts, err := s.store.Artifacts() + if err != nil { + return locale.WrapError(err, "err_stored_artifacts", "Could not unmarshal stored artifacts, your install may be corrupted.") + } + + setup.DeleteOutdatedArtifacts(changedArtifacts, storedArtifacts) + + // if we get here, we dowload artifacts + analytics.Event(analytics.CatRuntime, analytics.ActRuntimeDownload) + + err = s.installArtifacts(buildResult, artifacts, setup) + if err != nil { + return err + } + + edGlobal, err := s.store.UpdateEnviron(buildResult.OrderedArtifacts()) + if err != nil { + return errs.Wrap(err, "Could not save combined environment file") + } + + // Install PPM Shim if any of the installed artifacts provide the Perl executable + if activePerlPath := edGlobal.FindBinPathFor(constants.ActivePerlExecutable); activePerlPath != "" { + err = installPPMShim(activePerlPath) + if err != nil { + return errs.Wrap(err, "Failed to install the PPM shim command at %s", activePerlPath) + } + } + + // clean up temp directory + tempDir := filepath.Join(s.store.InstallPath(), constants.LocalRuntimeTempDirectory) + err = os.RemoveAll(tempDir) + if err != nil { + logging.Errorf("Failed to remove temporary installation directory %s: %v", tempDir, err) + } + + if err := s.store.StoreRecipe(buildResult.Recipe); err != nil { + return errs.Wrap(err, "Could not save recipe file.") + } + + if err := s.store.MarkInstallationComplete(s.target.CommitUUID()); err != nil { + return errs.Wrap(err, "Could not mark install as complete.") + } + + return nil +} + +func aggregateErrors() (chan<- error, <-chan error) { + aggErr := make(chan error) + bgErrs := make(chan error) + go func() { + var errs []error + for err := range bgErrs { + errs = append(errs, err) + } + + if len(errs) > 0 { + aggErr <- &ArtifactSetupErrors{errs} + } else { + aggErr <- nil + } + }() + + return bgErrs, aggErr +} + +func (s *Setup) installArtifacts(buildResult *model.BuildResult, artifacts artifact.ArtifactRecipeMap, setup Setuper) error { + if !buildResult.BuildReady && buildResult.BuildEngine == model.Camel { + return locale.NewInputError("build_status_in_progress", "", apimodel.ProjectURL(s.target.Owner(), s.target.Name(), s.target.CommitUUID().String())) + } + // Artifacts are installed in two stages + // - The first stage runs concurrently in MaxConcurrency worker threads (download, unpacking, relocation) + // - The second stage moves all files into its final destination is running in a single thread (using the mainthread library) to avoid file conflicts + + var err error + if buildResult.BuildReady { + err = s.installFromBuildResult(buildResult, setup) + } else { + err = s.installFromBuildLog(buildResult, artifacts, setup) + } + + return err +} + +// setupArtifactSubmitFunction returns a function that sets up an artifact and can be submitted to a workerpool +func (s *Setup) setupArtifactSubmitFunction(a artifact.ArtifactDownload, buildResult *model.BuildResult, setup Setuper, errors chan<- error) func() { + return func() { + // This is the name used to describe the artifact. As camel bundles all artifacts in one tarball, we call it 'bundle' + name := setup.ResolveArtifactName(a.ArtifactID) + if err := s.setupArtifact(buildResult.BuildEngine, a.ArtifactID, a.UnsignedURI, name); err != nil { + if err != nil { + errors <- locale.WrapError(err, "artifact_setup_failed", "", name, a.ArtifactID.String()) + } + } + } +} + +func (s *Setup) installFromBuildResult(buildResult *model.BuildResult, setup Setuper) error { + downloads, err := setup.DownloadsFromBuild(buildResult.BuildStatusResponse) + if err != nil { + return errs.Wrap(err, "Could not fetch artifacts to download.") + } + s.events.TotalArtifacts(len(downloads)) + + errs, aggregatedErr := aggregateErrors() + mainthread.Run(func() { + defer close(errs) + wp := workerpool.New(MaxConcurrency) + for _, a := range downloads { + wp.Submit(s.setupArtifactSubmitFunction(a, buildResult, setup, errs)) + } + + wp.StopWait() + }) + + return <-aggregatedErr +} + +func (s *Setup) installFromBuildLog(buildResult *model.BuildResult, artifacts artifact.ArtifactRecipeMap, setup Setuper) error { + s.events.TotalArtifacts(len(artifacts)) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + conn, err := buildlogstream.Connect(ctx) + if err != nil { + return errs.Wrap(err, "Could not get build updates") + } + defer conn.Close() + + buildLog, err := buildlog.New(artifacts, conn, s.events, *buildResult.Recipe.RecipeID) + + errs, aggregatedErr := aggregateErrors() + + mainthread.Run(func() { + defer close(errs) + + var wg sync.WaitGroup + defer wg.Wait() + wg.Add(1) + go func() { + // wp.StopWait needs to be run in this go-routine after ALL tasks are scheduled, hence we need to add an extra wait group + defer wg.Done() + wp := workerpool.New(MaxConcurrency) + defer wp.StopWait() + + for a := range buildLog.BuiltArtifactsChannel() { + wp.Submit(s.setupArtifactSubmitFunction(a, buildResult, setup, errs)) + } + }() + + if err = buildLog.Wait(); err != nil { + errs <- err + } + }) + + return <-aggregatedErr +} + +// setupArtifact sets up an individual artifact +// The artifact is downloaded, unpacked and then processed by the artifact setup implementation +func (s *Setup) setupArtifact(buildEngine model.BuildEngine, a artifact.ArtifactID, unsignedURI, artifactName string) error { + as, err := s.selectArtifactSetupImplementation(buildEngine, a) + if err != nil { + return errs.Wrap(err, "Failed to select artifact setup implementation") + } + + targetDir := filepath.Join(s.store.InstallPath(), constants.LocalRuntimeTempDirectory) + if err := fileutils.MkdirUnlessExists(targetDir); err != nil { + return errs.Wrap(err, "Could not create temp runtime dir") + } + + unarchiver := as.Unarchiver() + archivePath := filepath.Join(targetDir, a.String()+unarchiver.Ext()) + downloadProgress := events.NewIncrementalProgress(s.events, events.Download, a, artifactName) + if err := s.downloadArtifact(unsignedURI, archivePath, downloadProgress); err != nil { + err := errs.Wrap(err, "Could not download artifact %s", unsignedURI) + s.events.ArtifactStepFailed(events.Download, a, err.Error()) + return err + } + s.events.ArtifactStepCompleted(events.Download, a) + + unpackedDir := filepath.Join(targetDir, a.String()) + logging.Debug("Unarchiving %s (%s) to %s", archivePath, unsignedURI, unpackedDir) + + // ensure that the unpack dir is empty + err = os.RemoveAll(unpackedDir) + if err != nil { + return errs.Wrap(err, "Could not remove previous temporary installation directory.") + } + + unpackProgress := events.NewIncrementalProgress(s.events, events.Unpack, a, artifactName) + numFiles, err := s.unpackArtifact(unarchiver, archivePath, unpackedDir, unpackProgress) + if err != nil { + err := errs.Wrap(err, "Could not unpack artifact %s", archivePath) + s.events.ArtifactStepFailed(events.Unpack, a, err.Error()) + return err + } + s.events.ArtifactStepCompleted(events.Unpack, a) + + envDef, err := as.EnvDef(unpackedDir) + if err != nil { + return errs.Wrap(err, "Could not collect env info for artifact") + } + + cnst := envdef.NewConstants(s.store.InstallPath()) + envDef = envDef.ExpandVariables(cnst) + err = envDef.ApplyFileTransforms(filepath.Join(unpackedDir, envDef.InstallDir), cnst) + if err != nil { + return locale.WrapError(err, "runtime_alternative_file_transforms_err", "", "Could not apply necessary file transformations after unpacking") + } + + // move files to installation path in main thread, such that file operations are synchronized + return mainthread.CallErr(func() error { return s.moveToInstallPath(a, artifactName, unpackedDir, envDef, numFiles) }) +} + +func (s *Setup) moveToInstallPath(a artifact.ArtifactID, artifactName string, unpackedDir string, envDef *envdef.EnvironmentDefinition, numFiles int) error { + // clean up the unpacked dir + defer os.RemoveAll(unpackedDir) + + var files []string + onMoveFile := func(fromPath, toPath string) { + if !fileutils.IsDir(toPath) { + s.events.ArtifactStepProgress(events.Install, a, 1) + files = append(files, toPath) + } + } + s.events.ArtifactStepStarting(events.Install, a, artifactName, numFiles) + err := fileutils.MoveAllFilesRecursively( + filepath.Join(unpackedDir, envDef.InstallDir), + s.store.InstallPath(), onMoveFile, + ) + if err != nil { + err := errs.Wrap(err, "Move artifact failed") + s.events.ArtifactStepFailed(events.Install, a, err.Error()) + return err + } + s.events.ArtifactStepCompleted(events.Install, a) + + if err := s.store.StoreArtifact(store.NewStoredArtifact(a, files, envDef)); err != nil { + return errs.Wrap(err, "Could not store artifact meta info") + } + + return nil +} + +// downloadArtifact retrieves the tarball for an artifactID +// Note: the tarball may also be retrieved from a local cache directory if that is available. +func (s *Setup) downloadArtifact(unsignedURI string, targetFile string, progress *events.IncrementalProgress) error { + artifactURL, err := url.Parse(unsignedURI) + if err != nil { + return errs.Wrap(err, "Could not parse artifact URL %s.", unsignedURI) + } + + downloadURL, err := s.model.SignS3URL(artifactURL) + if err != nil { + return errs.Wrap(err, "Could not sign artifact URL %s.", unsignedURI) + } + + b, err := download.GetWithProgress(downloadURL.String(), progress) + if err != nil { + return errs.Wrap(err, "Download %s failed", downloadURL) + } + if err := fileutils.WriteFile(targetFile, b); err != nil { + return errs.Wrap(err, "Writing download to target file %s failed", targetFile) + } + return nil +} + +func (s *Setup) unpackArtifact(ua unarchiver.Unarchiver, tarballPath string, targetDir string, progress *events.IncrementalProgress) (int, error) { + f, i, err := ua.PrepareUnpacking(tarballPath, targetDir) + progress.TotalSize(int(i)) + defer f.Close() + if err != nil { + return 0, errs.Wrap(err, "Prepare for unpacking failed") + } + var numUnpackedFiles int + ua.SetNotifier(func(_ string, _ int64, isDir bool) { + if !isDir { + numUnpackedFiles++ + } + }) + proxy := proxyreader.NewProxyReader(progress, f) + return numUnpackedFiles, ua.Unarchive(proxy, i, targetDir) +} + +func (s *Setup) selectSetupImplementation(buildEngine model.BuildEngine, artifacts artifact.ArtifactRecipeMap) (Setuper, error) { + switch buildEngine { + case model.Alternative: + return alternative.NewSetup(s.store, artifacts), nil + case model.Camel: + return camel.NewSetup(s.store), nil + default: + return nil, errs.New("Unknown build engine: %s", buildEngine) + } +} +func (s *Setup) selectArtifactSetupImplementation(buildEngine model.BuildEngine, a artifact.ArtifactID) (ArtifactSetuper, error) { + switch buildEngine { + case model.Alternative: + return alternative.NewArtifactSetup(a, s.store), nil + case model.Camel: + return camel.NewArtifactSetup(a, s.store), nil + default: + return nil, errs.New("Unknown build engine: %s", buildEngine) + } +} diff --git a/pkg/platform/runtime/store/store.go b/pkg/platform/runtime/store/store.go new file mode 100644 index 0000000000..f2cac73fc0 --- /dev/null +++ b/pkg/platform/runtime/store/store.go @@ -0,0 +1,262 @@ +package store + +import ( + "encoding/json" + "io/ioutil" + "os" + "path/filepath" + "strings" + + "github.com/go-openapi/strfmt" + + "github.com/ActiveState/cli/internal/constants" + "github.com/ActiveState/cli/internal/errs" + "github.com/ActiveState/cli/internal/fileutils" + "github.com/ActiveState/cli/internal/locale" + "github.com/ActiveState/cli/internal/logging" + "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models" + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/ActiveState/cli/pkg/platform/runtime/envdef" + "github.com/ActiveState/cli/pkg/platform/runtime/model" +) + +// Store manages the storing and loading of persistable information about the runtime +type Store struct { + installPath string + storagePath string +} + +type StoredArtifact struct { + ArtifactID artifact.ArtifactID `json:"artifactID"` + Files []string `json:"files"` + EnvDef *envdef.EnvironmentDefinition `json:"envdef"` +} + +func NewStoredArtifact(artifactID artifact.ArtifactID, files []string, envDef *envdef.EnvironmentDefinition) StoredArtifact { + return StoredArtifact{ + ArtifactID: artifactID, + Files: files, + EnvDef: envDef, + } +} + +type StoredArtifactMap = map[artifact.ArtifactID]StoredArtifact + +func New(installPath string) (*Store, error) { + return &Store{ + installPath, + filepath.Join(installPath, constants.LocalRuntimeEnvironmentDirectory), + }, nil +} + +func (s *Store) markerFile() string { + return filepath.Join(s.storagePath, constants.RuntimeInstallationCompleteMarker) +} + +func (s *Store) buildEngineFile() string { + return filepath.Join(s.storagePath, constants.RuntimeBuildEngineStore) +} + +func (s *Store) recipeFile() string { + return filepath.Join(s.storagePath, constants.RuntimeRecipeStore) +} + +// MatchesCommit checks if stored runtime is complete and can be loaded +func (s *Store) MatchesCommit(commitID strfmt.UUID) bool { + marker := s.markerFile() + if !fileutils.FileExists(marker) { + logging.Debug("Marker does not exist: %s", marker) + return false + } + + contents, err := fileutils.ReadFile(marker) + if err != nil { + logging.Error("Could not read marker: %v", err) + return false + } + + logging.Debug("MatchesCommit for %s, %s==%s", marker, string(contents), commitID.String()) + return strings.TrimSpace(string(contents)) == commitID.String() +} + +// MarkInstallationComplete writes the installation complete marker to the runtime directory +func (s *Store) MarkInstallationComplete(commitID strfmt.UUID) error { + markerFile := s.markerFile() + markerDir := filepath.Dir(markerFile) + err := fileutils.MkdirUnlessExists(markerDir) + if err != nil { + return errs.Wrap(err, "could not create completion marker directory") + } + err = fileutils.WriteFile(markerFile, []byte(commitID.String())) + if err != nil { + return errs.Wrap(err, "could not set completion marker") + } + return nil +} + +// BuildEngine returns the runtime build engine value stored in the runtime directory +func (s *Store) BuildEngine() (model.BuildEngine, error) { + storeFile := s.buildEngineFile() + + data, err := fileutils.ReadFile(storeFile) + if err != nil { + return model.UnknownEngine, errs.Wrap(err, "Could not read build engine cache store.") + } + + return model.ParseBuildEngine(string(data)), nil +} + +// StoreBuildEngine stores the build engine value in the runtime directory +func (s *Store) StoreBuildEngine(buildEngine model.BuildEngine) error { + storeFile := s.buildEngineFile() + storeDir := filepath.Dir(storeFile) + logging.Debug("Storing build engine %s at %s", buildEngine.String(), storeFile) + err := fileutils.MkdirUnlessExists(storeDir) + if err != nil { + return errs.Wrap(err, "Could not create completion marker directory.") + } + err = fileutils.WriteFile(storeFile, []byte(buildEngine.String())) + if err != nil { + return errs.Wrap(err, "Could not store build engine string.") + } + return nil +} + +// Recipe returns the recipe the stored runtime has been built with +func (s *Store) Recipe() (*inventory_models.Recipe, error) { + data, err := fileutils.ReadFile(s.recipeFile()) + if err != nil { + return nil, errs.Wrap(err, "Could not read recipe file.") + } + + var recipe inventory_models.Recipe + err = json.Unmarshal(data, &recipe) + if err != nil { + return nil, errs.Wrap(err, "Could not parse recipe file.") + } + return &recipe, err +} + +// StoreRecipe stores a along side the stored runtime +func (s *Store) StoreRecipe(recipe *inventory_models.Recipe) error { + data, err := json.Marshal(recipe) + if err != nil { + return errs.Wrap(err, "Could not marshal recipe.") + } + err = fileutils.WriteFile(s.recipeFile(), data) + if err != nil { + return errs.Wrap(err, "Could not write recipe file.") + } + return nil +} + +// Artifacts loads artifact information collected during the installation. +// It includes the environment definition configuration and files installed for this artifact. +func (s *Store) Artifacts() (StoredArtifactMap, error) { + stored := make(StoredArtifactMap) + jsonDir := filepath.Join(s.storagePath, constants.ArtifactMetaDir) + if !fileutils.DirExists(jsonDir) { + return stored, nil + } + + files, err := ioutil.ReadDir(jsonDir) + if err != nil { + return stored, errs.Wrap(err, "Readdir %s failed", jsonDir) + } + + for _, file := range files { + if file.IsDir() || !strings.HasSuffix(file.Name(), ".json") { + continue + } + + var artifactStore StoredArtifact + jsonBlob, err := fileutils.ReadFile(filepath.Join(jsonDir, file.Name())) + if err != nil { + return stored, errs.Wrap(err, "Could not read artifact meta file") + } + if err := json.Unmarshal(jsonBlob, &artifactStore); err != nil { + return stored, errs.Wrap(err, "Could not unmarshal artifact meta file") + } + + stored[artifactStore.ArtifactID] = artifactStore + } + + return stored, nil +} + +// DeleteArtifactStore deletes the stored information for a specific artifact from the store +func (s *Store) DeleteArtifactStore(id artifact.ArtifactID) error { + jsonFile := filepath.Join(s.storagePath, constants.ArtifactMetaDir, id.String()+".json") + if !fileutils.FileExists(jsonFile) { + return nil + } + return os.Remove(jsonFile) +} + +func (s *Store) StoreArtifact(artf StoredArtifact) error { + // Save artifact cache information + jsonBlob, err := json.Marshal(artf) + if err != nil { + return errs.Wrap(err, "Failed to marshal artifact cache information") + } + jsonFile := filepath.Join(s.storagePath, constants.ArtifactMetaDir, artf.ArtifactID.String()+".json") + if err := fileutils.WriteFile(jsonFile, jsonBlob); err != nil { + return errs.Wrap(err, "Failed to write artifact cache information") + } + return nil +} + +func (s *Store) Environ(inherit bool) (map[string]string, error) { + mergedRuntimeDefinitionFile := filepath.Join(s.storagePath, constants.RuntimeDefinitionFilename) + envDef, err := envdef.NewEnvironmentDefinition(mergedRuntimeDefinitionFile) + if err != nil { + return nil, locale.WrapError( + err, "err_no_environment_definition", + "Your installation seems corrupted.\nPlease try to re-run this command, as it may fix the problem. If the problem persists, please report it in our forum: {{.V0}}", + constants.ForumsURL, + ) + } + return envDef.GetEnv(inherit), nil +} + +func (s *Store) UpdateEnviron(orderedArtifacts []artifact.ArtifactID) (*envdef.EnvironmentDefinition, error) { + artifacts, err := s.Artifacts() + if err != nil { + return nil, errs.Wrap(err, "Could not retrieve stored artifacts") + } + + rtGlobal, err := s.updateEnviron(orderedArtifacts, artifacts) + if err != nil { + return nil, err + } + + return rtGlobal, rtGlobal.WriteFile(filepath.Join(s.storagePath, constants.RuntimeDefinitionFilename)) +} + +func (s *Store) updateEnviron(orderedArtifacts []artifact.ArtifactID, artifacts StoredArtifactMap) (*envdef.EnvironmentDefinition, error) { + var rtGlobal *envdef.EnvironmentDefinition + // use artifact order as returned by the build status response form the HC for merging artifacts + for _, artID := range orderedArtifacts { + a, ok := artifacts[artID] + if !ok { + continue + } + + if rtGlobal == nil { + rtGlobal = a.EnvDef + continue + } + var err error + rtGlobal, err = rtGlobal.Merge(a.EnvDef) + if err != nil { + return nil, errs.Wrap(err, "Could not merge envdef") + } + } + + return rtGlobal, nil +} + +// InstallPath returns the installation path of the runtime +func (s *Store) InstallPath() string { + return s.installPath +} diff --git a/pkg/platform/runtime/store/store_test.go b/pkg/platform/runtime/store/store_test.go new file mode 100644 index 0000000000..70c806117f --- /dev/null +++ b/pkg/platform/runtime/store/store_test.go @@ -0,0 +1,34 @@ +package store + +import ( + "fmt" + "testing" + + "github.com/ActiveState/cli/pkg/platform/runtime/artifact" + "github.com/ActiveState/cli/pkg/platform/runtime/envdef" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestUpdateEnviron(t *testing.T) { + artifactIDs := []artifact.ArtifactID{"1", "2", "3", "4"} + artifacts := StoredArtifactMap{} + for i, artID := range artifactIDs[0:3] { + artifacts[artID] = StoredArtifact{EnvDef: &envdef.EnvironmentDefinition{Env: []envdef.EnvironmentVariable{ + { + Name: "vars", + Join: envdef.Append, + Separator: ":", + Values: []string{fmt.Sprintf("%d", i+1)}, + }, + }}} + } + s, err := New("/installPath") + require.NoError(t, err) + + rt, err := s.updateEnviron(artifactIDs, artifacts) + env := rt.GetEnv(false) + assert.Equal(t, map[string]string{ + "vars": "1:2:3", + }, env) +} diff --git a/pkg/platform/runtime/target.go b/pkg/platform/runtime/target.go new file mode 100644 index 0000000000..e25747bae7 --- /dev/null +++ b/pkg/platform/runtime/target.go @@ -0,0 +1,78 @@ +package runtime + +import ( + "path/filepath" + + "github.com/go-openapi/strfmt" + + "github.com/ActiveState/cli/internal/fileutils" + "github.com/ActiveState/cli/internal/hash" + "github.com/ActiveState/cli/internal/logging" + "github.com/ActiveState/cli/pkg/project" +) + +type ProjectTarget struct { + *project.Project + cacheDir string + customCommit *strfmt.UUID +} + +func NewProjectTarget(pj *project.Project, runtimeCacheDir string, customCommit *strfmt.UUID) *ProjectTarget { + return &ProjectTarget{pj, runtimeCacheDir, customCommit} +} + +func (p *ProjectTarget) Dir() string { + return ProjectDirToTargetDir(p.Project.Source().Path(), p.cacheDir) +} + +func (p *ProjectTarget) CommitUUID() strfmt.UUID { + if p.customCommit != nil { + return *p.customCommit + } + return p.Project.CommitUUID() +} + +type CustomTarget struct { + owner string + name string + commitUUID strfmt.UUID + dir string +} + +func NewCustomTarget(owner string, name string, commitUUID strfmt.UUID, dir string) *CustomTarget { + cleanDir, err := fileutils.ResolveUniquePath(dir) + if err != nil { + logging.Error("Could not resolve unique path for dir: %s, error: %s", dir, err.Error()) + } else { + dir = cleanDir + } + return &CustomTarget{owner, name, commitUUID, dir} +} + +func (c *CustomTarget) Owner() string { + return c.owner +} + +func (c *CustomTarget) Name() string { + return c.name +} + +func (c *CustomTarget) CommitUUID() strfmt.UUID { + return c.commitUUID +} + +func (c *CustomTarget) Dir() string { + return c.dir +} + +func ProjectDirToTargetDir(projectDir, cacheDir string) string { + projectDirDirty := filepath.Dir(projectDir) + projectDir, err := fileutils.ResolveUniquePath(projectDirDirty) + if err != nil { + logging.Error("Could not resolve unique path for projectDir: %s, error: %s", projectDir, err.Error()) + projectDir = projectDirDirty + } + logging.Debug("In newStore: resolved project dir is: %s", projectDir) + + return filepath.Join(cacheDir, hash.ShortHash(projectDir)) +} diff --git a/pkg/platform/runtime/testdata/badarchive.tar.gz b/pkg/platform/runtime/testdata/badarchive.tar.gz deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/pkg/platform/runtime/testdata/empty.archive b/pkg/platform/runtime/testdata/empty.archive deleted file mode 100644 index 98adc41284..0000000000 Binary files a/pkg/platform/runtime/testdata/empty.archive and /dev/null differ diff --git a/pkg/platform/runtime/testdata/empty.tar.gz b/pkg/platform/runtime/testdata/empty.tar.gz deleted file mode 100644 index 98adc41284..0000000000 Binary files a/pkg/platform/runtime/testdata/empty.tar.gz and /dev/null differ diff --git a/pkg/platform/runtime/testdata/perl-good-installer-nometa.tar.gz b/pkg/platform/runtime/testdata/perl-good-installer-nometa.tar.gz deleted file mode 100644 index 43ccd58617..0000000000 Binary files a/pkg/platform/runtime/testdata/perl-good-installer-nometa.tar.gz and /dev/null differ diff --git a/pkg/platform/runtime/testdata/perl-good-installer-nometa.zip b/pkg/platform/runtime/testdata/perl-good-installer-nometa.zip deleted file mode 100644 index a6ce06ac66..0000000000 Binary files a/pkg/platform/runtime/testdata/perl-good-installer-nometa.zip and /dev/null differ diff --git a/pkg/platform/runtime/testdata/perl-good-installer.tar.gz b/pkg/platform/runtime/testdata/perl-good-installer.tar.gz deleted file mode 100644 index 28ecb1ba5e..0000000000 Binary files a/pkg/platform/runtime/testdata/perl-good-installer.tar.gz and /dev/null differ diff --git a/pkg/platform/runtime/testdata/perl-good-installer.zip b/pkg/platform/runtime/testdata/perl-good-installer.zip deleted file mode 100644 index 69e227703c..0000000000 Binary files a/pkg/platform/runtime/testdata/perl-good-installer.zip and /dev/null differ diff --git a/pkg/platform/runtime/testdata/python-fail-prefixes.tar.gz b/pkg/platform/runtime/testdata/python-fail-prefixes.tar.gz deleted file mode 100644 index d974d79bdd..0000000000 Binary files a/pkg/platform/runtime/testdata/python-fail-prefixes.tar.gz and /dev/null differ diff --git a/pkg/platform/runtime/testdata/python-good-installer-nometa.tar.gz b/pkg/platform/runtime/testdata/python-good-installer-nometa.tar.gz deleted file mode 100644 index 4ac24b1550..0000000000 Binary files a/pkg/platform/runtime/testdata/python-good-installer-nometa.tar.gz and /dev/null differ diff --git a/pkg/platform/runtime/testdata/python-good-installer-nometa.zip b/pkg/platform/runtime/testdata/python-good-installer-nometa.zip deleted file mode 100644 index 89793968f5..0000000000 Binary files a/pkg/platform/runtime/testdata/python-good-installer-nometa.zip and /dev/null differ diff --git a/pkg/platform/runtime/testdata/python-good-installer.tar.gz b/pkg/platform/runtime/testdata/python-good-installer.tar.gz deleted file mode 100644 index 67acd906d9..0000000000 Binary files a/pkg/platform/runtime/testdata/python-good-installer.tar.gz and /dev/null differ diff --git a/pkg/platform/runtime/testdata/python-good-installer.zip b/pkg/platform/runtime/testdata/python-good-installer.zip deleted file mode 100644 index bcca75cb68..0000000000 Binary files a/pkg/platform/runtime/testdata/python-good-installer.zip and /dev/null differ diff --git a/pkg/platform/runtime/testdata/python-missing-python-binary.tar.gz b/pkg/platform/runtime/testdata/python-missing-python-binary.tar.gz deleted file mode 100644 index efc5d61ce8..0000000000 Binary files a/pkg/platform/runtime/testdata/python-missing-python-binary.tar.gz and /dev/null differ diff --git a/pkg/platform/runtime/testdata/python-noexec-python.tar.gz b/pkg/platform/runtime/testdata/python-noexec-python.tar.gz deleted file mode 100644 index 70b994f6b9..0000000000 Binary files a/pkg/platform/runtime/testdata/python-noexec-python.tar.gz and /dev/null differ diff --git a/pkg/platform/runtime/testdata/relocate/bin/python3 b/pkg/platform/runtime/testdata/relocate/bin/python3 deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/pkg/platform/runtime/testdata/relocate/binary b/pkg/platform/runtime/testdata/relocate/binary deleted file mode 100755 index 697c7cd25c..0000000000 Binary files a/pkg/platform/runtime/testdata/relocate/binary and /dev/null differ diff --git a/pkg/platform/runtime/testdata/relocate/text.go b/pkg/platform/runtime/testdata/relocate/text.go deleted file mode 100644 index 8c91dcfa50..0000000000 --- a/pkg/platform/runtime/testdata/relocate/text.go +++ /dev/null @@ -1,9 +0,0 @@ -package main - -import ( - "fmt" -) - -func main() { - fmt.Println("-- ######################################## RELOCATE ME ######################################## --") -} diff --git a/pkg/platform/runtime/testhelper/cmd/main.go b/pkg/platform/runtime/testhelper/cmd/main.go new file mode 100644 index 0000000000..b340fddbf9 --- /dev/null +++ b/pkg/platform/runtime/testhelper/cmd/main.go @@ -0,0 +1,95 @@ +package main + +import ( + "errors" + "fmt" + "os" + + "github.com/ActiveState/cli/pkg/platform/api/headchef" + "github.com/ActiveState/cli/pkg/platform/runtime/model" + "github.com/ActiveState/cli/pkg/platform/runtime/testhelper" + "github.com/go-openapi/strfmt" +) + +// This script downloads some test data from real server commits + +func main() { + err := run() + if err != nil { + fmt.Printf("Error: %v", err) + os.Exit(1) + } +} + +// Perl5_28CamelProject is the project name in the ActiveState-CLI organization +const Perl5_28CamelProject = "Perl" + +// Perl5_28CamelCommit is a test commit for a camel Perl build +const Perl5_28CamelCommit = strfmt.UUID("bdd07a41-1e71-4042-b666-33c17164c9d9") + +// Perl5_32AlternativeProject is a project name in the ActiveState-CLI organization for an alternative build +const Perl5_32AlternativeProject = "Perl-5.32.1-Alternative" + +// Perl5_32AlternativeBaseCommit only comprises the bare Perl language +const Perl5_32AlternativeBaseCommit = strfmt.UUID("a5075f1a-053f-4cb7-b1fd-e8c09b8371f3") + +// Perl5_32AlternativeOnePackageCommit comprises the Perl language and JSON as a specified version +const Perl5_32AlternativeOnePackageCommit = strfmt.UUID("ab02c350-c4ff-4415-a7ad-3de3bbb1c67a") + +// Perl5_32AlternativeOnePackageUpdatedCommit comprises the Perl language and JSON at an updated version +const Perl5_32AlternativeOnePackageUpdatedCommit = strfmt.UUID("e2b4f7f1-c878-4e57-8d1a-7bf6cc8c1abc") + +// Perl5_32AlternativeOnePackageRemovedCommit only the Perl language after removing the JSON package +const Perl5_32AlternativeOnePackageRemovedCommit = strfmt.UUID("bd940c5e-756b-4929-9517-2ae90e9499e4") + +// Perl5_32AlternativeOneBundleCommit comprises the Perl language and one bundle 'Testing' +const Perl5_32AlternativeOneBundleCommit = strfmt.UUID("d0118507-f60e-4602-9355-7196c1aed3ca") + +// Perl5_32AlternativeFailedCommit has a package that makes the build fail +const Perl5_32AlternativeFailedCommit = strfmt.UUID("adeabd0f-cf90-4b65-8f0b-924ae15c9338") + +func saveResponses(baseName string, commitID strfmt.UUID, projectName string, expectedBuildResult headchef.BuildStatusEnum) error { + fmt.Printf("Downloading build for %s\n", baseName) + d := model.NewDefault() + + r, err := d.ResolveRecipe(commitID, "ActiveState-CLI", projectName) + if err != nil { + return fmt.Errorf("Failed to get recipe '%s': %w", baseName, err) + } + testhelper.SaveRecipe(baseName, r) + + be, b, err := d.RequestBuild(*r.RecipeID, commitID, "ActiveState-CLI", projectName) + if err != nil && !(expectedBuildResult == headchef.Failed && errors.Is(err, headchef.ErrBuildFailedResp)) { + return fmt.Errorf("Failed to get build '%s': %w", baseName, err) + } + if be != expectedBuildResult { + return fmt.Errorf("Expected build to be %v", expectedBuildResult) + } + testhelper.SaveBuildResponse(baseName, b) + return nil +} + +func run() error { + if err := saveResponses("perl", Perl5_28CamelCommit, Perl5_28CamelProject, headchef.Completed); err != nil { + return err + } + if err := saveResponses("perl-alternative-base", Perl5_32AlternativeBaseCommit, Perl5_32AlternativeProject, headchef.Completed); err != nil { + return err + } + if err := saveResponses("perl-alternative-one-package", Perl5_32AlternativeOnePackageCommit, Perl5_32AlternativeProject, headchef.Completed); err != nil { + return err + } + if err := saveResponses("perl-alternative-one-update", Perl5_32AlternativeOnePackageUpdatedCommit, Perl5_32AlternativeProject, headchef.Completed); err != nil { + return err + } + if err := saveResponses("perl-alternative-one-removed", Perl5_32AlternativeOnePackageRemovedCommit, Perl5_32AlternativeProject, headchef.Completed); err != nil { + return err + } + if err := saveResponses("perl-alternative-one-bundle", Perl5_32AlternativeOneBundleCommit, Perl5_32AlternativeProject, headchef.Completed); err != nil { + return err + } + if err := saveResponses("perl-alternative-failure", Perl5_32AlternativeFailedCommit, Perl5_32AlternativeProject, headchef.Failed); err != nil { + return err + } + return nil +} diff --git a/pkg/platform/runtime/testhelper/data/builds/alternative-completed.json b/pkg/platform/runtime/testhelper/data/builds/alternative-completed.json new file mode 100644 index 0000000000..95e2553c92 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/builds/alternative-completed.json @@ -0,0 +1,31 @@ +{ + "artifacts": [ + { + "artifact_id": "71e4a1fe-eba7-5ee1-a95f-94fd70aa2d87", + "build_state": "succeeded", + "build_timestamp": "2021-02-03T22:21:39.496Z", + "dependency_ids": null, + "ingredient_version_id": "a845e482-d3ec-5379-aba3-96e74794570f", + "log_uri": "s3://as-builds/production/language/perl/5.32.0/7/71e4a1fe-eba7-5ee1-a95f-94fd70aa2d87/logs.jsonl", + "platform_id": "0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a", + "uri": "s3://as-builds/production/language/perl/5.32.0/7/71e4a1fe-eba7-5ee1-a95f-94fd70aa2d87/artifact.tar.gz" + }, + { + "artifact_id": "ad807d9a-8214-5395-92c4-77b6301248f2", + "build_state": "succeeded", + "build_timestamp": "2021-02-06T00:17:40.179Z", + "dependency_ids": null, + "log_uri": "s3://as-builds/noop/logs.jsonl", + "platform_id": "0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a", + "uri": "s3://as-builds/noop/artifact.tar.gz" + } + ], + "build_engine": "alternative", + "build_request_id": "af46a10c-e788-459e-9e17-4e4add8973c0", + "errors": [], + "is_retryable": false, + "message": "Recipe build completed successfully", + "recipe_id": "ad807d9a-8214-5395-92c4-77b6301248f2", + "timestamp": "2021-02-18T18:03:18.756Z", + "type": "build_completed" +} diff --git a/pkg/platform/runtime/testhelper/data/builds/camel-building.json b/pkg/platform/runtime/testhelper/data/builds/camel-building.json new file mode 100644 index 0000000000..7ca0f04394 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/builds/camel-building.json @@ -0,0 +1,11 @@ +{ + "artifacts": [], + "build_engine": "camel", + "build_request_id": "ccf8173c-9810-4ae3-afd6-02f7597258ae", + "errors": [], + "is_retryable": false, + "message": "Camel build sent to scheduler with camel commit 3d46a065", + "recipe_id": "50dd4b2f-a42e-537e-911c-3122b89f8c36", + "timestamp": "2021-02-18T17:58:38.465Z", + "type": "build_started" +} diff --git a/pkg/platform/runtime/testhelper/data/builds/camel-done.json b/pkg/platform/runtime/testhelper/data/builds/camel-done.json new file mode 100644 index 0000000000..ed777e11fc --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/builds/camel-done.json @@ -0,0 +1 @@ +{"artifacts":null,"build_engine":"camel","build_request_id":"ccf8173c-9810-4ae3-afd6-02f7597258ae","errors":null,"is_retryable":false,"message":"Sent build to scheduler","recipe_id":"50dd4b2f-a42e-537e-911c-3122b89f8c36","timestamp":"2021-02-18T17:58:38.468Z","type":"build_started"} diff --git a/pkg/platform/runtime/testhelper/data/builds/perl-alternative-base.json b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-base.json new file mode 100644 index 0000000000..72b46c57a0 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-base.json @@ -0,0 +1 @@ +{"artifacts":[{"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_state":"succeeded","build_timestamp":"2021-02-04T18:04:26.190Z","dependency_ids":null,"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/5.32.1/3/b30ab2e5-4074-572c-8146-da692b1c9e45/artifact.tar.gz"},{"artifact_id":"aa21f7c8-85a7-5cc2-8ee8-f8bd3b342406","build_state":"succeeded","build_timestamp":"2021-02-06T00:17:40.179Z","dependency_ids":null,"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/noop/artifact.tar.gz"}],"build_engine":"alternative","build_request_id":"fd118bfd-7534-49fc-be42-4e63ea2e69d1","errors":[],"is_retryable":false,"message":"Recipe build completed successfully","recipe_id":"aa21f7c8-85a7-5cc2-8ee8-f8bd3b342406","timestamp":"2021-02-20T08:28:49.813Z","type":"build_completed"} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/builds/perl-alternative-failure.json b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-failure.json new file mode 100644 index 0000000000..740aa36a5f --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-failure.json @@ -0,0 +1 @@ +{"artifacts":[{"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_state":"succeeded","build_timestamp":"2021-02-04T18:04:26.190Z","dependency_ids":null,"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/5.32.1/3/b30ab2e5-4074-572c-8146-da692b1c9e45/artifact.tar.gz"},{"artifact_id":"48951744-f839-5031-8cf4-6e82a4be2089","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:38.937Z","dependency_ids":null,"ingredient_version_id":"e8527602-630b-57ab-b21f-a185719a6c91","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Data-UUID/1.226/6/48951744-f839-5031-8cf4-6e82a4be2089/artifact.tar.gz"},{"artifact_id":"0029ae25-8497-5130-8268-1f0fe26ccc77","build_state":"succeeded","build_timestamp":"2021-02-05T18:02:09.243Z","dependency_ids":null,"ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Importer/0.025/2/0029ae25-8497-5130-8268-1f0fe26ccc77/artifact.tar.gz"},{"artifact_id":"6591f01d-939d-5080-bb1a-7816ff4d020b","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:35.524Z","dependency_ids":null,"ingredient_version_id":"6c89ed56-ef22-541a-bf87-9ff4e10ee371","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Long-Jump/0.000001/3/6591f01d-939d-5080-bb1a-7816ff4d020b/artifact.tar.gz"},{"artifact_id":"7c541a6a-4dfd-5135-8b98-2b44b5d1a816","build_state":"succeeded","build_timestamp":"2021-02-05T18:04:43.305Z","dependency_ids":null,"ingredient_version_id":"0f028feb-10aa-531d-9660-b56c19fb7b43","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Module-Pluggable/5.2/7/7c541a6a-4dfd-5135-8b98-2b44b5d1a816/artifact.tar.gz"},{"artifact_id":"7f8a7197-b277-5621-a6f3-7f2ef32d871b","build_state":"succeeded","build_timestamp":"2021-02-05T18:02:10.497Z","dependency_ids":null,"ingredient_version_id":"1ff5b410-a933-53c7-b3a1-f11524b53213","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Scope-Guard/0.21/5/7f8a7197-b277-5621-a6f3-7f2ef32d871b/artifact.tar.gz"},{"artifact_id":"29983a5b-49c4-5cf4-a2c5-2490647d6910","build_state":"succeeded","build_timestamp":"2021-02-19T21:16:18.962Z","dependency_ids":null,"ingredient_version_id":"9e33e514-0b22-504b-8409-6d0bdbf86108","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Sub-Info/0.002/4/29983a5b-49c4-5cf4-a2c5-2490647d6910/artifact.tar.gz"},{"artifact_id":"4d95557d-2200-5a56-a809-4ea3d3502b20","build_state":"succeeded","build_timestamp":"2021-02-19T21:16:19.477Z","dependency_ids":null,"ingredient_version_id":"7e483f34-00ad-523a-91be-e9ddf74366a5","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Term-Table/0.015/3/4d95557d-2200-5a56-a809-4ea3d3502b20/artifact.tar.gz"},{"artifact_id":"288aa0db-c0e4-55e7-8f67-fc2da409be70","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:45.569Z","dependency_ids":null,"ingredient_version_id":"9c514f0f-5abb-546a-840a-1c97f2010c78","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Test2-Harness/1.000042/2/288aa0db-c0e4-55e7-8f67-fc2da409be70/artifact.tar.gz"},{"artifact_id":"282e3768-e12a-51ed-831f-7cbc212ba8bd","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:34.879Z","dependency_ids":null,"ingredient_version_id":"d85188d8-231d-589f-9bdd-fc5667cc2d2f","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Test2-Plugin-MemUsage/0.002003/3/282e3768-e12a-51ed-831f-7cbc212ba8bd/artifact.tar.gz"},{"artifact_id":"5ad88c8a-bc8f-50a0-9f61-74856cd28017","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:32.081Z","dependency_ids":null,"ingredient_version_id":"b8f76881-09d4-53fd-8cc6-e595b6d69132","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Test2-Plugin-NoWarnings/0.06/3/5ad88c8a-bc8f-50a0-9f61-74856cd28017/artifact.tar.gz"},{"artifact_id":"c3e652a7-676e-594f-b87f-93d19122f3f4","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:32.425Z","dependency_ids":null,"ingredient_version_id":"4bd9f2db-1c09-5a14-82a3-7cb6d966d18c","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Test2-Plugin-UUID/0.002001/3/c3e652a7-676e-594f-b87f-93d19122f3f4/artifact.tar.gz"},{"artifact_id":"30dc7965-0a69-5686-831a-e563fa73a98c","build_state":"succeeded","build_timestamp":"2021-02-19T21:16:40.002Z","dependency_ids":null,"ingredient_version_id":"fa7a0c73-1e93-5e08-8f6b-a009e82d7179","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Test2-Suite/0.000127/2/30dc7965-0a69-5686-831a-e563fa73a98c/artifact.tar.gz"},{"artifact_id":"c1e8c6c4-ea11-55a4-b415-97da2d32121e","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:32.005Z","dependency_ids":null,"ingredient_version_id":"ee3bc68e-abb3-58ff-aa9c-60b7412df7e2","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/goto-file/0.005/3/c1e8c6c4-ea11-55a4-b415-97da2d32121e/artifact.tar.gz"},{"artifact_id":"c894fa23-0416-556d-9ca5-fdf9375595bc","build_state":"succeeded","build_timestamp":"2021-02-20T07:48:54.696Z","dependency_ids":null,"ingredient_version_id":"21141224-b8b8-565c-8fdf-4ded24fcbd8d","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/noop/artifact.tar.gz"},{"artifact_id":"3ac7b175-6fc9-569c-bb15-785fe14298a2","build_state":"failed","build_timestamp":"2021-02-20T07:50:24.594Z","dependency_ids":null,"error":"Builder returned with exit code 255","ingredient_version_id":"e0f207c2-9922-51e3-95cf-e586da39436e","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2"},{"artifact_id":"d806994e-1154-5b81-9104-b8d4d4dd72a4","build_state":"failed","build_timestamp":"2021-02-20T07:50:44.314Z","dependency_ids":null,"error":"Builder returned with exit code 255","ingredient_version_id":"bac128cd-1439-5857-b5b5-5633763f78d5","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2"},{"artifact_id":"08f7470e-bd8b-5ef1-a94d-a04960d355eb","build_state":"failed","build_timestamp":"2021-02-20T07:50:38.365Z","dependency_ids":null,"error":"Builder returned with exit code 255","ingredient_version_id":"e41f38b7-11e6-52e8-9f12-eba3533f3055","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2"},{"artifact_id":"ea103bb8-1e74-58ff-8f35-3bc14994d268","build_state":"skipped","build_timestamp":"2021-02-20T07:50:27.548Z","dependency_ids":null,"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2"}],"build_engine":"alternative","build_request_id":"73105a9f-8479-45e8-96bf-b82be42237b4","errors":["language/perl Win32-Console-ANSI 1.11: Builder returned with exit code 255","language/perl Win32-Pipe 0.025: Builder returned with exit code 255","language/perl Win32-Process 0.16: Builder returned with exit code 255"],"is_retryable":false,"message":"Recipe build failed: 3 build steps failed","recipe_id":"ea103bb8-1e74-58ff-8f35-3bc14994d268","timestamp":"2021-02-20T08:28:59.242Z","type":"build_failed"} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-bundle.json b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-bundle.json new file mode 100644 index 0000000000..5b2aae0349 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-bundle.json @@ -0,0 +1 @@ +{"artifacts":[{"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_state":"succeeded","build_timestamp":"2021-02-04T18:04:26.190Z","dependency_ids":null,"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/5.32.1/3/b30ab2e5-4074-572c-8146-da692b1c9e45/artifact.tar.gz"},{"artifact_id":"48951744-f839-5031-8cf4-6e82a4be2089","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:38.937Z","dependency_ids":null,"ingredient_version_id":"e8527602-630b-57ab-b21f-a185719a6c91","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Data-UUID/1.226/6/48951744-f839-5031-8cf4-6e82a4be2089/artifact.tar.gz"},{"artifact_id":"0029ae25-8497-5130-8268-1f0fe26ccc77","build_state":"succeeded","build_timestamp":"2021-02-05T18:02:09.243Z","dependency_ids":null,"ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Importer/0.025/2/0029ae25-8497-5130-8268-1f0fe26ccc77/artifact.tar.gz"},{"artifact_id":"6591f01d-939d-5080-bb1a-7816ff4d020b","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:35.524Z","dependency_ids":null,"ingredient_version_id":"6c89ed56-ef22-541a-bf87-9ff4e10ee371","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Long-Jump/0.000001/3/6591f01d-939d-5080-bb1a-7816ff4d020b/artifact.tar.gz"},{"artifact_id":"7c541a6a-4dfd-5135-8b98-2b44b5d1a816","build_state":"succeeded","build_timestamp":"2021-02-05T18:04:43.305Z","dependency_ids":null,"ingredient_version_id":"0f028feb-10aa-531d-9660-b56c19fb7b43","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Module-Pluggable/5.2/7/7c541a6a-4dfd-5135-8b98-2b44b5d1a816/artifact.tar.gz"},{"artifact_id":"7f8a7197-b277-5621-a6f3-7f2ef32d871b","build_state":"succeeded","build_timestamp":"2021-02-05T18:02:10.497Z","dependency_ids":null,"ingredient_version_id":"1ff5b410-a933-53c7-b3a1-f11524b53213","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Scope-Guard/0.21/5/7f8a7197-b277-5621-a6f3-7f2ef32d871b/artifact.tar.gz"},{"artifact_id":"29983a5b-49c4-5cf4-a2c5-2490647d6910","build_state":"succeeded","build_timestamp":"2021-02-19T21:16:18.962Z","dependency_ids":null,"ingredient_version_id":"9e33e514-0b22-504b-8409-6d0bdbf86108","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Sub-Info/0.002/4/29983a5b-49c4-5cf4-a2c5-2490647d6910/artifact.tar.gz"},{"artifact_id":"4d95557d-2200-5a56-a809-4ea3d3502b20","build_state":"succeeded","build_timestamp":"2021-02-19T21:16:19.477Z","dependency_ids":null,"ingredient_version_id":"7e483f34-00ad-523a-91be-e9ddf74366a5","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Term-Table/0.015/3/4d95557d-2200-5a56-a809-4ea3d3502b20/artifact.tar.gz"},{"artifact_id":"288aa0db-c0e4-55e7-8f67-fc2da409be70","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:45.569Z","dependency_ids":null,"ingredient_version_id":"9c514f0f-5abb-546a-840a-1c97f2010c78","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Test2-Harness/1.000042/2/288aa0db-c0e4-55e7-8f67-fc2da409be70/artifact.tar.gz"},{"artifact_id":"282e3768-e12a-51ed-831f-7cbc212ba8bd","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:34.879Z","dependency_ids":null,"ingredient_version_id":"d85188d8-231d-589f-9bdd-fc5667cc2d2f","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Test2-Plugin-MemUsage/0.002003/3/282e3768-e12a-51ed-831f-7cbc212ba8bd/artifact.tar.gz"},{"artifact_id":"5ad88c8a-bc8f-50a0-9f61-74856cd28017","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:32.081Z","dependency_ids":null,"ingredient_version_id":"b8f76881-09d4-53fd-8cc6-e595b6d69132","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Test2-Plugin-NoWarnings/0.06/3/5ad88c8a-bc8f-50a0-9f61-74856cd28017/artifact.tar.gz"},{"artifact_id":"c3e652a7-676e-594f-b87f-93d19122f3f4","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:32.425Z","dependency_ids":null,"ingredient_version_id":"4bd9f2db-1c09-5a14-82a3-7cb6d966d18c","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Test2-Plugin-UUID/0.002001/3/c3e652a7-676e-594f-b87f-93d19122f3f4/artifact.tar.gz"},{"artifact_id":"30dc7965-0a69-5686-831a-e563fa73a98c","build_state":"succeeded","build_timestamp":"2021-02-19T21:16:40.002Z","dependency_ids":null,"ingredient_version_id":"fa7a0c73-1e93-5e08-8f6b-a009e82d7179","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Test2-Suite/0.000127/2/30dc7965-0a69-5686-831a-e563fa73a98c/artifact.tar.gz"},{"artifact_id":"c1e8c6c4-ea11-55a4-b415-97da2d32121e","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:32.005Z","dependency_ids":null,"ingredient_version_id":"ee3bc68e-abb3-58ff-aa9c-60b7412df7e2","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/goto-file/0.005/3/c1e8c6c4-ea11-55a4-b415-97da2d32121e/artifact.tar.gz"},{"artifact_id":"c894fa23-0416-556d-9ca5-fdf9375595bc","build_state":"succeeded","build_timestamp":"2021-02-20T07:48:54.696Z","dependency_ids":null,"ingredient_version_id":"21141224-b8b8-565c-8fdf-4ded24fcbd8d","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/noop/artifact.tar.gz"},{"artifact_id":"410f6ec8-2e41-5085-9ffe-b6860b7f60d3","build_state":"succeeded","build_timestamp":"2021-02-20T07:48:56.148Z","dependency_ids":null,"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/noop/artifact.tar.gz"}],"build_engine":"alternative","build_request_id":"84061016-0ebb-46f2-9155-3cf82c5f70b3","errors":[],"is_retryable":false,"message":"Recipe build completed successfully","recipe_id":"410f6ec8-2e41-5085-9ffe-b6860b7f60d3","timestamp":"2021-02-20T08:28:57.012Z","type":"build_completed"} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-package.json b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-package.json new file mode 100644 index 0000000000..831c123a98 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-package.json @@ -0,0 +1 @@ +{"artifacts":[{"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_state":"succeeded","build_timestamp":"2021-02-04T18:04:26.190Z","dependency_ids":null,"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/5.32.1/3/b30ab2e5-4074-572c-8146-da692b1c9e45/artifact.tar.gz"},{"artifact_id":"41dbce7b-0d0f-597b-bb6f-411a4fb0b829","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:36.747Z","dependency_ids":null,"ingredient_version_id":"9930b34d-2ad3-507f-912f-729e5bb4e3e1","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Canary-Stability/2013/5/41dbce7b-0d0f-597b-bb6f-411a4fb0b829/artifact.tar.gz"},{"artifact_id":"d51871fd-d270-5423-82b9-78b567c53636","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:53.437Z","dependency_ids":null,"ingredient_version_id":"bc4acfbd-4c39-59fd-bc9c-62662b851b3d","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/JSON-XS/4.03/2/d51871fd-d270-5423-82b9-78b567c53636/artifact.tar.gz"},{"artifact_id":"bfe02625-c7d6-5604-ae04-2e5b4c9592a2","build_state":"succeeded","build_timestamp":"2021-02-20T07:46:50.742Z","dependency_ids":null,"ingredient_version_id":"a64758c6-32a6-5c57-8c43-64a5e53d7309","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/JSON/2.97001/5/bfe02625-c7d6-5604-ae04-2e5b4c9592a2/artifact.tar.gz"},{"artifact_id":"c62e933c-7f68-5e94-8fcd-5f978e3825b4","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:42.084Z","dependency_ids":null,"ingredient_version_id":"f547017b-1726-5839-bb7f-214e420b2f66","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/Types-Serialiser/1.0/3/c62e933c-7f68-5e94-8fcd-5f978e3825b4/artifact.tar.gz"},{"artifact_id":"279d6621-2756-5f82-b1d4-1bd7a41dfc57","build_state":"succeeded","build_timestamp":"2021-02-05T17:59:40.495Z","dependency_ids":null,"ingredient_version_id":"09e2438e-36a3-534b-9626-f5a8825d84ad","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/common-sense/3.75/2/279d6621-2756-5f82-b1d4-1bd7a41dfc57/artifact.tar.gz"},{"artifact_id":"b50600fa-f2ef-5079-afbb-550bf3b8295d","build_state":"succeeded","build_timestamp":"2021-02-20T07:47:01.993Z","dependency_ids":null,"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/noop/artifact.tar.gz"}],"build_engine":"alternative","build_request_id":"e1e5b412-2cf3-45fb-8cd6-ee29c9b5e360","errors":[],"is_retryable":false,"message":"Recipe build completed successfully","recipe_id":"b50600fa-f2ef-5079-afbb-550bf3b8295d","timestamp":"2021-02-20T08:28:51.467Z","type":"build_completed"} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-removed.json b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-removed.json new file mode 100644 index 0000000000..f39e628fbe --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-removed.json @@ -0,0 +1 @@ +{"artifacts":[{"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_state":"succeeded","build_timestamp":"2021-02-04T18:04:26.190Z","dependency_ids":null,"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/5.32.1/3/b30ab2e5-4074-572c-8146-da692b1c9e45/artifact.tar.gz"},{"artifact_id":"aa21f7c8-85a7-5cc2-8ee8-f8bd3b342406","build_state":"succeeded","build_timestamp":"2021-02-06T00:17:40.179Z","dependency_ids":null,"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/noop/artifact.tar.gz"}],"build_engine":"alternative","build_request_id":"8e47da6d-1fce-46c8-bc0e-4fc3b5e0e3cc","errors":[],"is_retryable":false,"message":"Recipe build completed successfully","recipe_id":"aa21f7c8-85a7-5cc2-8ee8-f8bd3b342406","timestamp":"2021-02-20T08:28:55.131Z","type":"build_completed"} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-update.json b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-update.json new file mode 100644 index 0000000000..0603ef8d13 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/builds/perl-alternative-one-update.json @@ -0,0 +1 @@ +{"artifacts":[{"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_state":"succeeded","build_timestamp":"2021-02-04T18:04:26.190Z","dependency_ids":null,"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/5.32.1/3/b30ab2e5-4074-572c-8146-da692b1c9e45/artifact.tar.gz"},{"artifact_id":"f56acc9c-dd02-5cf8-97f9-a5cd015f4c7b","build_state":"succeeded","build_timestamp":"2021-02-05T18:01:58.243Z","dependency_ids":null,"ingredient_version_id":"9c52ef68-d833-59c7-a537-4d20efd2d728","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/production/language/perl/JSON/4.02/4/f56acc9c-dd02-5cf8-97f9-a5cd015f4c7b/artifact.tar.gz"},{"artifact_id":"631c1698-0af4-5b38-ac98-2f8df4220b79","build_state":"succeeded","build_timestamp":"2021-02-20T07:47:53.193Z","dependency_ids":null,"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","uri":"s3://as-builds/noop/artifact.tar.gz"}],"build_engine":"alternative","build_request_id":"0556781d-4318-451e-a388-ac20d62deee2","errors":[],"is_retryable":false,"message":"Recipe build completed successfully","recipe_id":"631c1698-0af4-5b38-ac98-2f8df4220b79","timestamp":"2021-02-20T08:28:53.501Z","type":"build_completed"} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/builds/perl-recipe.json b/pkg/platform/runtime/testhelper/data/builds/perl-recipe.json new file mode 100644 index 0000000000..a75d4ad42f --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/builds/perl-recipe.json @@ -0,0 +1 @@ +{"artifacts":[{"artifact_id":"b759aa67-6aa0-51db-b8a5-015a0a7866b4","build_state":"succeeded","build_timestamp":"2020-04-24T17:28:43.000Z","dependency_ids":[],"platform_id":"0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a","uri":"https://s3.amazonaws.com/camel-builds/ActivePerl/x86_64-linux-glibc-2.17/20200424T172842Z/ActivePerl-5.28.1.0000-x86_64-linux-glibc-2.17-2a0758c3-packages.txt"},{"artifact_id":"e88f6f1f-74c9-512e-9c9b-8c921a80c6fb","build_state":"succeeded","build_timestamp":"2020-04-24T17:28:43.000Z","dependency_ids":[],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a","platform_id":"0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a","uri":"https://s3.amazonaws.com/camel-builds/ActivePerl/x86_64-linux-glibc-2.17/20200424T172842Z/ActivePerl-5.28.1.0000-x86_64-linux-glibc-2.17-2a0758c3.tar.gz"}],"build_engine":"camel","build_request_id":"f2c04701-faf5-49d9-b2b6-a35152901d03","errors":[],"is_retryable":false,"log_uri":"https://s3.amazonaws.com/camel-builds/ActivePerl/x86_64-linux-glibc-2.17/20200424T172842Z/ActivePerl-5.28.1.0000-x86_64-linux-glibc-2.17-2a0758c3.log","message":"Build completed successfully","recipe_id":"585b3357-14fa-58a8-96db-4f5aa602113e","timestamp":"2020-04-24T17:28:43.000Z","type":"build_completed"} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/builds/perl.json b/pkg/platform/runtime/testhelper/data/builds/perl.json new file mode 100644 index 0000000000..a75d4ad42f --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/builds/perl.json @@ -0,0 +1 @@ +{"artifacts":[{"artifact_id":"b759aa67-6aa0-51db-b8a5-015a0a7866b4","build_state":"succeeded","build_timestamp":"2020-04-24T17:28:43.000Z","dependency_ids":[],"platform_id":"0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a","uri":"https://s3.amazonaws.com/camel-builds/ActivePerl/x86_64-linux-glibc-2.17/20200424T172842Z/ActivePerl-5.28.1.0000-x86_64-linux-glibc-2.17-2a0758c3-packages.txt"},{"artifact_id":"e88f6f1f-74c9-512e-9c9b-8c921a80c6fb","build_state":"succeeded","build_timestamp":"2020-04-24T17:28:43.000Z","dependency_ids":[],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a","platform_id":"0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a","uri":"https://s3.amazonaws.com/camel-builds/ActivePerl/x86_64-linux-glibc-2.17/20200424T172842Z/ActivePerl-5.28.1.0000-x86_64-linux-glibc-2.17-2a0758c3.tar.gz"}],"build_engine":"camel","build_request_id":"f2c04701-faf5-49d9-b2b6-a35152901d03","errors":[],"is_retryable":false,"log_uri":"https://s3.amazonaws.com/camel-builds/ActivePerl/x86_64-linux-glibc-2.17/20200424T172842Z/ActivePerl-5.28.1.0000-x86_64-linux-glibc-2.17-2a0758c3.log","message":"Build completed successfully","recipe_id":"585b3357-14fa-58a8-96db-4f5aa602113e","timestamp":"2020-04-24T17:28:43.000Z","type":"build_completed"} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/recipes/alternative-bare.json b/pkg/platform/runtime/testhelper/data/recipes/alternative-bare.json new file mode 100644 index 0000000000..819b533af6 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/recipes/alternative-bare.json @@ -0,0 +1,9002 @@ +{ + "camel_flags": [], + "from_recipe_store": false, + "image": { + "image_id": "b210b15e-c98a-4259-89c8-b7bae56d237f", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/images/b210b15e-c98a-4259-89c8-b7bae56d237f" + }, + "name": "docker-registry.activestate.build/activestate/centos-7.6-builder", + "platform_id": "0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a", + "type": "Docker", + "sortable_version": [ + "1", + "0", + "31", + "0" + ], + "version": "1.0.31", + "provided_features": [ + { + "feature": "GCC", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "7", + "3", + "0" + ], + "version": "7.3" + }, + { + "feature": "GNU C++03", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C++11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C++14", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C89", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C++98", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C99", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++03", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++14", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C89", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++98", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C99", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 77", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 90", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 95", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "author_platform_user_id": "e501c7e7-40cc-4b7a-8fc9-f6a3d314c254", + "comment": "Added a new revision to add compiler features to images", + "is_stable_revision": true, + "conditions": [ + { + "feature": "alternative-builder", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0", + "1", + "0" + ], + "version": "0.0.1" + } + ] + }, + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "status": "stable", + "revision": 4, + "revision_timestamp": "2020-12-03T22:54:45.160370Z" + }, + "is_indemnified": false, + "platform": { + "cpu_architecture": { + "cpu_architecture_id": "4cdba18d-0851-4925-9ae5-9c8a2987828a", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/cpu-architectures/4cdba18d-0851-4925-9ae5-9c8a2987828a" + }, + "bit_width": "64", + "name": "x86", + "provided_features": [ + { + "feature": "x86 64-bit", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "cpu-architecture", + "sortable_version": [ + "1", + "0" + ], + "version": "1" + } + ], + "author_platform_user_id": "7f320133-2c9a-476e-9c09-8970ac525a8f", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true, + "revision": 1, + "revision_timestamp": "2019-08-06T21:46:35.288458Z" + }, + "cpu_extensions": [], + "creation_timestamp": "2019-08-06T21:46:35.288458Z", + "display_name": "CentOS 7.6.1810, Linux 4.15.0, glibc 2.17 x86 64-bit", + "images": [ + { + "image_id": "0fceabb4-ca86-4846-9b0a-c23947770cdb", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/images/0fceabb4-ca86-4846-9b0a-c23947770cdb" + }, + "name": "activestate/centos-7.6-build", + "platform_id": "0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a", + "type": "Docker", + "sortable_version": [ + "1", + "0", + "9", + "0" + ], + "version": "1.0.9", + "provided_features": [ + { + "feature": "GCC", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "4", + "9", + "2", + "0" + ], + "version": "4.9.2" + }, + { + "feature": "GNU C++03", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C++11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C89", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C++98", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C99", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++03", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C89", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++98", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C99", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 77", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 90", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 95", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "author_platform_user_id": "36a36906-04a3-4221-adf1-805632ee9bb7", + "comment": "Added a new revision to add compiler features to images", + "is_stable_revision": true, + "conditions": [ + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + }, + { + "feature": "bogus-dependency", + "namespace": "shared", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "status": "stable", + "revision": 13, + "revision_timestamp": "2021-02-04T20:25:44.473616Z" + }, + { + "image_id": "b210b15e-c98a-4259-89c8-b7bae56d237f", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/images/b210b15e-c98a-4259-89c8-b7bae56d237f" + }, + "name": "docker-registry.activestate.build/activestate/centos-7.6-builder", + "platform_id": "0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a", + "type": "Docker", + "sortable_version": [ + "1", + "0", + "31", + "0" + ], + "version": "1.0.31", + "provided_features": [ + { + "feature": "GCC", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "7", + "3", + "0" + ], + "version": "7.3" + }, + { + "feature": "GNU C++03", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C++11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C++14", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C89", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C++98", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C99", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++03", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++14", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C89", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++98", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C99", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 77", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 90", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 95", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "author_platform_user_id": "e501c7e7-40cc-4b7a-8fc9-f6a3d314c254", + "comment": "Added a new revision to add compiler features to images", + "is_stable_revision": true, + "conditions": [ + { + "feature": "alternative-builder", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0", + "1", + "0" + ], + "version": "0.0.1" + } + ] + }, + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "status": "stable", + "revision": 4, + "revision_timestamp": "2020-12-03T22:54:45.160370Z" + }, + { + "image_id": "74150f63-4452-4bfa-9622-c64552e68346", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/images/74150f63-4452-4bfa-9622-c64552e68346" + }, + "name": "docker-registry.activestate.build/activestate/centos-7.9-build", + "platform_id": "0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a", + "type": "Docker", + "sortable_version": [ + "1", + "1", + "1", + "0" + ], + "version": "1.1.1", + "provided_features": [ + { + "feature": "GCC", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "7", + "3", + "0" + ], + "version": "7.3" + }, + { + "feature": "GNU C++03", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C++11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C++14", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C89", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C++98", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "GNU C99", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++03", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++14", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C89", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++98", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C99", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 77", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 90", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO Fortran 95", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "author_platform_user_id": "36a36906-04a3-4221-adf1-805632ee9bb7", + "comment": "Added a new revision to add compiler features to images", + "is_stable_revision": true, + "conditions": [ + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "status": "stable", + "revision": 1, + "revision_timestamp": "2021-02-04T20:25:28.031620Z" + } + ], + "is_user_visible": true, + "kernel": { + "kernel_id": "ef737274-fff9-4164-b72b-88067613f822", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822" + }, + "name": "Linux" + }, + "kernel_version": { + "kernel_version_id": "2450c462-66e0-4aca-97d4-9910a19996f6", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822/versions/2450c462-66e0-4aca-97d4-9910a19996f6" + }, + "sortable_version": [ + "4", + "15", + "0", + "0" + ], + "version": "4.15.0", + "provided_features": [ + { + "feature": "Linux", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "kernel", + "sortable_version": [ + "4", + "15", + "0", + "0" + ], + "version": "4.15.0" + } + ], + "author_platform_user_id": "7f320133-2c9a-476e-9c09-8970ac525a8f", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true, + "revision": 1, + "revision_timestamp": "2019-08-06T21:46:35.288458Z" + }, + "libc": { + "libc_id": "09a2eb42-ad34-4734-a93e-4b97395577df", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df" + }, + "name": "glibc" + }, + "libc_version": { + "libc_version_id": "277c8630-948f-449c-9d69-5cf2ce3eb7eb", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df/versions/277c8630-948f-449c-9d69-5cf2ce3eb7eb" + }, + "sortable_version": [ + "2", + "17", + "0" + ], + "version": "2.17", + "provided_features": [ + { + "feature": "glibc", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "libc", + "sortable_version": [ + "2", + "17", + "0" + ], + "version": "2.17" + } + ], + "author_platform_user_id": "7f320133-2c9a-476e-9c09-8970ac525a8f", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true, + "revision": 1, + "revision_timestamp": "2019-08-06T21:46:35.288458Z" + }, + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/platforms/0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a" + }, + "operating_system": { + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99" + }, + "operating_system_id": "7b3a2dbb-d543-48d6-8390-7e7b63751e99", + "has_libc": true, + "name": "CentOS" + }, + "operating_system_version": { + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99/versions/2cab2f48-fb0b-415f-85f8-ddd045969662" + }, + "operating_system_version_id": "2cab2f48-fb0b-415f-85f8-ddd045969662", + "sortable_version": [ + "7", + "6", + "1810", + "0" + ], + "version": "7.6.1810", + "provided_features": [ + { + "feature": "CentOS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "operating-system", + "sortable_version": [ + "7", + "6", + "1810", + "0" + ], + "version": "7.6.1810" + } + ], + "author_platform_user_id": "7f320133-2c9a-476e-9c09-8970ac525a8f", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true, + "revision": 1, + "revision_timestamp": "2019-08-06T21:46:35.288458Z" + }, + "platform_id": "0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a" + }, + "recipe_id": "ad807d9a-8214-5395-92c4-77b6301248f2", + "resolved_ingredients": [ + { + "alternatives": [], + "artifact_id": "ccffef06-ba83-5716-9dd0-b629f2a65f68", + "build_scripts": null, + "dependencies": [], + "ingredient": { + "creation_timestamp": "2020-08-10T23:47:40.385229Z", + "ingredient_id": "a4128de4-f62c-5349-80e6-b072d5aa3e31", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31" + }, + "name": "perl-core-builder", + "normalized_name": "perl-core-builder", + "primary_namespace": "builder", + "description": "Builds the core Perl interpreter on the ActiveState platform.", + "website": "https://activestate.com" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2020-09-30T17:58:38.567523Z", + "ingredient_id": "a4128de4-f62c-5349-80e6-b072d5aa3e31", + "ingredient_version_id": "d5ac8c7c-b025-5418-ab77-a139e60e1d41", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31/versions/d5ac8c7c-b025-5418-ab77-a139e60e1d41", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31" + }, + "revision": 2, + "revision_timestamp": "2020-10-30T17:04:06.702744Z", + "copyright_text": "To be added.", + "documentation_uri": "https://activestate.com", + "is_binary_only": false, + "license_expression": "(MIT-1.0)", + "release_timestamp": "2020-06-25T07:05:14.000000Z", + "source_uri": "https://github.com/ActiveState/platform-builders/builders/perl-core-builder", + "sortable_version": [ + "1", + "0", + "23", + "0" + ], + "version": "1.0.23", + "activestate_license_expression": "unknown", + "camel_extras": {}, + "dependencies": null, + "ingredient_options": null, + "is_indemnified": false, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/builder/cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374/perl-core-builder.tar.gz", + "scanner_license_expression": "unknown", + "source_checksum": "cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374", + "status": "stable", + "provided_features": [ + { + "feature": "alternative-builder", + "is_activestate_version": false, + "is_default_provider": false, + "namespace": "builder", + "sortable_version": [ + "1", + "0", + "0", + "0" + ], + "version": "1.0.0" + }, + { + "feature": "perl-core-builder", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "builder", + "sortable_version": [ + "1", + "0", + "23", + "0" + ], + "version": "1.0.23" + } + ], + "author_platform_user_id": "fe7c9294-51d6-4df6-a5b5-44cf5a924ebc", + "comment": "Initial builder for perl 5.30+", + "is_stable_revision": true + }, + "patches": null, + "resolved_requirements": [] + }, + { + "alternatives": [], + "artifact_id": "71e4a1fe-eba7-5ee1-a95f-94fd70aa2d87", + "build_scripts": null, + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "d5ac8c7c-b025-5418-ab77-a139e60e1d41" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T16:56:32.665096Z", + "ingredient_id": "ed4b2154-eaee-5fba-88bb-d1eca86b1206", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206" + }, + "name": "perl", + "normalized_name": "perl", + "primary_namespace": "language", + "description": "Practical Extraction and Report Language" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2020-10-14T19:24:44.505799Z", + "ingredient_id": "ed4b2154-eaee-5fba-88bb-d1eca86b1206", + "ingredient_version_id": "a845e482-d3ec-5379-aba3-96e74794570f", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206/versions/a845e482-d3ec-5379-aba3-96e74794570f", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206" + }, + "revision": 7, + "revision_timestamp": "2021-02-03T21:13:51.365878Z", + "copyright_text": "To be added.", + "is_binary_only": false, + "license_expression": "Unknown", + "release_timestamp": "1970-01-01T00:00:00.000000Z", + "source_uri": "https://www.cpan.org/src/5.0/perl-5.32.0.tar.gz", + "sortable_version": [ + "5", + "32", + "0" + ], + "version": "5.32.0", + "activestate_license_expression": "[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]", + "camel_extras": {}, + "dependencies": [ + { + "conditions": [ + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "description": "The perl language requires a compiler to build", + "feature": "Visual Studio", + "namespace": "compiler", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": null, + "feature": "perl-core-builder", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": null, + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ], + "type": "build" + }, + { + "conditions": null, + "description": "The perl language requires a compiler to build", + "feature": "ISO C89", + "namespace": "compiler", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/language/efeb1ce1f10824190ad1cadbcccf6fdb8a5d37007d0100d2d9ae5f2b5900c0b4/perl-5.32.0.tar.gz", + "scanner_license_expression": "[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]", + "source_checksum": "efeb1ce1f10824190ad1cadbcccf6fdb8a5d37007d0100d2d9ae5f2b5900c0b4", + "status": "stable", + "provided_features": [ + { + "feature": "alternative-built-language", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language", + "sortable_version": [ + "5", + "32", + "0", + "0" + ], + "version": "5.32.0" + }, + { + "feature": "perl", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language", + "sortable_version": [ + "5", + "32", + "0" + ], + "version": "5.32.0" + }, + { + "feature": "Amiga::ARexx", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "40", + "0" + ], + "version": "0.04" + }, + { + "feature": "Amiga::Exec", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "20", + "0" + ], + "version": "0.02" + }, + { + "feature": "AnyDBM_File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "10", + "0" + ], + "version": "1.01" + }, + { + "feature": "App::Cpan", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "675", + "0" + ], + "version": "1.675" + }, + { + "feature": "App::Prove", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "App::Prove::State", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "App::Prove::State::Result", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "App::Prove::State::Result::Test", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "Archive::Tar", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "360", + "0" + ], + "version": "2.36" + }, + { + "feature": "Archive::Tar::Constant", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "360", + "0" + ], + "version": "2.36" + }, + { + "feature": "Archive::Tar::File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "360", + "0" + ], + "version": "2.36" + }, + { + "feature": "Attribute::Handlers", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "10", + "0" + ], + "version": "1.01" + }, + { + "feature": "AutoLoader", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "740", + "0" + ], + "version": "5.74" + }, + { + "feature": "AutoSplit", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "60", + "0" + ], + "version": "1.06" + }, + { + "feature": "B", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "800", + "0" + ], + "version": "1.80" + }, + { + "feature": "B::Concise", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "4", + "0" + ], + "version": "1.004" + }, + { + "feature": "B::Deparse", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "540", + "0" + ], + "version": "1.54" + }, + { + "feature": "B::Op_private", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "32", + "0" + ], + "version": "5.032000" + }, + { + "feature": "B::Showlex", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "50", + "0" + ], + "version": "1.05" + }, + { + "feature": "B::Terse", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "90", + "0" + ], + "version": "1.09" + }, + { + "feature": "B::Xref", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "70", + "0" + ], + "version": "1.07" + }, + { + "feature": "Benchmark", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "230", + "0" + ], + "version": "1.23" + }, + { + "feature": "CPAN", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "270", + "0" + ], + "version": "2.27" + }, + { + "feature": "CPAN::Author", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "200" + ], + "version": "5.5002" + }, + { + "feature": "CPAN::Bundle", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "500" + ], + "version": "5.5005" + }, + { + "feature": "CPAN::CacheMgr", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "200" + ], + "version": "5.5002" + }, + { + "feature": "CPAN::Complete", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "100" + ], + "version": "5.5001" + }, + { + "feature": "CPAN::Debug", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "100" + ], + "version": "5.5001" + }, + { + "feature": "CPAN::DeferredCode", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "0" + ], + "version": "5.50" + }, + { + "feature": "CPAN::Distribution", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "270", + "0" + ], + "version": "2.27" + }, + { + "feature": "CPAN::Distroprefs", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "6", + "0", + "100" + ], + "version": "6.0001" + }, + { + "feature": "CPAN::Distrostatus", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "0" + ], + "version": "5.5" + }, + { + "feature": "CPAN::Exception::RecursiveDependency", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "100" + ], + "version": "5.5001" + }, + { + "feature": "CPAN::Exception::blocked_urllist", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "1", + "0" + ], + "version": "1.001" + }, + { + "feature": "CPAN::Exception::yaml_not_installed", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "0" + ], + "version": "5.5" + }, + { + "feature": "CPAN::Exception::yaml_process_error", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "0" + ], + "version": "5.5" + }, + { + "feature": "CPAN::FTP", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "501", + "200" + ], + "version": "5.5012" + }, + { + "feature": "CPAN::FTP::netrc", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "10", + "0" + ], + "version": "1.01" + }, + { + "feature": "CPAN::FirstTime", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "531", + "400" + ], + "version": "5.5314" + }, + { + "feature": "CPAN::HTTP::Client", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "960", + "100" + ], + "version": "1.9601" + }, + { + "feature": "CPAN::HTTP::Credentials", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "960", + "100" + ], + "version": "1.9601" + }, + { + "feature": "CPAN::HandleConfig", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "501", + "100" + ], + "version": "5.5011" + }, + { + "feature": "CPAN::Index", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "120", + "0" + ], + "version": "2.12" + }, + { + "feature": "CPAN::InfoObj", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "0" + ], + "version": "5.5" + }, + { + "feature": "CPAN::Kwalify", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "0" + ], + "version": "5.50" + }, + { + "feature": "CPAN::LWP::UserAgent", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "960", + "100" + ], + "version": "1.9601" + }, + { + "feature": "CPAN::Meta", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "150", + "10" + ], + "version": "2.150010" + }, + { + "feature": "CPAN::Meta::Converter", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "150", + "10" + ], + "version": "2.150010" + }, + { + "feature": "CPAN::Meta::Feature", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "150", + "10" + ], + "version": "2.150010" + }, + { + "feature": "CPAN::Meta::History", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "150", + "10" + ], + "version": "2.150010" + }, + { + "feature": "CPAN::Meta::Merge", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "150", + "10" + ], + "version": "2.150010" + }, + { + "feature": "CPAN::Meta::Prereqs", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "150", + "10" + ], + "version": "2.150010" + }, + { + "feature": "CPAN::Meta::Requirements", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "140", + "0" + ], + "version": "2.140" + }, + { + "feature": "CPAN::Meta::Spec", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "150", + "10" + ], + "version": "2.150010" + }, + { + "feature": "CPAN::Meta::Validator", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "150", + "10" + ], + "version": "2.150010" + }, + { + "feature": "CPAN::Meta::YAML", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "18", + "0" + ], + "version": "0.018" + }, + { + "feature": "CPAN::Mirrors", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "270", + "0" + ], + "version": "2.27" + }, + { + "feature": "CPAN::Module", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "300" + ], + "version": "5.5003" + }, + { + "feature": "CPAN::Nox", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "100" + ], + "version": "5.5001" + }, + { + "feature": "CPAN::Plugin", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "970", + "0" + ], + "version": "0.97" + }, + { + "feature": "CPAN::Plugin::Specfile", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "20", + "0" + ], + "version": "0.02" + }, + { + "feature": "CPAN::Prompt", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "0" + ], + "version": "5.5" + }, + { + "feature": "CPAN::Queue", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "300" + ], + "version": "5.5003" + }, + { + "feature": "CPAN::Shell", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "900" + ], + "version": "5.5009" + }, + { + "feature": "CPAN::Tarzip", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "501", + "300" + ], + "version": "5.5013" + }, + { + "feature": "CPAN::URL", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "0" + ], + "version": "5.5" + }, + { + "feature": "CPAN::Version", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "500", + "300" + ], + "version": "5.5003" + }, + { + "feature": "Carp", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "500", + "0" + ], + "version": "1.50" + }, + { + "feature": "Carp::Heavy", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "500", + "0" + ], + "version": "1.50" + }, + { + "feature": "Class::Struct", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "660", + "0" + ], + "version": "0.66" + }, + { + "feature": "Compress::Raw::Bzip2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "Compress::Raw::Zlib", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "Compress::Zlib", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "Config", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "32", + "0" + ], + "version": "5.032" + }, + { + "feature": "Config::Extensions", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "30", + "0" + ], + "version": "0.03" + }, + { + "feature": "Config::Perl::V", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "320", + "0" + ], + "version": "0.32" + }, + { + "feature": "Cwd", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "780", + "0" + ], + "version": "3.78" + }, + { + "feature": "DB", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "80", + "0" + ], + "version": "1.08" + }, + { + "feature": "DBM_Filter", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "60", + "0" + ], + "version": "0.06" + }, + { + "feature": "DBM_Filter::compress", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "30", + "0" + ], + "version": "0.03" + }, + { + "feature": "DBM_Filter::encode", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "30", + "0" + ], + "version": "0.03" + }, + { + "feature": "DBM_Filter::int32", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "30", + "0" + ], + "version": "0.03" + }, + { + "feature": "DBM_Filter::null", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "30", + "0" + ], + "version": "0.03" + }, + { + "feature": "DBM_Filter::utf8", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "30", + "0" + ], + "version": "0.03" + }, + { + "feature": "DB_File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "853", + "0" + ], + "version": "1.853" + }, + { + "feature": "Data::Dumper", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "174", + "0" + ], + "version": "2.174" + }, + { + "feature": "Devel::PPPort", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "570", + "0" + ], + "version": "3.57" + }, + { + "feature": "Devel::Peek", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "280", + "0" + ], + "version": "1.28" + }, + { + "feature": "Devel::SelfStubber", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "60", + "0" + ], + "version": "1.06" + }, + { + "feature": "Digest", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "170", + "100" + ], + "version": "1.17_01" + }, + { + "feature": "Digest::MD5", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "550", + "100" + ], + "version": "2.55_01" + }, + { + "feature": "Digest::SHA", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "6", + "20", + "0" + ], + "version": "6.02" + }, + { + "feature": "Digest::base", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "160", + "0" + ], + "version": "1.16" + }, + { + "feature": "Digest::file", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "160", + "0" + ], + "version": "1.16" + }, + { + "feature": "DirHandle", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "50", + "0" + ], + "version": "1.05" + }, + { + "feature": "Dumpvalue", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "210", + "0" + ], + "version": "1.21" + }, + { + "feature": "DynaLoader", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "470", + "0" + ], + "version": "1.47" + }, + { + "feature": "Encode", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "60", + "0" + ], + "version": "3.06" + }, + { + "feature": "Encode::Alias", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "240", + "0" + ], + "version": "2.24" + }, + { + "feature": "Encode::Byte", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "40", + "0" + ], + "version": "2.04" + }, + { + "feature": "Encode::CJKConstants", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "20", + "0" + ], + "version": "2.02" + }, + { + "feature": "Encode::CN", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "30", + "0" + ], + "version": "2.03" + }, + { + "feature": "Encode::CN::HZ", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "100", + "0" + ], + "version": "2.10" + }, + { + "feature": "Encode::Config", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "50", + "0" + ], + "version": "2.05" + }, + { + "feature": "Encode::EBCDIC", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "20", + "0" + ], + "version": "2.02" + }, + { + "feature": "Encode::Encoder", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "30", + "0" + ], + "version": "2.03" + }, + { + "feature": "Encode::Encoding", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "80", + "0" + ], + "version": "2.08" + }, + { + "feature": "Encode::GSM0338", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "70", + "0" + ], + "version": "2.07" + }, + { + "feature": "Encode::Guess", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "80", + "0" + ], + "version": "2.08" + }, + { + "feature": "Encode::JP", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "40", + "0" + ], + "version": "2.04" + }, + { + "feature": "Encode::JP::H2Z", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "20", + "0" + ], + "version": "2.02" + }, + { + "feature": "Encode::JP::JIS7", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "80", + "0" + ], + "version": "2.08" + }, + { + "feature": "Encode::KR", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "30", + "0" + ], + "version": "2.03" + }, + { + "feature": "Encode::KR::2022_KR", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "40", + "0" + ], + "version": "2.04" + }, + { + "feature": "Encode::MIME::Header", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "280", + "0" + ], + "version": "2.28" + }, + { + "feature": "Encode::MIME::Header::ISO_2022_JP", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "90", + "0" + ], + "version": "1.09" + }, + { + "feature": "Encode::MIME::Name", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "Encode::Symbol", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "20", + "0" + ], + "version": "2.02" + }, + { + "feature": "Encode::TW", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "30", + "0" + ], + "version": "2.03" + }, + { + "feature": "Encode::Unicode", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "180", + "0" + ], + "version": "2.18" + }, + { + "feature": "Encode::Unicode::UTF7", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "100", + "0" + ], + "version": "2.10" + }, + { + "feature": "English", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "110", + "0" + ], + "version": "1.11" + }, + { + "feature": "Env", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "40", + "0" + ], + "version": "1.04" + }, + { + "feature": "Errno", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "300", + "0" + ], + "version": "1.30" + }, + { + "feature": "Exporter", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "740", + "0" + ], + "version": "5.74" + }, + { + "feature": "Exporter::Heavy", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "740", + "0" + ], + "version": "5.74" + }, + { + "feature": "ExtUtils::CBuilder", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Base", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::Unix", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::VMS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::Windows", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::Windows::BCC", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::Windows::GCC", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::Windows::MSVC", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::aix", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::android", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::cygwin", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::darwin", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::dec_osf", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::CBuilder::Platform::os2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "234" + ], + "version": "0.280234" + }, + { + "feature": "ExtUtils::Command", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::Command::MM", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::Constant", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "250", + "0" + ], + "version": "0.25" + }, + { + "feature": "ExtUtils::Constant::Base", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "60", + "0" + ], + "version": "0.06" + }, + { + "feature": "ExtUtils::Constant::ProxySubs", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "90", + "0" + ], + "version": "0.09" + }, + { + "feature": "ExtUtils::Constant::Utils", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "40", + "0" + ], + "version": "0.04" + }, + { + "feature": "ExtUtils::Constant::XS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "30", + "0" + ], + "version": "0.03" + }, + { + "feature": "ExtUtils::Embed", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "350", + "0" + ], + "version": "1.35" + }, + { + "feature": "ExtUtils::Install", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "140", + "0" + ], + "version": "2.14" + }, + { + "feature": "ExtUtils::Installed", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "140", + "0" + ], + "version": "2.14" + }, + { + "feature": "ExtUtils::Liblist", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::Liblist::Kid", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_AIX", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_Any", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_BeOS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_Cygwin", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_DOS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_Darwin", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_MacOS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_NW5", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_OS2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_QNX", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_UWIN", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_Unix", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_VMS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_VOS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_Win32", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MM_Win95", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MY", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MakeMaker", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MakeMaker::Config", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MakeMaker::Locale", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MakeMaker::version", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::MakeMaker::version::regex", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::Manifest", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "720", + "0" + ], + "version": "1.72" + }, + { + "feature": "ExtUtils::Miniperl", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "90", + "0" + ], + "version": "1.09" + }, + { + "feature": "ExtUtils::Mkbootstrap", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::Mksymlists", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "ExtUtils::Packlist", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "140", + "0" + ], + "version": "2.14" + }, + { + "feature": "ExtUtils::ParseXS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "ExtUtils::ParseXS::Constants", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "ExtUtils::ParseXS::CountLines", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "ExtUtils::ParseXS::Eval", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "ExtUtils::ParseXS::Utilities", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "ExtUtils::Typemaps", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "380", + "0" + ], + "version": "3.38" + }, + { + "feature": "ExtUtils::Typemaps::Cmd", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "380", + "0" + ], + "version": "3.38" + }, + { + "feature": "ExtUtils::Typemaps::InputMap", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "380", + "0" + ], + "version": "3.38" + }, + { + "feature": "ExtUtils::Typemaps::OutputMap", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "380", + "0" + ], + "version": "3.38" + }, + { + "feature": "ExtUtils::Typemaps::Type", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "380", + "0" + ], + "version": "3.38" + }, + { + "feature": "ExtUtils::XSSymSet", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "400", + "0" + ], + "version": "1.4" + }, + { + "feature": "ExtUtils::testlib", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "7", + "440", + "0" + ], + "version": "7.44" + }, + { + "feature": "Fatal", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "320", + "0" + ], + "version": "2.32" + }, + { + "feature": "Fcntl", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "130", + "0" + ], + "version": "1.13" + }, + { + "feature": "File::Basename", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "850", + "0" + ], + "version": "2.85" + }, + { + "feature": "File::Compare", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "100", + "600" + ], + "version": "1.1006" + }, + { + "feature": "File::Copy", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "340", + "0" + ], + "version": "2.34" + }, + { + "feature": "File::DosGlob", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "120", + "0" + ], + "version": "1.12" + }, + { + "feature": "File::Fetch", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "560", + "0" + ], + "version": "0.56" + }, + { + "feature": "File::Find", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "370", + "0" + ], + "version": "1.37" + }, + { + "feature": "File::Glob", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "330", + "0" + ], + "version": "1.33" + }, + { + "feature": "File::GlobMapper", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "1", + "0" + ], + "version": "1.001" + }, + { + "feature": "File::Path", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "160", + "0" + ], + "version": "2.16" + }, + { + "feature": "File::Spec", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "780", + "0" + ], + "version": "3.78" + }, + { + "feature": "File::Spec::AmigaOS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "780", + "0" + ], + "version": "3.78" + }, + { + "feature": "File::Spec::Cygwin", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "780", + "0" + ], + "version": "3.78" + }, + { + "feature": "File::Spec::Epoc", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "780", + "0" + ], + "version": "3.78" + }, + { + "feature": "File::Spec::Functions", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "780", + "0" + ], + "version": "3.78" + }, + { + "feature": "File::Spec::Mac", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "780", + "0" + ], + "version": "3.78" + }, + { + "feature": "File::Spec::OS2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "780", + "0" + ], + "version": "3.78" + }, + { + "feature": "File::Spec::Unix", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "780", + "0" + ], + "version": "3.78" + }, + { + "feature": "File::Spec::VMS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "780", + "0" + ], + "version": "3.78" + }, + { + "feature": "File::Spec::Win32", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "790", + "0" + ], + "version": "3.79" + }, + { + "feature": "File::Temp", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "230", + "900" + ], + "version": "0.2309" + }, + { + "feature": "File::stat", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "90", + "0" + ], + "version": "1.09" + }, + { + "feature": "FileCache", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "100", + "0" + ], + "version": "1.10" + }, + { + "feature": "FileHandle", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "30", + "0" + ], + "version": "2.03" + }, + { + "feature": "Filter::Simple", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "960", + "0" + ], + "version": "0.96" + }, + { + "feature": "Filter::Util::Call", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "590", + "0" + ], + "version": "1.59" + }, + { + "feature": "FindBin", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "510", + "0" + ], + "version": "1.51" + }, + { + "feature": "GDBM_File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "180", + "0" + ], + "version": "1.18" + }, + { + "feature": "Getopt::Long", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "510", + "0" + ], + "version": "2.51" + }, + { + "feature": "Getopt::Std", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "120", + "0" + ], + "version": "1.12" + }, + { + "feature": "HTTP::Tiny", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "76", + "0" + ], + "version": "0.076" + }, + { + "feature": "Hash::Util", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "230", + "0" + ], + "version": "0.23" + }, + { + "feature": "Hash::Util::FieldHash", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "200", + "0" + ], + "version": "1.20" + }, + { + "feature": "I18N::Collate", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "20", + "0" + ], + "version": "1.02" + }, + { + "feature": "I18N::LangTags", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "440", + "0" + ], + "version": "0.44" + }, + { + "feature": "I18N::LangTags::Detect", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "80", + "0" + ], + "version": "1.08" + }, + { + "feature": "I18N::LangTags::List", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "400", + "0" + ], + "version": "0.40" + }, + { + "feature": "I18N::Langinfo", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "190", + "0" + ], + "version": "0.19" + }, + { + "feature": "IO", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "430", + "0" + ], + "version": "1.43" + }, + { + "feature": "IO::Compress::Adapter::Bzip2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Adapter::Deflate", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Adapter::Identity", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Base", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Base::Common", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Bzip2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Deflate", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Gzip", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Gzip::Constants", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::RawDeflate", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Zip", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Zip::Constants", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Zlib::Constants", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Compress::Zlib::Extra", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Dir", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "410", + "0" + ], + "version": "1.41" + }, + { + "feature": "IO::File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "410", + "0" + ], + "version": "1.41" + }, + { + "feature": "IO::Handle", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "420", + "0" + ], + "version": "1.42" + }, + { + "feature": "IO::Pipe", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "410", + "0" + ], + "version": "1.41" + }, + { + "feature": "IO::Poll", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "410", + "0" + ], + "version": "1.41" + }, + { + "feature": "IO::Seekable", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "410", + "0" + ], + "version": "1.41" + }, + { + "feature": "IO::Select", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "420", + "0" + ], + "version": "1.42" + }, + { + "feature": "IO::Socket", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "430", + "0" + ], + "version": "1.43" + }, + { + "feature": "IO::Socket::INET", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "410", + "0" + ], + "version": "1.41" + }, + { + "feature": "IO::Socket::IP", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "390", + "0" + ], + "version": "0.39" + }, + { + "feature": "IO::Socket::UNIX", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "410", + "0" + ], + "version": "1.41" + }, + { + "feature": "IO::Uncompress::Adapter::Bunzip2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Uncompress::Adapter::Identity", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Uncompress::Adapter::Inflate", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Uncompress::AnyInflate", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Uncompress::AnyUncompress", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Uncompress::Base", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Uncompress::Bunzip2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Uncompress::Gunzip", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Uncompress::Inflate", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Uncompress::RawInflate", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Uncompress::Unzip", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "93", + "0" + ], + "version": "2.093" + }, + { + "feature": "IO::Zlib", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "100", + "0" + ], + "version": "1.10" + }, + { + "feature": "IPC::Cmd", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "40", + "0" + ], + "version": "1.04" + }, + { + "feature": "IPC::Msg", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "70", + "0" + ], + "version": "2.07" + }, + { + "feature": "IPC::Open2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "50", + "0" + ], + "version": "1.05" + }, + { + "feature": "IPC::Open3", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "210", + "0" + ], + "version": "1.21" + }, + { + "feature": "IPC::Semaphore", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "70", + "0" + ], + "version": "2.07" + }, + { + "feature": "IPC::SharedMem", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "70", + "0" + ], + "version": "2.07" + }, + { + "feature": "IPC::SysV", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "70", + "0" + ], + "version": "2.07" + }, + { + "feature": "JSON::PP", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "4", + "40", + "0" + ], + "version": "4.04" + }, + { + "feature": "JSON::PP::Boolean", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "4", + "40", + "0" + ], + "version": "4.04" + }, + { + "feature": "List::Util", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "550", + "0" + ], + "version": "1.55" + }, + { + "feature": "List::Util::XS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "550", + "0" + ], + "version": "1.55" + }, + { + "feature": "Locale::Maketext", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "290", + "0" + ], + "version": "1.29" + }, + { + "feature": "Locale::Maketext::Guts", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "200", + "0" + ], + "version": "1.20" + }, + { + "feature": "Locale::Maketext::GutsLoader", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "200", + "0" + ], + "version": "1.20" + }, + { + "feature": "Locale::Maketext::Simple", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "210", + "100" + ], + "version": "0.21_01" + }, + { + "feature": "MIME::Base64", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "150", + "0" + ], + "version": "3.15" + }, + { + "feature": "MIME::QuotedPrint", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "130", + "0" + ], + "version": "3.13" + }, + { + "feature": "Math::BigFloat", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "999", + "818" + ], + "version": "1.999818" + }, + { + "feature": "Math::BigFloat::Trace", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "510", + "0" + ], + "version": "0.51" + }, + { + "feature": "Math::BigInt", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "999", + "818" + ], + "version": "1.999818" + }, + { + "feature": "Math::BigInt::Calc", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "999", + "818" + ], + "version": "1.999818" + }, + { + "feature": "Math::BigInt::FastCalc", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "500", + "900" + ], + "version": "0.5009" + }, + { + "feature": "Math::BigInt::Lib", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "999", + "818" + ], + "version": "1.999818" + }, + { + "feature": "Math::BigInt::Trace", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "510", + "0" + ], + "version": "0.51" + }, + { + "feature": "Math::BigRat", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "261", + "400" + ], + "version": "0.2614" + }, + { + "feature": "Math::Complex", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "590", + "100" + ], + "version": "1.5901" + }, + { + "feature": "Math::Trig", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "230", + "0" + ], + "version": "1.23" + }, + { + "feature": "Memoize", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "100" + ], + "version": "1.03_01" + }, + { + "feature": "Memoize::AnyDBM_File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "Memoize::Expire", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "Memoize::ExpireFile", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "Memoize::ExpireTest", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "Memoize::NDBM_File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "Memoize::SDBM_File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "Memoize::Storable", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "Module::CoreList", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "202", + "6", + "200" + ], + "version": "5.20200620" + }, + { + "feature": "Module::CoreList::Utils", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "202", + "6", + "200" + ], + "version": "5.20200620" + }, + { + "feature": "Module::Load", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "340", + "0" + ], + "version": "0.34" + }, + { + "feature": "Module::Load::Conditional", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "700", + "0" + ], + "version": "0.70" + }, + { + "feature": "Module::Loaded", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "80", + "0" + ], + "version": "0.08" + }, + { + "feature": "Module::Metadata", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "0", + "37" + ], + "version": "1.000037" + }, + { + "feature": "Moped::Msg", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "10", + "0" + ], + "version": "0.01" + }, + { + "feature": "NDBM_File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "150", + "0" + ], + "version": "1.15" + }, + { + "feature": "NEXT", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "670", + "100" + ], + "version": "0.67_01" + }, + { + "feature": "Net::Cmd", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::Config", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::Domain", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::FTP", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::FTP::A", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::FTP::E", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::FTP::I", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::FTP::L", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::FTP::dataconn", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::NNTP", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::Netrc", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::POP3", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::Ping", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "720", + "0" + ], + "version": "2.72" + }, + { + "feature": "Net::SMTP", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::Time", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "110", + "0" + ], + "version": "3.11" + }, + { + "feature": "Net::hostent", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "20", + "0" + ], + "version": "1.02" + }, + { + "feature": "Net::netent", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "10", + "0" + ], + "version": "1.01" + }, + { + "feature": "Net::protoent", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "10", + "0" + ], + "version": "1.01" + }, + { + "feature": "Net::servent", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "20", + "0" + ], + "version": "1.02" + }, + { + "feature": "O", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "ODBM_File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "160", + "0" + ], + "version": "1.16" + }, + { + "feature": "OS2::DLL", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "70", + "0" + ], + "version": "1.07" + }, + { + "feature": "OS2::ExtAttr", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "40", + "0" + ], + "version": "0.04" + }, + { + "feature": "OS2::PrfDB", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "40", + "0" + ], + "version": "0.04" + }, + { + "feature": "OS2::Process", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "120", + "0" + ], + "version": "1.12" + }, + { + "feature": "OS2::REXX", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "50", + "0" + ], + "version": "1.05" + }, + { + "feature": "Opcode", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "470", + "0" + ], + "version": "1.47" + }, + { + "feature": "POSIX", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "940", + "0" + ], + "version": "1.94" + }, + { + "feature": "Params::Check", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "380", + "0" + ], + "version": "0.38" + }, + { + "feature": "Parse::CPAN::Meta", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "150", + "10" + ], + "version": "2.150010" + }, + { + "feature": "Perl::OSType", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "10", + "0" + ], + "version": "1.010" + }, + { + "feature": "PerlIO", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "110", + "0" + ], + "version": "1.11" + }, + { + "feature": "PerlIO::encoding", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "280", + "0" + ], + "version": "0.28" + }, + { + "feature": "PerlIO::mmap", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "16", + "0" + ], + "version": "0.016" + }, + { + "feature": "PerlIO::scalar", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "300", + "0" + ], + "version": "0.30" + }, + { + "feature": "PerlIO::via", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "180", + "0" + ], + "version": "0.18" + }, + { + "feature": "PerlIO::via::QuotedPrint", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "80", + "0" + ], + "version": "0.08" + }, + { + "feature": "Pod::Checker", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "730", + "0" + ], + "version": "1.73" + }, + { + "feature": "Pod::Escapes", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "70", + "0" + ], + "version": "1.07" + }, + { + "feature": "Pod::Functions", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "130", + "0" + ], + "version": "1.13" + }, + { + "feature": "Pod::Functions::Functions", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "130", + "0" + ], + "version": "1.13" + }, + { + "feature": "Pod::Html", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "250", + "0" + ], + "version": "1.25" + }, + { + "feature": "Pod::Man", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "4", + "140", + "0" + ], + "version": "4.14" + }, + { + "feature": "Pod::ParseLink", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "4", + "140", + "0" + ], + "version": "4.14" + }, + { + "feature": "Pod::Perldoc", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "100" + ], + "version": "3.2801" + }, + { + "feature": "Pod::Perldoc::BaseTo", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Perldoc::GetOptsOO", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Perldoc::ToANSI", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Perldoc::ToChecker", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Perldoc::ToMan", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Perldoc::ToNroff", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Perldoc::ToPod", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Perldoc::ToRtf", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Perldoc::ToTerm", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Perldoc::ToText", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Perldoc::ToTk", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Perldoc::ToXml", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "280", + "0" + ], + "version": "3.28" + }, + { + "feature": "Pod::Simple", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::BlackBox", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::Checker", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::Debug", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::DumpAsText", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::DumpAsXML", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::HTML", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::HTMLBatch", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::HTMLLegacy", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "10", + "0" + ], + "version": "5.01" + }, + { + "feature": "Pod::Simple::LinkSection", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::Methody", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::Progress", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::PullParser", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::PullParserEndToken", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::PullParserStartToken", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::PullParserTextToken", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::PullParserToken", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::RTF", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::Search", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::SimpleTree", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::Text", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::TextContent", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::TiedOutFH", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::Transcode", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::TranscodeDumb", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::TranscodeSmart", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::XHTML", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Simple::XMLOutStream", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "400", + "0" + ], + "version": "3.40" + }, + { + "feature": "Pod::Text", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "4", + "140", + "0" + ], + "version": "4.14" + }, + { + "feature": "Pod::Text::Color", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "4", + "140", + "0" + ], + "version": "4.14" + }, + { + "feature": "Pod::Text::Overstrike", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "4", + "140", + "0" + ], + "version": "4.14" + }, + { + "feature": "Pod::Text::Termcap", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "4", + "140", + "0" + ], + "version": "4.14" + }, + { + "feature": "Pod::Usage", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "690", + "0" + ], + "version": "1.69" + }, + { + "feature": "SDBM_File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "150", + "0" + ], + "version": "1.15" + }, + { + "feature": "Safe", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "410", + "0" + ], + "version": "2.41" + }, + { + "feature": "Scalar::Util", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "550", + "0" + ], + "version": "1.55" + }, + { + "feature": "Search::Dict", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "70", + "0" + ], + "version": "1.07" + }, + { + "feature": "SelectSaver", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "20", + "0" + ], + "version": "1.02" + }, + { + "feature": "SelfLoader", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "260", + "0" + ], + "version": "1.26" + }, + { + "feature": "Socket", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "29", + "0" + ], + "version": "2.029" + }, + { + "feature": "Storable", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "210", + "0" + ], + "version": "3.21" + }, + { + "feature": "Sub::Util", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "550", + "0" + ], + "version": "1.55" + }, + { + "feature": "Symbol", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "80", + "0" + ], + "version": "1.08" + }, + { + "feature": "Sys::Hostname", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "230", + "0" + ], + "version": "1.23" + }, + { + "feature": "Sys::Syslog", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "360", + "0" + ], + "version": "0.36" + }, + { + "feature": "TAP::Base", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Formatter::Base", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Formatter::Color", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Formatter::Console", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Formatter::Console::ParallelSession", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Formatter::Console::Session", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Formatter::File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Formatter::File::Session", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Formatter::Session", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Harness", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Harness::Env", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Object", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Aggregator", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Grammar", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Iterator", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Iterator::Array", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Iterator::Process", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Iterator::Stream", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::IteratorFactory", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Multiplexer", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Result", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Result::Bailout", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Result::Comment", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Result::Plan", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Result::Pragma", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Result::Test", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Result::Unknown", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Result::Version", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Result::YAML", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::ResultFactory", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Scheduler", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Scheduler::Job", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Scheduler::Spinner", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::Source", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::SourceHandler", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::SourceHandler::Executable", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::SourceHandler::File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::SourceHandler::Handle", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::SourceHandler::Perl", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::SourceHandler::RawTAP", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::YAMLish::Reader", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "TAP::Parser::YAMLish::Writer", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "Term::ANSIColor", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "10", + "0" + ], + "version": "5.01" + }, + { + "feature": "Term::Cap", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "170", + "0" + ], + "version": "1.17" + }, + { + "feature": "Term::Complete", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "403", + "0" + ], + "version": "1.403" + }, + { + "feature": "Term::ReadLine", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "170", + "0" + ], + "version": "1.17" + }, + { + "feature": "Test", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "310", + "0" + ], + "version": "1.31" + }, + { + "feature": "Test2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::API", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::API::Breakage", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::API::Context", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::API::Instance", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::API::Stack", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Bail", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Diag", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Encoding", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Exception", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Fail", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Generic", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Note", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Ok", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Pass", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Plan", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Skip", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Subtest", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::TAP::Version", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::V2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Event::Waiting", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::About", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Amnesty", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Assert", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Control", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Error", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Hub", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Info", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Info::Table", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Meta", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Parent", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Plan", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Render", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::EventFacet::Trace", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Formatter", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Formatter::TAP", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Hub", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Hub::Interceptor", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Hub::Interceptor::Terminator", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Hub::Subtest", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::IPC", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::IPC::Driver", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::IPC::Driver::Files", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Tools::Tiny", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Util", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Util::ExternalMeta", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Util::Facets2Legacy", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Util::HashBase", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test2::Util::Trace", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Builder", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Builder::Formatter", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Builder::IO::Scalar", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "114", + "0" + ], + "version": "2.114" + }, + { + "feature": "Test::Builder::Module", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Builder::Tester", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Builder::Tester::Color", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Builder::TodoDiag", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Harness", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "420", + "0" + ], + "version": "3.42" + }, + { + "feature": "Test::More", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Simple", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Tester", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Tester::Capture", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Tester::CaptureRunner", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::Tester::Delegate", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Test::use::ok", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "Text::Abbrev", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "20", + "0" + ], + "version": "1.02" + }, + { + "feature": "Text::Balanced", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "30", + "0" + ], + "version": "2.03" + }, + { + "feature": "Text::ParseWords", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "300", + "0" + ], + "version": "3.30" + }, + { + "feature": "Text::Tabs", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2013", + "52", + "300" + ], + "version": "2013.0523" + }, + { + "feature": "Text::Wrap", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2013", + "52", + "300" + ], + "version": "2013.0523" + }, + { + "feature": "Thread", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "50", + "0" + ], + "version": "3.05" + }, + { + "feature": "Thread::Queue", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "140", + "0" + ], + "version": "3.14" + }, + { + "feature": "Thread::Semaphore", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "130", + "0" + ], + "version": "2.13" + }, + { + "feature": "Tie::Array", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "70", + "0" + ], + "version": "1.07" + }, + { + "feature": "Tie::File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "60", + "0" + ], + "version": "1.06" + }, + { + "feature": "Tie::Handle", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "4", + "200", + "0" + ], + "version": "4.2" + }, + { + "feature": "Tie::Hash", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "50", + "0" + ], + "version": "1.05" + }, + { + "feature": "Tie::Hash::NamedCapture", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "130", + "0" + ], + "version": "0.13" + }, + { + "feature": "Tie::Memoize", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "100", + "0" + ], + "version": "1.1" + }, + { + "feature": "Tie::RefHash", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "390", + "0" + ], + "version": "1.39" + }, + { + "feature": "Tie::Scalar", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "50", + "0" + ], + "version": "1.05" + }, + { + "feature": "Tie::StdHandle", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "4", + "600", + "0" + ], + "version": "4.6" + }, + { + "feature": "Tie::SubstrHash", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "0", + "0" + ], + "version": "1.0" + }, + { + "feature": "Time::HiRes", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "976", + "400" + ], + "version": "1.9764" + }, + { + "feature": "Time::Local", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "280", + "0" + ], + "version": "1.28" + }, + { + "feature": "Time::Piece", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "340", + "100" + ], + "version": "1.3401" + }, + { + "feature": "Time::Seconds", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "340", + "100" + ], + "version": "1.3401" + }, + { + "feature": "Time::gmtime", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "40", + "0" + ], + "version": "1.04" + }, + { + "feature": "Time::localtime", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "Time::tm", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "0", + "0" + ], + "version": "1.0" + }, + { + "feature": "UNIVERSAL", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "130", + "0" + ], + "version": "1.13" + }, + { + "feature": "Unicode", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "13", + "0", + "0" + ], + "version": "13.0.0" + }, + { + "feature": "Unicode::Collate", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "270", + "0" + ], + "version": "1.27" + }, + { + "feature": "Unicode::Collate::CJK::Big5", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "270", + "0" + ], + "version": "1.27" + }, + { + "feature": "Unicode::Collate::CJK::GB2312", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "270", + "0" + ], + "version": "1.27" + }, + { + "feature": "Unicode::Collate::CJK::JISX0208", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "270", + "0" + ], + "version": "1.27" + }, + { + "feature": "Unicode::Collate::CJK::Korean", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "270", + "0" + ], + "version": "1.27" + }, + { + "feature": "Unicode::Collate::CJK::Pinyin", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "270", + "0" + ], + "version": "1.27" + }, + { + "feature": "Unicode::Collate::CJK::Stroke", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "270", + "0" + ], + "version": "1.27" + }, + { + "feature": "Unicode::Collate::CJK::Zhuyin", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "270", + "0" + ], + "version": "1.27" + }, + { + "feature": "Unicode::Collate::Locale", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "270", + "0" + ], + "version": "1.27" + }, + { + "feature": "Unicode::Normalize", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "270", + "0" + ], + "version": "1.27" + }, + { + "feature": "Unicode::UCD", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "750", + "0" + ], + "version": "0.75" + }, + { + "feature": "User::grent", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "User::pwent", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "10", + "0" + ], + "version": "1.01" + }, + { + "feature": "VMS::DCLsym", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "90", + "0" + ], + "version": "1.09" + }, + { + "feature": "VMS::Filespec", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "120", + "0" + ], + "version": "1.12" + }, + { + "feature": "VMS::Stdio", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "450", + "0" + ], + "version": "2.45" + }, + { + "feature": "Win32", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "530", + "0" + ], + "version": "0.53" + }, + { + "feature": "Win32API::File", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "120", + "301" + ], + "version": "0.1203_01" + }, + { + "feature": "Win32API::File::inc::ExtUtils::Myconst2perl", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "0", + "0" + ], + "version": "1" + }, + { + "feature": "Win32CORE", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "40", + "0" + ], + "version": "0.04" + }, + { + "feature": "XS::APItest", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "90", + "0" + ], + "version": "1.09" + }, + { + "feature": "XS::Typemap", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "170", + "0" + ], + "version": "0.17" + }, + { + "feature": "XSLoader", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "300", + "0" + ], + "version": "0.30" + }, + { + "feature": "_charnames", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "480", + "0" + ], + "version": "1.48" + }, + { + "feature": "attributes", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "330", + "0" + ], + "version": "0.33" + }, + { + "feature": "autodie", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "320", + "0" + ], + "version": "2.32" + }, + { + "feature": "autodie::Scope::Guard", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "320", + "0" + ], + "version": "2.32" + }, + { + "feature": "autodie::Scope::GuardStack", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "320", + "0" + ], + "version": "2.32" + }, + { + "feature": "autodie::Util", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "320", + "0" + ], + "version": "2.32" + }, + { + "feature": "autodie::exception", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "320", + "0" + ], + "version": "2.32" + }, + { + "feature": "autodie::exception::system", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "320", + "0" + ], + "version": "2.32" + }, + { + "feature": "autodie::hints", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "320", + "0" + ], + "version": "2.32" + }, + { + "feature": "autodie::skip", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "320", + "0" + ], + "version": "2.32" + }, + { + "feature": "autouse", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "110", + "0" + ], + "version": "1.11" + }, + { + "feature": "base", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "270", + "0" + ], + "version": "2.27" + }, + { + "feature": "bigint", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "510", + "0" + ], + "version": "0.51" + }, + { + "feature": "bignum", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "510", + "0" + ], + "version": "0.51" + }, + { + "feature": "bigrat", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "510", + "0" + ], + "version": "0.51" + }, + { + "feature": "blib", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "70", + "0" + ], + "version": "1.07" + }, + { + "feature": "bytes", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "70", + "0" + ], + "version": "1.07" + }, + { + "feature": "charnames", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "480", + "0" + ], + "version": "1.48" + }, + { + "feature": "constant", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "330", + "0" + ], + "version": "1.33" + }, + { + "feature": "deprecate", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "40", + "0" + ], + "version": "0.04" + }, + { + "feature": "diagnostics", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "370", + "0" + ], + "version": "1.37" + }, + { + "feature": "encoding", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "3", + "0", + "0" + ], + "version": "3.00" + }, + { + "feature": "encoding::warnings", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "130", + "0" + ], + "version": "0.13" + }, + { + "feature": "experimental", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "20", + "0" + ], + "version": "0.020" + }, + { + "feature": "feature", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "580", + "0" + ], + "version": "1.58" + }, + { + "feature": "fields", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "240", + "0" + ], + "version": "2.24" + }, + { + "feature": "filetest", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "if", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "60", + "800" + ], + "version": "0.0608" + }, + { + "feature": "integer", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "10", + "0" + ], + "version": "1.01" + }, + { + "feature": "less", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "30", + "0" + ], + "version": "0.03" + }, + { + "feature": "lib", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "650", + "0" + ], + "version": "0.65" + }, + { + "feature": "locale", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "90", + "0" + ], + "version": "1.09" + }, + { + "feature": "mro", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "230", + "0" + ], + "version": "1.23" + }, + { + "feature": "ok", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "302", + "175" + ], + "version": "1.302175" + }, + { + "feature": "open", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "120", + "0" + ], + "version": "1.12" + }, + { + "feature": "ops", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "20", + "0" + ], + "version": "1.02" + }, + { + "feature": "overload", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "310", + "0" + ], + "version": "1.31" + }, + { + "feature": "overloading", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "20", + "0" + ], + "version": "0.02" + }, + { + "feature": "parent", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "238", + "0" + ], + "version": "0.238" + }, + { + "feature": "perlfaq", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "5", + "202", + "5", + "230" + ], + "version": "5.20200523" + }, + { + "feature": "re", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "400", + "0" + ], + "version": "0.40" + }, + { + "feature": "sigtrap", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "90", + "0" + ], + "version": "1.09" + }, + { + "feature": "sort", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "40", + "0" + ], + "version": "2.04" + }, + { + "feature": "strict", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "110", + "0" + ], + "version": "1.11" + }, + { + "feature": "subs", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "30", + "0" + ], + "version": "1.03" + }, + { + "feature": "threads", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "2", + "250", + "0" + ], + "version": "2.25" + }, + { + "feature": "threads::shared", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "610", + "0" + ], + "version": "1.61" + }, + { + "feature": "utf8", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "220", + "0" + ], + "version": "1.22" + }, + { + "feature": "vars", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "50", + "0" + ], + "version": "1.05" + }, + { + "feature": "version", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "992", + "400" + ], + "version": "0.9924" + }, + { + "feature": "version::regex", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "0", + "992", + "400" + ], + "version": "0.9924" + }, + { + "feature": "vmsish", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "40", + "0" + ], + "version": "1.04" + }, + { + "feature": "warnings", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "470", + "0" + ], + "version": "1.47" + }, + { + "feature": "warnings::register", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/perl", + "sortable_version": [ + "1", + "40", + "0" + ], + "version": "1.04" + } + ], + "author_platform_user_id": "fe7c9294-51d6-4df6-a5b5-44cf5a924ebc", + "comment": "Bump again", + "is_stable_revision": true + }, + "patches": null, + "resolved_requirements": [ + { + "feature": "perl", + "namespace": "language", + "version_requirements": [ + { + "comparator": "eq", + "version": "5.32.0" + } + ] + } + ] + } + ], + "solver_version": 1 +} diff --git a/pkg/platform/runtime/testhelper/data/recipes/camel.json b/pkg/platform/runtime/testhelper/data/recipes/camel.json new file mode 100644 index 0000000000..f3f6ee1ef8 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/recipes/camel.json @@ -0,0 +1,3137 @@ +{ + "camel_flags": [], + "from_recipe_store": false, + "image": { + "image_id": "4b8b53b0-609b-4a02-865a-0fb2974f9952", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/images/4b8b53b0-609b-4a02-865a-0fb2974f9952" + }, + "name": "macos1013-camel-builder", + "platform_id": "96b7e6f2-bebf-564c-bc1c-f04482398f38", + "type": "Mac", + "sortable_version": [ + "4", + "0" + ], + "version": "4", + "provided_features": [], + "author_platform_user_id": "e501c7e7-40cc-4b7a-8fc9-f6a3d314c254", + "comment": "Added a new revision to add compiler features to images", + "is_stable_revision": true, + "conditions": [ + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "status": "stable", + "revision": 5, + "revision_timestamp": "2020-12-03T22:54:45.160370Z" + }, + "is_indemnified": false, + "platform": { + "cpu_architecture": { + "cpu_architecture_id": "4cdba18d-0851-4925-9ae5-9c8a2987828a", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/cpu-architectures/4cdba18d-0851-4925-9ae5-9c8a2987828a" + }, + "bit_width": "64", + "name": "x86", + "provided_features": [ + { + "feature": "x86 64-bit", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "cpu-architecture", + "sortable_version": [ + "1", + "0" + ], + "version": "1" + } + ], + "author_platform_user_id": "7f320133-2c9a-476e-9c09-8970ac525a8f", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true, + "revision": 1, + "revision_timestamp": "2019-08-06T21:46:35.288458Z" + }, + "cpu_extensions": [], + "creation_timestamp": "2019-08-06T21:46:35.288458Z", + "display_name": "macOS 10.12.6, Darwin 16.6.0, libSystem 1238.60.2 x86 64-bit", + "end_of_support_date": "2030-02-03", + "images": [ + { + "image_id": "4b8b53b0-609b-4a02-865a-0fb2974f9952", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/images/4b8b53b0-609b-4a02-865a-0fb2974f9952" + }, + "name": "macos1013-camel-builder", + "platform_id": "96b7e6f2-bebf-564c-bc1c-f04482398f38", + "type": "Mac", + "sortable_version": [ + "4", + "0" + ], + "version": "4", + "provided_features": [ + { + "feature": "clang", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "1000", + "10", + "44", + "4", + "0" + ], + "version": "1000.10.44.4" + }, + { + "feature": "ISO C++03", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++11", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++14", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++17", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C89", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C++98", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + }, + { + "feature": "ISO C99", + "is_activestate_version": true, + "is_default_provider": true, + "namespace": "compiler", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "author_platform_user_id": "e501c7e7-40cc-4b7a-8fc9-f6a3d314c254", + "comment": "Added a new revision to add compiler features to images", + "is_stable_revision": true, + "conditions": [ + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "status": "stable", + "revision": 5, + "revision_timestamp": "2020-12-03T22:54:45.160370Z" + } + ], + "is_user_visible": true, + "kernel": { + "kernel_id": "7d600f8a-bc24-4875-a09c-8e63c4da078c", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/7d600f8a-bc24-4875-a09c-8e63c4da078c" + }, + "name": "Darwin" + }, + "kernel_version": { + "kernel_version_id": "e7d8c941-4dfd-49fe-81f7-5bb90df0edd9", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/7d600f8a-bc24-4875-a09c-8e63c4da078c/versions/e7d8c941-4dfd-49fe-81f7-5bb90df0edd9" + }, + "sortable_version": [ + "16", + "6", + "0", + "0" + ], + "version": "16.6.0", + "provided_features": [ + { + "feature": "Darwin", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "kernel", + "sortable_version": [ + "16", + "6", + "0", + "0" + ], + "version": "16.6.0" + } + ], + "author_platform_user_id": "7f320133-2c9a-476e-9c09-8970ac525a8f", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true, + "revision": 1, + "revision_timestamp": "2019-08-06T21:46:35.288458Z" + }, + "libc": { + "libc_id": "669bbbe3-1f57-48d3-a11e-018780809b4a", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/669bbbe3-1f57-48d3-a11e-018780809b4a" + }, + "name": "libSystem" + }, + "libc_version": { + "libc_version_id": "6e0f402c-3837-4d73-a36c-9cd4ace9d002", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/669bbbe3-1f57-48d3-a11e-018780809b4a/versions/6e0f402c-3837-4d73-a36c-9cd4ace9d002" + }, + "sortable_version": [ + "1238", + "60", + "2", + "0" + ], + "version": "1238.60.2", + "provided_features": [ + { + "feature": "libSystem", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "libc", + "sortable_version": [ + "1238", + "60", + "2", + "0" + ], + "version": "1238.60.2" + } + ], + "author_platform_user_id": "7f320133-2c9a-476e-9c09-8970ac525a8f", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true, + "revision": 1, + "revision_timestamp": "2019-08-06T21:46:35.288458Z" + }, + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/platforms/96b7e6f2-bebf-564c-bc1c-f04482398f38" + }, + "operating_system": { + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/63d8f1cc-5f5c-47e1-bab0-74d38938d919" + }, + "operating_system_id": "63d8f1cc-5f5c-47e1-bab0-74d38938d919", + "has_libc": true, + "name": "macOS" + }, + "operating_system_version": { + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/63d8f1cc-5f5c-47e1-bab0-74d38938d919/versions/da15b51d-12d8-484d-8006-cc5f93198817" + }, + "operating_system_version_id": "da15b51d-12d8-484d-8006-cc5f93198817", + "sortable_version": [ + "10", + "12", + "6", + "0" + ], + "version": "10.12.6", + "provided_features": [ + { + "feature": "macOS", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "operating-system", + "sortable_version": [ + "10", + "12", + "6", + "0" + ], + "version": "10.12.6" + } + ], + "author_platform_user_id": "7f320133-2c9a-476e-9c09-8970ac525a8f", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true, + "revision": 1, + "revision_timestamp": "2019-08-06T21:46:35.288458Z" + }, + "platform_id": "96b7e6f2-bebf-564c-bc1c-f04482398f38" + }, + "recipe_id": "0adc81a2-760d-5577-9827-309c9c9c645f", + "resolved_ingredients": [ + { + "alternatives": [], + "artifact_id": "e8a2b6cc-19de-5b87-bb84-8ba67039aa79", + "build_scripts": null, + "dependencies": [], + "ingredient": { + "creation_timestamp": "2019-10-21T19:16:38.749062Z", + "ingredient_id": "20816534-c073-5d68-9eb7-11c1d6be09f5", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/20816534-c073-5d68-9eb7-11c1d6be09f5" + }, + "name": "camel", + "normalized_name": "camel", + "primary_namespace": "builder", + "description": "The camel unified build system", + "website": "https://platform.activestate.com" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2021-02-16T17:50:29.599906Z", + "ingredient_id": "20816534-c073-5d68-9eb7-11c1d6be09f5", + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/20816534-c073-5d68-9eb7-11c1d6be09f5/versions/c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/20816534-c073-5d68-9eb7-11c1d6be09f5" + }, + "revision": 1, + "revision_timestamp": "2021-02-16T17:50:29.599906Z", + "copyright_text": "Copyright © ActiveState Inc, 2004-2020", + "documentation_uri": "https://github.com/ActiveState/camel/tree/3d46a065883c88b560d67edf7ea1f96bef125ae6/docs", + "is_binary_only": false, + "license_expression": "UNLICENSED", + "release_timestamp": "2021-02-16T17:50:24.296928Z", + "source_uri": "https://github.com/ActiveState/camel/tree/3d46a065883c88b560d67edf7ea1f96bef125ae6", + "sortable_version": [ + "20210216", + "125023", + "3", + "100", + "46", + "97", + "65", + "0" + ], + "version": "20210216.125023.3d46a065", + "activestate_license_expression": "UNLICENSED", + "camel_extras": {}, + "dependencies": null, + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://INVALID", + "scanner_license_expression": "UNLICENSED", + "source_checksum": "3d46a065883c88b560d67edf7ea1f96bef125ae6", + "status": "stable", + "provided_features": [ + { + "feature": "camel", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "builder", + "sortable_version": [ + "20210216", + "125023", + "3", + "100", + "46", + "97", + "65", + "0" + ], + "version": "20210216.125023.3d46a065" + } + ], + "author_platform_user_id": "8fd0aa9c-0483-4ee7-9197-96c9194c0318", + "comment": "Camel commit.", + "is_stable_revision": true + }, + "patches": null, + "resolved_requirements": [] + }, + { + "alternatives": [], + "artifact_id": "bdd5642b-928c-5770-9e12-5816c9676960", + "build_scripts": null, + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "06b8597a-4cc1-5e3c-b548-f0baa7861688" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "3bde6cf9-2445-563f-8e65-1437d1737a8f" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "491568f3-50a4-56f6-a971-580eaa99715f" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "54cbf7c2-c87c-51b5-a2cc-72b3b284d68c" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "8d5d63b0-e941-59a3-8653-35470bd70056" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "a45dc564-3e7d-5b43-b2b3-2a941b0f5807" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "a61c1442-98a0-576c-b606-3046b22c3413" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "b0d9a189-aedb-5461-b872-5e643ac97551" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c3b7c513-8be8-56d9-8d30-b19e9c56e393" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T17:06:08.287941Z", + "ingredient_id": "161a6a17-6b8a-54c9-a476-2c8c960b054e", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/161a6a17-6b8a-54c9-a476-2c8c960b054e" + }, + "name": "python", + "normalized_name": "python", + "primary_namespace": "language", + "description": "It's just a flesh wound!" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2019-10-01T17:06:08.287941Z", + "ingredient_id": "161a6a17-6b8a-54c9-a476-2c8c960b054e", + "ingredient_version_id": "be4744a4-89a6-58bb-b345-d15468657076", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/161a6a17-6b8a-54c9-a476-2c8c960b054e/versions/be4744a4-89a6-58bb-b345-d15468657076", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/161a6a17-6b8a-54c9-a476-2c8c960b054e" + }, + "revision": 13, + "revision_timestamp": "2020-12-08T19:15:07.163109Z", + "copyright_text": "To be added.", + "is_binary_only": false, + "license_expression": "Unknown", + "release_timestamp": "1970-01-01T00:00:00.000000Z", + "source_uri": "https://s3.amazonaws.com/camel-sources/src/ActivePython/vendor/Python-3.7.4.tgz", + "sortable_version": [ + "0", + "3", + "7", + "4", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "3.7.4", + "activestate_license_expression": "unknown", + "camel_extras": {}, + "dependencies": [ + { + "conditions": [ + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "feature": "windows-python-core-openssl", + "namespace": "language/python", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "Linux", + "namespace": "kernel", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "feature": "lzma", + "namespace": "shared", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [ + "5", + "2", + "4", + "0" + ], + "version": "5.2.4" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "tk", + "namespace": "shared", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [ + "8", + "6", + "8", + "0" + ], + "version": "8.6.8" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "AIX", + "namespace": "kernel", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + }, + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "sqlite3", + "namespace": "shared", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [ + "3", + "15", + "2", + "0" + ], + "version": "3.15.2" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "bzip2", + "namespace": "shared", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [ + "1", + "0", + "6", + "0" + ], + "version": "1.0.6" + } + ], + "type": "build" + }, + { + "conditions": null, + "description": "All ingredients have a build-time dependency on the camel build system", + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "expat", + "namespace": "shared", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "2", + "2", + "7", + "0" + ], + "version": "2.2.7" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "tix", + "namespace": "shared", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "8", + "4", + "3", + "0" + ], + "version": "8.4.3" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0.0", + "0.0" + ], + "version": "0" + } + ] + } + ], + "description": "The python language requires a compiler to build", + "feature": "Visual Studio", + "namespace": "compiler", + "requirements": [ + { + "comparator": "lt", + "sortable_version": [ + "15.0", + "0.0" + ], + "version": "15" + }, + { + "comparator": "gte", + "sortable_version": [ + "14.0", + "0.0" + ], + "version": "14" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "tcl", + "namespace": "shared", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [ + "8", + "6", + "8", + "0" + ], + "version": "8.6.8" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "openssl", + "namespace": "shared", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "1", + "11", + "0", + "0", + "0" + ], + "version": "1.11.0.0" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "zlib", + "namespace": "shared", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [ + "1", + "2", + "11", + "0" + ], + "version": "1.2.11" + } + ], + "type": "build" + }, + { + "conditions": null, + "description": "The python language requires a compiler to build", + "feature": "ISO C89", + "namespace": "compiler", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0.0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "Windows", + "namespace": "kernel", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "bsddb", + "namespace": "shared", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [ + "4", + "4", + "20", + "0" + ], + "version": "4.4.20" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/languages/d63e63e14e6d29e17490abbe6f7d17afb3db182dbd801229f14e55f4157c4ba3/Python-3.7.4.tgz", + "scanner_license_expression": "unknown", + "source_checksum": "d63e63e14e6d29e17490abbe6f7d17afb3db182dbd801229f14e55f4157c4ba3", + "status": "stable", + "provided_features": [ + { + "feature": "python", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language", + "sortable_version": [ + "0", + "3", + "7", + "4", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "3.7.4" + }, + { + "feature": "pip", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/python", + "sortable_version": [ + "0", + "18", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "18.0" + }, + { + "feature": "setuptools", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/python", + "sortable_version": [ + "0", + "40", + "8", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "40.8.0" + } + ], + "author_platform_user_id": "ddfb4cc7-4a50-45a5-a6a5-1336b3ad1ef2", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true + }, + "patches": [ + { + "creation_timestamp": "2020-08-31T18:14:54.204215Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/8869b8cc-11d5-43cf-8d4d-0c93ada5dba3" + }, + "patch_id": "8869b8cc-11d5-43cf-8d4d-0c93ada5dba3", + "conditions": null, + "content": "s3://platform-sources/patches/7ddd664c4f000ae9c38e8730add4cd501514439c400ae3b78f76d68be2881c47.patch", + "description": "From 6299dd58bb662ebd801d6d86f82ade7f533b692b Mon Sep 17 00:00:00 2001\nFrom: Ashley Whetter \nDate: Thu, 2 Jan 2020 08:57:44 -0800\nSubject: [PATCH] v3.7.4 patched from apy/3.7/*\n\nd057759576 activepython: Merge tag 'v3.7.4' into apy/3.7/activepython\n839b605c44 activepython: Add changes needed for V3.7\nd057759576 nix: Merge tag 'v3.7.4' into apy/3.7/activepython\n839b605c44 nix: Add changes needed for V3.7\n738a9121c4 win32: Compile openssl from source and build against it\n78c745359f win32: Revert \"Support downloading externals directly from cpython-bin-deps\"\n16ebbdc015 win32: Support downloading externals directly from cpython-bin-deps\n04e6fc4fcf win32: Can override version of openssl\n54d8f0462c win32: Support downloading externals directly from cpython-source-deps\nd2745843cf win32: Build against OpenSSL sources\n9309e799e8 win32: bump versions for tcl, tk, openssl and remove commands that are no longer used\nddf9c43ece win32: Merge branch 'apy/3.7/activepython' into apy/3.7/win32\nd057759576 win32: Merge tag 'v3.7.4' into apy/3.7/activepython\n839b605c44 win32: Add changes needed for V3.7\n7b3d6b9d7e win32: Update OpenSSL to 1.1.0k\n5b9627c322 win32: Add tcl 8.6.8 and openssl 1.1.0j to 3.7\n69570872c7 win32: Upgrade sqlite3 to 3.24.0.0\n0de3cf0acd win32: Set tcltk and openssl bins\n1ce01cc66a win32: Remove bin from openssl tarball name\nbaa340b145 win32: Add zlib to list of files to get for Windows\n81257a43c7 win32: Add AS specific build scripts for building", + "sequence_number": 1 + }, + { + "creation_timestamp": "2020-08-31T18:14:54.492940Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/80bef92b-2971-49b3-b5c5-448230d0675e" + }, + "patch_id": "80bef92b-2971-49b3-b5c5-448230d0675e", + "conditions": null, + "content": "python-3.7.4-python.props.patch", + "description": "HEAD~1 patched from activepython/3.7/*", + "sequence_number": 2 + } + ], + "resolved_requirements": [ + { + "feature": "python", + "namespace": "language", + "version_requirements": [ + { + "comparator": "eq", + "version": "3.7.4" + } + ] + } + ] + }, + { + "alternatives": [], + "artifact_id": "decfc04f-5770-5663-8d00-e029402e6917", + "build_scripts": null, + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "806b06ad-3f32-52e1-aecb-677759ce8c74" + }, + { + "dependency_types": [ + "build", + "runtime", + "test" + ], + "ingredient_version_id": "be4744a4-89a6-58bb-b345-d15468657076" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2020-10-18T02:02:00.611863Z", + "ingredient_id": "39750e64-e0bf-5a97-9caa-d6ec8ec8c456", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/39750e64-e0bf-5a97-9caa-d6ec8ec8c456" + }, + "name": "json2", + "normalized_name": "json2", + "primary_namespace": "language/python", + "description": "# Logfast\n\n## Purpose\nPython package which just wraps the default python json but with.\n```json2.load_file``` and ```json2.save_file```\n\n## Installation\n\n```pip install json2```\n\n## Usage\n\n```\nimport ...", + "website": "https://github.com/ThoenigAdrian/json2" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2020-10-23T02:19:24.740864Z", + "ingredient_id": "39750e64-e0bf-5a97-9caa-d6ec8ec8c456", + "ingredient_version_id": "a30e7169-d1b8-5f34-b50b-6be74d369e9c", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/39750e64-e0bf-5a97-9caa-d6ec8ec8c456/versions/a30e7169-d1b8-5f34-b50b-6be74d369e9c", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/39750e64-e0bf-5a97-9caa-d6ec8ec8c456" + }, + "revision": 1, + "revision_timestamp": "2020-10-23T02:19:24.740864Z", + "copyright_text": "Could not be determined", + "is_binary_only": false, + "license_expression": "UNKNOWN", + "release_timestamp": "2020-10-18T21:56:38.000000Z", + "source_uri": "https://files.pythonhosted.org/packages/91/2a/ec4045f29cacf6eb06c8b7577ce783149d5ec0349c2959937fe867124cfa/json2-0.4.0.tar.gz", + "sortable_version": [ + "0", + "0", + "4", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "0.4.0", + "activestate_license_expression": "unknown", + "camel_extras": {}, + "dependencies": [ + { + "conditions": null, + "description": "Extracted from source distribution in PyPI.", + "feature": "wheel", + "namespace": "language/python", + "original_requirement": "wheel", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": null, + "description": "Extracted from source distribution in PyPI.", + "feature": "python", + "namespace": "language", + "original_requirement": "python >=0", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "0" + } + ], + "type": "runtime" + }, + { + "conditions": null, + "description": "Extracted from source distribution in PyPI.", + "feature": "python", + "namespace": "language", + "original_requirement": "python >=0", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": null, + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": null, + "description": "Extracted from source distribution in PyPI.", + "feature": "python", + "namespace": "language", + "original_requirement": "python >=0", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "0" + } + ], + "type": "test" + } + ], + "ingredient_options": null, + "is_indemnified": false, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/data-acquisition/eab80bdfcc30fd0ee934c3c67a959d76ea1a45a629c4c10cdf6f8078c6224fc8/json2-0.4.0.tar.gz", + "scanner_license_expression": "unknown", + "source_checksum": "eab80bdfcc30fd0ee934c3c67a959d76ea1a45a629c4c10cdf6f8078c6224fc8", + "status": "stable", + "provided_features": [ + { + "feature": "json2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/python", + "sortable_version": [ + "0", + "0", + "4", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "0.4.0" + } + ], + "author_platform_user_id": "2e044215-1b51-498f-a440-ae0cc11bdd4c", + "comment": "Data Acquisition import run with commit ID abef5908904fe908ad93c6140e56044dd4b47f72 and reason: Automated sync of newly whitelisted language/python ingredient versions", + "is_stable_revision": true + }, + "patches": null, + "resolved_requirements": [ + { + "feature": "json2", + "namespace": "language/python", + "version_requirements": null + } + ] + }, + { + "alternatives": [], + "artifact_id": "e6997088-7854-5498-8c57-afbe4343036a", + "build_scripts": null, + "dependencies": [ + { + "dependency_types": [ + "build", + "runtime", + "test" + ], + "ingredient_version_id": "be4744a4-89a6-58bb-b345-d15468657076" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T17:08:07.349831Z", + "ingredient_id": "9d592341-b78d-5e0f-b7ee-83b4533441b2", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9d592341-b78d-5e0f-b7ee-83b4533441b2" + }, + "name": "wheel", + "normalized_name": "wheel", + "primary_namespace": "language/python", + "description": "The wheel package" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2020-11-13T23:46:48.685681Z", + "ingredient_id": "9d592341-b78d-5e0f-b7ee-83b4533441b2", + "ingredient_version_id": "806b06ad-3f32-52e1-aecb-677759ce8c74", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9d592341-b78d-5e0f-b7ee-83b4533441b2/versions/806b06ad-3f32-52e1-aecb-677759ce8c74", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9d592341-b78d-5e0f-b7ee-83b4533441b2" + }, + "revision": 3, + "revision_timestamp": "2020-11-20T23:08:03.168261Z", + "copyright_text": "Could not be determined", + "is_binary_only": false, + "license_expression": "UNKNOWN", + "release_timestamp": "2020-08-15T02:23:59.000000Z", + "source_uri": "https://files.pythonhosted.org/packages/83/72/611c121b6bd15479cb62f1a425b2e3372e121b324228df28e64cc28b01c2/wheel-0.35.1.tar.gz", + "sortable_version": [ + "0", + "0", + "35", + "1", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "0.35.1", + "activestate_license_expression": "unknown", + "camel_extras": {}, + "dependencies": [ + { + "conditions": null, + "description": "Extracted from source distribution in PyPI.", + "feature": "python", + "namespace": "language", + "original_requirement": "python >=0", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "3", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "3" + } + ], + "type": "runtime" + }, + { + "conditions": null, + "description": "Extracted from source distribution in PyPI.", + "feature": "python", + "namespace": "language", + "original_requirement": "python >=0", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "3", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "3" + } + ], + "type": "test" + }, + { + "conditions": null, + "description": "Extracted from source distribution in PyPI.", + "feature": "python", + "namespace": "language", + "original_requirement": "python >=0", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "3", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "3" + } + ], + "type": "build" + }, + { + "conditions": null, + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": false, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/data-acquisition/99a22d87add3f634ff917310a3d87e499f19e663413a52eb9232c447aa646c9f/wheel-0.35.1.tar.gz", + "scanner_license_expression": "unknown", + "source_checksum": "99a22d87add3f634ff917310a3d87e499f19e663413a52eb9232c447aa646c9f", + "status": "stable", + "provided_features": [ + { + "feature": "wheel", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "language/python", + "sortable_version": [ + "0", + "0", + "35", + "1", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "version": "0.35.1" + } + ], + "author_platform_user_id": "e51a58da-d22b-49c2-9fe6-f143159120eb", + "comment": "Data Acquisition import run with commit ID 0000000000000000000000000000000000000000 and reason: Could not be determined from the database query", + "is_stable_revision": true + }, + "patches": null, + "resolved_requirements": [] + }, + { + "alternatives": [], + "artifact_id": "2a2dc52f-8324-59bf-ae5e-082ea2468a28", + "build_scripts": [ + { + "build_script_id": "e00c71e5-6c74-487b-a67f-6a120e17f068", + "creation_timestamp": "2019-10-01T17:01:14.537345Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/e00c71e5-6c74-487b-a67f-6a120e17f068" + }, + "conditions": null, + "language": "perl", + "script": "db-4.4.20-AS-Makefile.PL" + } + ], + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T17:01:14.890567Z", + "ingredient_id": "5a6e935d-3fb3-5629-a4cf-34e78b035e5f", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/5a6e935d-3fb3-5629-a4cf-34e78b035e5f" + }, + "name": "bsddb", + "normalized_name": "bsddb", + "primary_namespace": "shared", + "description": "Berkeley Database" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2019-10-01T17:01:14.890567Z", + "ingredient_id": "5a6e935d-3fb3-5629-a4cf-34e78b035e5f", + "ingredient_version_id": "06b8597a-4cc1-5e3c-b548-f0baa7861688", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/5a6e935d-3fb3-5629-a4cf-34e78b035e5f/versions/06b8597a-4cc1-5e3c-b548-f0baa7861688", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/5a6e935d-3fb3-5629-a4cf-34e78b035e5f" + }, + "revision": 2, + "revision_timestamp": "2019-10-24T21:51:00.179770Z", + "copyright_text": "To be added.", + "is_binary_only": false, + "license_expression": "Unknown", + "release_timestamp": "1970-01-01T00:00:00.000000Z", + "source_uri": "https://s3.amazonaws.com/camel-sources/src/vendor-sources/python/db-4.4.20.NC-pysvn.zip", + "sortable_version": [ + "4", + "4", + "20", + "0" + ], + "version": "4.4.20", + "activestate_license_expression": "unknown", + "camel_extras": { + "skip_test": "yes" + }, + "dependencies": [ + { + "conditions": null, + "description": "All ingredients have a build-time dependency on the camel build system", + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/shared/0732630da52af56e1d8a92a4a386405b5b13aa21715aa4e8d28da647c57affba/db-4.4.20.NC-pysvn.zip", + "scanner_license_expression": "unknown", + "source_checksum": "0732630da52af56e1d8a92a4a386405b5b13aa21715aa4e8d28da647c57affba", + "status": "stable", + "provided_features": [ + { + "feature": "bsddb", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "shared", + "sortable_version": [ + "4", + "4", + "20", + "0" + ], + "version": "4.4.20" + } + ], + "author_platform_user_id": "7f320133-2c9a-476e-9c09-8970ac525a8f", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true + }, + "patches": null, + "resolved_requirements": [] + }, + { + "alternatives": [], + "artifact_id": "f6f7099a-2a86-5a30-8098-a111661cfbc5", + "build_scripts": [ + { + "build_script_id": "9c94a935-e12a-4211-8c69-151cc0cea019", + "creation_timestamp": "2019-11-21T00:41:56.108670Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/9c94a935-e12a-4211-8c69-151cc0cea019" + }, + "conditions": null, + "language": "perl", + "script": "bzip2-1.0.6-AS-Makefile.PL" + } + ], + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T16:55:29.800792Z", + "ingredient_id": "c9621f15-45d3-5da0-849a-f2979aa8e0d5", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c9621f15-45d3-5da0-849a-f2979aa8e0d5" + }, + "name": "bzip2", + "normalized_name": "bzip2", + "primary_namespace": "shared", + "description": "bzip2 is a data compressor." + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2019-10-01T16:55:29.800792Z", + "ingredient_id": "c9621f15-45d3-5da0-849a-f2979aa8e0d5", + "ingredient_version_id": "3bde6cf9-2445-563f-8e65-1437d1737a8f", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c9621f15-45d3-5da0-849a-f2979aa8e0d5/versions/3bde6cf9-2445-563f-8e65-1437d1737a8f", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c9621f15-45d3-5da0-849a-f2979aa8e0d5" + }, + "revision": 5, + "revision_timestamp": "2020-09-16T16:53:25.145774Z", + "copyright_text": "To be added.", + "is_binary_only": false, + "license_expression": "Unknown", + "release_timestamp": "2018-11-03T00:00:00.000000Z", + "source_uri": "https://s3.amazonaws.com/camel-sources/src/vendor-sources/bzip2-1.0.6.tar.gz", + "sortable_version": [ + "1", + "0", + "6", + "0" + ], + "version": "1.0.6", + "activestate_license_expression": "unknown", + "camel_extras": { + "ppm_pkg": "no", + "skip_test": "yes" + }, + "dependencies": [ + { + "conditions": null, + "description": "All ingredients have a build-time dependency on the camel build system", + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/shared/a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd/bzip2-1.0.6.tar.gz", + "scanner_license_expression": "unknown", + "source_checksum": "a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd", + "status": "stable", + "provided_features": [ + { + "feature": "bzip2", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "shared", + "sortable_version": [ + "1", + "0", + "6", + "0" + ], + "version": "1.0.6" + } + ], + "author_platform_user_id": "a19a07b9-313a-4e8f-916b-633457d72be8", + "comment": "Convert patch content to S3 URI and add condition on camel builder", + "is_stable_revision": true + }, + "patches": [ + { + "creation_timestamp": "2020-09-16T16:53:24.890193Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/0e0735a7-c5cd-47ed-a599-e2c9475b37c8" + }, + "patch_id": "0e0735a7-c5cd-47ed-a599-e2c9475b37c8", + "conditions": [ + { + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "content": "s3://platform-sources/patches/Libraries/patches/bzip2-1.0.6-Makefile-install.patch", + "description": "Only install headers and lib, some of these paths broke on\n Windows. Add an MSVC install target.", + "sequence_number": 1 + } + ], + "resolved_requirements": [] + }, + { + "alternatives": [], + "artifact_id": "1931b61b-5e8b-5bce-a5ff-5663a0b9b9c3", + "build_scripts": [ + { + "build_script_id": "2bca6c96-626f-472b-a3e0-6fc2e19d5da1", + "creation_timestamp": "2021-01-11T17:46:35.461471Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/2bca6c96-626f-472b-a3e0-6fc2e19d5da1" + }, + "conditions": null, + "language": "perl", + "script": "s3://platform-sources/build_scripts/2dd5db9d3d82fffed2a682f960dc4bc4f41dcdbb62f4e83f4586c793452709f7/expat-2.2.9-AS-Makefile.PL" + } + ], + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T16:55:36.729403Z", + "ingredient_id": "005fec58-7763-5ccf-9fce-d35fa3bfd791", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/005fec58-7763-5ccf-9fce-d35fa3bfd791" + }, + "name": "expat", + "normalized_name": "expat", + "primary_namespace": "shared", + "description": "The expat package" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2019-11-05T00:40:36.179438Z", + "ingredient_id": "005fec58-7763-5ccf-9fce-d35fa3bfd791", + "ingredient_version_id": "a45dc564-3e7d-5b43-b2b3-2a941b0f5807", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/005fec58-7763-5ccf-9fce-d35fa3bfd791/versions/a45dc564-3e7d-5b43-b2b3-2a941b0f5807", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/005fec58-7763-5ccf-9fce-d35fa3bfd791" + }, + "revision": 11, + "revision_timestamp": "2021-01-11T17:46:36.186158Z", + "copyright_text": "To be added.", + "documentation_uri": "https://libexpat.github.io/doc/", + "is_binary_only": false, + "license_expression": "Unknown", + "release_timestamp": "2019-09-24T00:00:00.000000Z", + "source_uri": "https://github.com/libexpat/libexpat/archive/R_2_2_9.tar.gz", + "sortable_version": [ + "2", + "2", + "9", + "0" + ], + "version": "2.2.9", + "activestate_license_expression": "unknown", + "camel_extras": { + "skip_test": "yes" + }, + "dependencies": [ + { + "conditions": [ + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "feature": "autotools-builder", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/shared/4456e0aa72ecc7e1d4b3368cd545a5eec7f9de5133a8dc37fdb1efa6174c4947/expat-2.2.9.tar.gz", + "scanner_license_expression": "unknown", + "source_checksum": "4456e0aa72ecc7e1d4b3368cd545a5eec7f9de5133a8dc37fdb1efa6174c4947", + "status": "stable", + "provided_features": [ + { + "feature": "expat", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "shared", + "sortable_version": [ + "2", + "2", + "9", + "0" + ], + "version": "2.2.9" + } + ], + "author_platform_user_id": "8fd0aa9c-0483-4ee7-9197-96c9194c0318", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true + }, + "patches": [ + { + "creation_timestamp": "2021-01-11T17:46:35.593158Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/57c568bc-9f1e-4a0b-904d-cd41ba27cd05" + }, + "patch_id": "57c568bc-9f1e-4a0b-904d-cd41ba27cd05", + "conditions": [ + { + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "content": "s3://platform-sources/patches/239341623ebad1490c7f33ec81681f497c1e2f1ffe75e6810162e7c1e40757c7.patch", + "description": "expat ~ Add MSVC Makefile. Created for expat-2.2.9.", + "sequence_number": 1 + }, + { + "creation_timestamp": "2021-01-11T17:46:35.711198Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/a55c2d03-bae1-40f1-ae5b-fbb050c702fb" + }, + "patch_id": "a55c2d03-bae1-40f1-ae5b-fbb050c702fb", + "conditions": [ + { + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "content": "s3://platform-sources/patches/ac8dcdeb798a847dc56d29de262552e873ac88883e6630552a668997a9a64b4f.patch", + "description": "expat ~ Remove hidden flag for AIX. Created for expat-2.2.9.", + "sequence_number": 2 + }, + { + "creation_timestamp": "2021-01-11T17:46:35.846122Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/798eadbe-103f-422b-a761-938cbef16a5a" + }, + "patch_id": "798eadbe-103f-422b-a761-938cbef16a5a", + "conditions": [ + { + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "content": "s3://platform-sources/patches/00b3bb81c1032a8854cf469ac7208dc6e192bc0e0acfbe41677aca61a67ad457.patch", + "description": "expat ~ Update for C89. Created for expat-2.2.9", + "sequence_number": 3 + }, + { + "creation_timestamp": "2021-01-11T17:46:36.033025Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/586a3c05-b1a4-433a-a673-7b382c681906" + }, + "patch_id": "586a3c05-b1a4-433a-a673-7b382c681906", + "conditions": null, + "content": "s3://platform-sources/patches/92f35efe9d078a78bc8ab10b92649ed3f814a3242b91d83ebe1f36f4bdd0e9a4.patch", + "description": "expat ~ Fix tests trying to use wine when not cross-compiling", + "sequence_number": 4 + } + ], + "resolved_requirements": [] + }, + { + "alternatives": [], + "artifact_id": "fb916bb5-73f9-55f8-9a01-ad79a876e00c", + "build_scripts": [ + { + "build_script_id": "844336b4-e883-44c8-bf22-de11ddfbd482", + "creation_timestamp": "2020-10-29T19:15:40.719565Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/844336b4-e883-44c8-bf22-de11ddfbd482" + }, + "conditions": null, + "language": "perl", + "script": "s3://platform-sources/build_scripts/4432de517c9e851a7f7772843cb30f6dda380a5e330ce39f3169186421048566/openssl-1.1.1-AS-Makefile.PL" + } + ], + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T16:56:17.721017Z", + "ingredient_id": "c1256669-2a2d-5cf2-8860-804bf43ceb5f", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c1256669-2a2d-5cf2-8860-804bf43ceb5f" + }, + "name": "openssl", + "normalized_name": "openssl", + "primary_namespace": "shared", + "description": "Open Secure Sockets Layer general cryptography library." + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2020-06-16T06:27:06.148324Z", + "ingredient_id": "c1256669-2a2d-5cf2-8860-804bf43ceb5f", + "ingredient_version_id": "491568f3-50a4-56f6-a971-580eaa99715f", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c1256669-2a2d-5cf2-8860-804bf43ceb5f/versions/491568f3-50a4-56f6-a971-580eaa99715f", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c1256669-2a2d-5cf2-8860-804bf43ceb5f" + }, + "revision": 6, + "revision_timestamp": "2020-10-29T19:15:41.225634Z", + "copyright_text": "To be added.", + "is_binary_only": false, + "license_expression": "Unknown", + "release_timestamp": "2020-04-21T02:22:00.000000Z", + "source_uri": "https://github.com/openssl/openssl/archive/OpenSSL_1_1_1g.tar.gz", + "sortable_version": [ + "1", + "11", + "0", + "7", + "0" + ], + "version": "1.11.0.7", + "activestate_license_expression": "unknown", + "camel_extras": { + "ppm_pkg": "no" + }, + "dependencies": [ + { + "conditions": [ + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "feature": "openssl-builder", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/shared/281e4f13142b53657bd154481e18195b2d477572fdffa8ed1065f73ef5a19777/OpenSSL_1_1_1g.tar.gz", + "scanner_license_expression": "unknown", + "source_checksum": "281e4f13142b53657bd154481e18195b2d477572fdffa8ed1065f73ef5a19777", + "status": "stable", + "provided_features": [ + { + "feature": "openssl", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "shared", + "sortable_version": [ + "1", + "11", + "0", + "7", + "0" + ], + "version": "1.11.0.7" + } + ], + "author_platform_user_id": "8fd0aa9c-0483-4ee7-9197-96c9194c0318", + "comment": "Convert patch content to S3 URI and add condition on camel builder", + "is_stable_revision": true + }, + "patches": [ + { + "creation_timestamp": "2020-10-29T19:15:40.956403Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/df530ca2-a174-4148-a843-c7f34dd13652" + }, + "patch_id": "df530ca2-a174-4148-a843-c7f34dd13652", + "conditions": [ + { + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "content": "s3://platform-sources/patches/6a990e80dad9a75de34a762d621f4b56b93dd8d68e37cf805e820f889726e886.patch", + "description": "Do not attempt to install non-existent .pdb files", + "sequence_number": 1 + } + ], + "resolved_requirements": [] + }, + { + "alternatives": [], + "artifact_id": "7b9a5527-a6d0-50b9-a6fe-0c5c73d242cd", + "build_scripts": [ + { + "build_script_id": "e9ffe653-3f26-4dfe-b588-2883dd5eeb94", + "creation_timestamp": "2020-08-31T18:13:08.145236Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/e9ffe653-3f26-4dfe-b588-2883dd5eeb94" + }, + "conditions": null, + "language": "perl", + "script": "sqlite3-3.15.2-AS-Makefile.PL" + } + ], + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T17:07:11.488759Z", + "ingredient_id": "380e1f63-4050-59d3-b14d-2b431b5fa2e0", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/380e1f63-4050-59d3-b14d-2b431b5fa2e0" + }, + "name": "sqlite3", + "normalized_name": "sqlite3", + "primary_namespace": "shared", + "description": "SQL Lite Database" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2019-10-01T17:07:11.488759Z", + "ingredient_id": "380e1f63-4050-59d3-b14d-2b431b5fa2e0", + "ingredient_version_id": "54cbf7c2-c87c-51b5-a2cc-72b3b284d68c", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/380e1f63-4050-59d3-b14d-2b431b5fa2e0/versions/54cbf7c2-c87c-51b5-a2cc-72b3b284d68c", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/380e1f63-4050-59d3-b14d-2b431b5fa2e0" + }, + "revision": 3, + "revision_timestamp": "2020-08-31T18:13:08.393927Z", + "copyright_text": "To be added.", + "is_binary_only": false, + "license_expression": "Unknown", + "release_timestamp": "1970-01-01T00:00:00.000000Z", + "source_uri": "https://s3.amazonaws.com/camel-sources/src/vendor-sources/python/sqlite-autoconf-3150200.tar.gz", + "sortable_version": [ + "3", + "15", + "2", + "0" + ], + "version": "3.15.2", + "activestate_license_expression": "unknown", + "camel_extras": { + "skip_test": "yes" + }, + "dependencies": [ + { + "conditions": null, + "description": "All ingredients have a build-time dependency on the camel build system", + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/shared/07b35063b9386865b78226cdaca9a299d938a87aaa8fdc4d73edb0cef30f3149/sqlite-autoconf-3150200.tar.gz", + "scanner_license_expression": "unknown", + "source_checksum": "07b35063b9386865b78226cdaca9a299d938a87aaa8fdc4d73edb0cef30f3149", + "status": "stable", + "provided_features": [ + { + "feature": "sqlite3", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "shared", + "sortable_version": [ + "3", + "15", + "2", + "0" + ], + "version": "3.15.2" + } + ], + "author_platform_user_id": "ddfb4cc7-4a50-45a5-a6a5-1336b3ad1ef2", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true + }, + "patches": null, + "resolved_requirements": [] + }, + { + "alternatives": [], + "artifact_id": "06e6c26f-7645-5971-a6ad-277497bdec0c", + "build_scripts": [ + { + "build_script_id": "b5e19267-2ad1-450e-a3d1-a9b7ed1cd344", + "creation_timestamp": "2019-11-26T20:46:06.363894Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/b5e19267-2ad1-450e-a3d1-a9b7ed1cd344" + }, + "conditions": null, + "language": "perl", + "script": "tcl-8.6.8-AS-Makefile.PL" + } + ], + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T17:07:20.968772Z", + "ingredient_id": "040ef024-47fa-5220-aa7e-becd3b44e203", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/040ef024-47fa-5220-aa7e-becd3b44e203" + }, + "name": "tcl", + "normalized_name": "tcl", + "primary_namespace": "shared", + "description": "Toolkit Command Language" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2019-10-01T17:07:20.968772Z", + "ingredient_id": "040ef024-47fa-5220-aa7e-becd3b44e203", + "ingredient_version_id": "b0d9a189-aedb-5461-b872-5e643ac97551", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/040ef024-47fa-5220-aa7e-becd3b44e203/versions/b0d9a189-aedb-5461-b872-5e643ac97551", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/040ef024-47fa-5220-aa7e-becd3b44e203" + }, + "revision": 4, + "revision_timestamp": "2020-09-16T16:53:54.537734Z", + "copyright_text": "To be added.", + "is_binary_only": false, + "license_expression": "Unknown", + "release_timestamp": "1970-01-01T00:00:00.000000Z", + "source_uri": "https://s3.amazonaws.com/camel-sources/src/vendor-sources/tcl/tcl8.6.8-src.tar.gz", + "sortable_version": [ + "8", + "6", + "8", + "0" + ], + "version": "8.6.8", + "activestate_license_expression": "unknown", + "camel_extras": { + "cold_storage_dirs": { + "src": "__SRC__" + }, + "skip_test": "yes" + }, + "dependencies": [ + { + "conditions": null, + "description": "All ingredients have a build-time dependency on the camel build system", + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "AIX", + "namespace": "kernel", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "feature": "zlib", + "namespace": "shared", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/shared/c43cb0c1518ce42b00e7c8f6eaddd5195c53a98f94adc717234a65cbcfd3f96a/tcl8.6.8-src.tar.gz", + "scanner_license_expression": "unknown", + "source_checksum": "c43cb0c1518ce42b00e7c8f6eaddd5195c53a98f94adc717234a65cbcfd3f96a", + "status": "stable", + "provided_features": [ + { + "feature": "tcl", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "shared", + "sortable_version": [ + "8", + "6", + "8", + "0" + ], + "version": "8.6.8" + } + ], + "author_platform_user_id": "a19a07b9-313a-4e8f-916b-633457d72be8", + "comment": "Convert patch content to S3 URI and add condition on camel builder", + "is_stable_revision": true + }, + "patches": [ + { + "creation_timestamp": "2020-09-16T16:53:54.314313Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/126a4875-aec6-476b-9ff5-83944e0c08b2" + }, + "patch_id": "126a4875-aec6-476b-9ff5-83944e0c08b2", + "conditions": [ + { + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "content": "tcl/8.6.8/0001-Add-lm-for-AIX.patch", + "description": "Add lm for AIX", + "sequence_number": 1 + } + ], + "resolved_requirements": [] + }, + { + "alternatives": [], + "artifact_id": "060cc2b8-01e4-5afe-8618-c44ccb25a592", + "build_scripts": [ + { + "build_script_id": "efe458cc-4f5f-410a-ba71-ff9ff6514dc7", + "creation_timestamp": "2019-11-21T00:46:19.305262Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/efe458cc-4f5f-410a-ba71-ff9ff6514dc7" + }, + "conditions": null, + "language": "perl", + "script": "tix-8.4.3-AS-Makefile.PL" + } + ], + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "8d5d63b0-e941-59a3-8653-35470bd70056" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "b0d9a189-aedb-5461-b872-5e643ac97551" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T17:07:40.922846Z", + "ingredient_id": "be9d279c-48f3-5233-9250-fc5a61dc8b07", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/be9d279c-48f3-5233-9250-fc5a61dc8b07" + }, + "name": "tix", + "normalized_name": "tix", + "primary_namespace": "shared", + "description": "Tk Interface Extension" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2019-10-01T17:07:40.922846Z", + "ingredient_id": "be9d279c-48f3-5233-9250-fc5a61dc8b07", + "ingredient_version_id": "a61c1442-98a0-576c-b606-3046b22c3413", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/be9d279c-48f3-5233-9250-fc5a61dc8b07/versions/a61c1442-98a0-576c-b606-3046b22c3413", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/be9d279c-48f3-5233-9250-fc5a61dc8b07" + }, + "revision": 4, + "revision_timestamp": "2020-09-16T16:53:55.795504Z", + "copyright_text": "To be added.", + "is_binary_only": false, + "license_expression": "Unknown", + "release_timestamp": "1970-01-01T00:00:00.000000Z", + "source_uri": "https://s3.amazonaws.com/camel-sources/src/vendor-sources/python-core/tix-8.4.3.6-pysvn.tar.gz", + "sortable_version": [ + "8", + "4", + "3", + "6", + "0" + ], + "version": "8.4.3.6", + "activestate_license_expression": "unknown", + "camel_extras": { + "skip_test": "yes" + }, + "dependencies": [ + { + "conditions": null, + "feature": "tcl", + "namespace": "shared", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": null, + "feature": "tk", + "namespace": "shared", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": null, + "description": "All ingredients have a build-time dependency on the camel build system", + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/shared/d6a92d5dd259d51a40d2293e495f34a4925ee7b360b213bb8a64360892065d35/tix-8.4.3.6-pysvn.tar.gz", + "scanner_license_expression": "unknown", + "source_checksum": "d6a92d5dd259d51a40d2293e495f34a4925ee7b360b213bb8a64360892065d35", + "status": "stable", + "provided_features": [ + { + "feature": "tix", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "shared", + "sortable_version": [ + "8", + "4", + "3", + "6", + "0" + ], + "version": "8.4.3.6" + } + ], + "author_platform_user_id": "a19a07b9-313a-4e8f-916b-633457d72be8", + "comment": "Convert patch content to S3 URI and add condition on camel builder", + "is_stable_revision": true + }, + "patches": [ + { + "creation_timestamp": "2020-09-16T16:53:55.513963Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/ce6ba6d3-4a26-4b60-be52-4db4e2fadf4b" + }, + "patch_id": "ce6ba6d3-4a26-4b60-be52-4db4e2fadf4b", + "conditions": [ + { + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "content": "tix/8.4.3.6/0001-Work-around-deprecated-access-to-Tcl_Interp-result.patch", + "description": "[PATCH 1/2] Work around deprecated access to Tcl_Interp->result", + "sequence_number": 1 + }, + { + "creation_timestamp": "2020-09-16T16:53:55.608640Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/c441dcb9-546a-4cc0-a386-f491539b5e98" + }, + "patch_id": "c441dcb9-546a-4cc0-a386-f491539b5e98", + "conditions": [ + { + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "content": "tix/8.4.3.6/0002-gcc64-fix.patch", + "description": "[PATCH 2/2] gcc64 fix", + "sequence_number": 2 + } + ], + "resolved_requirements": [] + }, + { + "alternatives": [], + "artifact_id": "2c8a61b6-995c-5e59-8d52-fac8604c3e88", + "build_scripts": [ + { + "build_script_id": "72d59ea6-6a31-4af4-acb8-a4c8cf3c5b2e", + "creation_timestamp": "2020-09-28T21:06:07.393481Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/72d59ea6-6a31-4af4-acb8-a4c8cf3c5b2e" + }, + "conditions": null, + "language": "perl", + "script": "s3://platform-sources/build_scripts/815b591199017b6171f96b1411ca33d87bba4c8241a8325321f6e4eb3f8b6efc/tk-8.6.8-AS-Makefile.PL" + } + ], + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "b0d9a189-aedb-5461-b872-5e643ac97551" + }, + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T17:07:42.897332Z", + "ingredient_id": "5edfd4e0-b20a-5016-8447-635029f35565", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/5edfd4e0-b20a-5016-8447-635029f35565" + }, + "name": "tk", + "normalized_name": "tk", + "primary_namespace": "shared", + "description": "Toolkit GUI Kit" + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2019-10-01T17:07:42.897332Z", + "ingredient_id": "5edfd4e0-b20a-5016-8447-635029f35565", + "ingredient_version_id": "8d5d63b0-e941-59a3-8653-35470bd70056", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/5edfd4e0-b20a-5016-8447-635029f35565/versions/8d5d63b0-e941-59a3-8653-35470bd70056", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/5edfd4e0-b20a-5016-8447-635029f35565" + }, + "revision": 9, + "revision_timestamp": "2020-09-28T21:06:41.439268Z", + "copyright_text": "To be added.", + "is_binary_only": false, + "license_expression": "Unknown", + "release_timestamp": "1970-01-01T00:00:00.000000Z", + "source_uri": "https://s3.amazonaws.com/camel-sources/src/vendor-sources/tcl/tk8.6.8-src.tar.gz", + "sortable_version": [ + "8", + "6", + "8", + "0" + ], + "version": "8.6.8", + "activestate_license_expression": "unknown", + "camel_extras": { + "cold_storage_dirs": { + "src": "__SRC__" + }, + "skip_test": "yes" + }, + "dependencies": [ + { + "conditions": null, + "description": "All ingredients have a build-time dependency on the camel build system", + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": null, + "feature": "tcl", + "namespace": "shared", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [ + "8", + "6", + "8", + "0" + ], + "version": "8.6.8" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/shared/49e7bca08dde95195a27f594f7c850b088be357a7c7096e44e1158c7a5fd7b33/tk8.6.8-src.tar.gz", + "scanner_license_expression": "unknown", + "source_checksum": "49e7bca08dde95195a27f594f7c850b088be357a7c7096e44e1158c7a5fd7b33", + "status": "stable", + "provided_features": [ + { + "feature": "tk", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "shared", + "sortable_version": [ + "8", + "6", + "8", + "0" + ], + "version": "8.6.8" + } + ], + "author_platform_user_id": "2b378791-a94b-4bf1-9547-692b7e79dfef", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true + }, + "patches": null, + "resolved_requirements": [] + }, + { + "alternatives": [], + "artifact_id": "7b923ae1-94a9-574c-bb9e-a89163f0ccb8", + "build_scripts": [ + { + "build_script_id": "4dba9721-e655-4da3-a414-44c346460ab5", + "creation_timestamp": "2020-10-02T18:32:51.953001Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/4dba9721-e655-4da3-a414-44c346460ab5" + }, + "conditions": null, + "language": "perl", + "script": "zlib-1.2.8-AS-Makefile.PL" + } + ], + "dependencies": [ + { + "dependency_types": [ + "build" + ], + "ingredient_version_id": "c6688f9c-b7bc-5f6e-a1f3-903ae5b8d0bc" + } + ], + "ingredient": { + "creation_timestamp": "2019-10-01T16:58:37.399441Z", + "ingredient_id": "aaa00228-14b4-5dce-9fe2-3370801e423b", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/aaa00228-14b4-5dce-9fe2-3370801e423b" + }, + "name": "zlib", + "normalized_name": "zlib", + "primary_namespace": "shared", + "description": "General purpose data compression library." + }, + "ingredient_options": null, + "ingredient_version": { + "creation_timestamp": "2019-10-01T16:58:37.399441Z", + "ingredient_id": "aaa00228-14b4-5dce-9fe2-3370801e423b", + "ingredient_version_id": "c3b7c513-8be8-56d9-8d30-b19e9c56e393", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/aaa00228-14b4-5dce-9fe2-3370801e423b/versions/c3b7c513-8be8-56d9-8d30-b19e9c56e393", + "ingredient": "https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/aaa00228-14b4-5dce-9fe2-3370801e423b" + }, + "revision": 5, + "revision_timestamp": "2020-10-02T18:32:52.928805Z", + "copyright_text": "To be added.", + "is_binary_only": false, + "license_expression": "Unknown", + "release_timestamp": "2017-01-15T00:00:00.000000Z", + "source_uri": "https://s3.amazonaws.com/camel-sources/src/Libraries/vendor/zlib-1.2.11.tar.gz", + "sortable_version": [ + "1", + "2", + "11", + "0" + ], + "version": "1.2.11", + "activestate_license_expression": "unknown", + "camel_extras": { + "ppm_pkg": "no", + "skip_test": "yes" + }, + "dependencies": [ + { + "conditions": [ + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "feature": "zlib-builder", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + }, + { + "conditions": [ + { + "feature": "alternative-built-language", + "namespace": "language", + "requirements": [ + { + "comparator": "eq", + "sortable_version": [] + } + ] + } + ], + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ], + "type": "build" + } + ], + "ingredient_options": null, + "is_indemnified": true, + "is_stable_release": true, + "platform_source_uri": "s3://platform-sources/shared/c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1/zlib-1.2.11.tar.gz", + "scanner_license_expression": "unknown", + "source_checksum": "c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1", + "status": "stable", + "provided_features": [ + { + "feature": "zlib", + "is_activestate_version": false, + "is_default_provider": true, + "namespace": "shared", + "sortable_version": [ + "1", + "2", + "11", + "0" + ], + "version": "1.2.11" + } + ], + "author_platform_user_id": "a4603881-68af-4a9f-9e4c-6de870d9cbb4", + "comment": "Created prior to addition of revision comments.", + "is_stable_revision": true + }, + "patches": [ + { + "creation_timestamp": "2020-10-02T18:32:52.140755Z", + "links": { + "self": "https://platform.activestate.com/sv/inventory-api-v1/v1/patches/8c1dc792-b9e1-44d8-9dfe-27cd3c9884c6" + }, + "patch_id": "8c1dc792-b9e1-44d8-9dfe-27cd3c9884c6", + "conditions": [ + { + "feature": "camel", + "namespace": "builder", + "requirements": [ + { + "comparator": "gte", + "sortable_version": [ + "0", + "0" + ], + "version": "0" + } + ] + } + ], + "content": "s3://platform-sources/patches/Libraries/patches/zlib-1.2.8-remove-Makefile.patch", + "description": "Remove Makefile, use EU::MM to build", + "sequence_number": 1 + } + ], + "resolved_requirements": [] + } + ], + "solver_version": 1 +} diff --git a/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-base.json b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-base.json new file mode 100644 index 0000000000..52f1bb3f8f --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-base.json @@ -0,0 +1 @@ +{"camel_flags":[],"from_recipe_store":true,"image":{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"},"is_indemnified":false,"platform":{"cpu_architecture":{"cpu_architecture_id":"4cdba18d-0851-4925-9ae5-9c8a2987828a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/cpu-architectures/4cdba18d-0851-4925-9ae5-9c8a2987828a"},"bit_width":"64","name":"x86","provided_features":[{"feature":"x86 64-bit","is_activestate_version":false,"is_default_provider":true,"namespace":"cpu-architecture","sortable_version":["1","0"],"version":"1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"cpu_extensions":[],"creation_timestamp":"2021-01-15T18:05:36.924Z","display_name":"CentOS 8, Linux 4.18.0, glibc 2.28 x86 64-bit","end_of_support_date":"2025-12-31","images":[{"image_id":"00216735-694e-4ef8-a7d5-7724b9200be0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/00216735-694e-4ef8-a7d5-7724b9200be0"},"name":"docker-registry.activestate.build/activestate/centos-8-build","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","1","0"],"version":"1.1","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"eq","sortable_version":[]}]}],"revision":1,"revision_timestamp":"2021-01-15T18:07:52.645Z"},{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"}],"is_user_visible":true,"kernel":{"kernel_id":"ef737274-fff9-4164-b72b-88067613f822","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822"},"name":"Linux"},"kernel_version":{"kernel_version_id":"61f9365e-03ed-448f-9a24-2b845727e4f5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822/versions/61f9365e-03ed-448f-9a24-2b845727e4f5"},"sortable_version":["4","18","0","0"],"version":"4.18.0","provided_features":[{"feature":"Linux","is_activestate_version":false,"is_default_provider":true,"namespace":"kernel","sortable_version":["4","18","0","0"],"version":"4.18.0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:04.588Z"},"libc":{"libc_id":"09a2eb42-ad34-4734-a93e-4b97395577df","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df"},"name":"glibc"},"libc_version":{"libc_version_id":"22d234e7-145e-4688-9d05-ee164b4ffa12","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df/versions/22d234e7-145e-4688-9d05-ee164b4ffa12"},"sortable_version":["2","28","0"],"version":"2.28","provided_features":[{"feature":"glibc","is_activestate_version":false,"is_default_provider":true,"namespace":"libc","sortable_version":["2","28","0"],"version":"2.28"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:19.136Z"},"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/platforms/7c998ec2-7491-4e75-be4d-8885800ef5f2"},"operating_system":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99"},"operating_system_id":"7b3a2dbb-d543-48d6-8390-7e7b63751e99","has_libc":true,"name":"CentOS"},"operating_system_version":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99/versions/42cab97b-9d80-407f-89a8-230836868e88"},"operating_system_version_id":"42cab97b-9d80-407f-89a8-230836868e88","sortable_version":["8","0"],"version":"8","provided_features":[{"feature":"CentOS","is_activestate_version":false,"is_default_provider":true,"namespace":"operating-system","sortable_version":["8","0"],"version":"8"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:50.448Z"},"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2"},"recipe_id":"aa21f7c8-85a7-5cc2-8ee8-f8bd3b342406","recipe_store_timestamp":"2021-02-04T17:59:12.286Z","resolved_ingredients":[{"alternatives":[],"artifact_id":"cf3d86c1-2587-564e-a7b2-0cf109ce263e","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-08-10T23:47:40.385Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"name":"perl-core-builder","normalized_name":"perl-core-builder","primary_namespace":"builder","description":"Builds the core Perl interpreter on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-30T17:58:38.567Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31/versions/d5ac8c7c-b025-5418-ab77-a139e60e1d41","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"revision":2,"revision_timestamp":"2020-10-30T17:04:06.702Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-06-25T07:05:14.000Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-core-builder","sortable_version":["1","0","23","0"],"version":"1.0.23","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374/perl-core-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"perl-core-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","23","0"],"version":"1.0.23"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Initial builder for perl 5.30+","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41"}],"ingredient":{"creation_timestamp":"2019-10-01T16:56:32.665Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"name":"perl","normalized_name":"perl","primary_namespace":"language","description":"Practical Extraction and Report Language"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2021-01-29T18:11:47.039Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206/versions/86005392-bdbf-59bd-a716-70ce7fcd3a66","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"revision":3,"revision_timestamp":"2021-02-03T21:14:56.873Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"1970-01-01T00:00:00.000Z","source_uri":"https://cpan.metacpan.org/authors/id/S/SH/SHAY/perl-5.32.1.tar.gz","sortable_version":["5","32","1"],"version":"5.32.1","activestate_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/language/03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c/perl-5.32.1.tar.gz","scanner_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","source_checksum":"03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c","status":"stable","provided_features":[{"feature":"alternative-built-language","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1","0"],"version":"5.32.1"},{"feature":"perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1"],"version":"5.32.1"},{"feature":"Amiga::ARexx","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","50","0"],"version":"0.05"},{"feature":"Amiga::Exec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"App::Cpan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","676","0"],"version":"1.676"},{"feature":"App::Prove","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Archive::Tar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Attribute::Handlers","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"AutoLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","740","0"],"version":"5.74"},{"feature":"AutoSplit","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"B","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","820","0"],"version":"1.82"},{"feature":"B::Concise","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.004"},{"feature":"B::Deparse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"B::Op_private","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"B::Showlex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"B::Terse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"B::Xref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Benchmark","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"CPAN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"CPAN::Author","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Bundle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","500"],"version":"5.5005"},{"feature":"CPAN::CacheMgr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::DeferredCode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::Distribution","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Distroprefs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","0","100"],"version":"6.0001"},{"feature":"CPAN::Distrostatus","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::RecursiveDependency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Exception::blocked_urllist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"CPAN::Exception::yaml_not_installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::yaml_process_error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::FTP::netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"CPAN::FirstTime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","531","500"],"version":"5.5315"},{"feature":"CPAN::HTTP::Client","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HTTP::Credentials","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HandleConfig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","100"],"version":"5.5011"},{"feature":"CPAN::Index","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","120","0"],"version":"2.12"},{"feature":"CPAN::InfoObj","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Kwalify","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::LWP::UserAgent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Converter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::History","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Merge","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Prereqs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Requirements","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","140","0"],"version":"2.140"},{"feature":"CPAN::Meta::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Validator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","18","0"],"version":"0.018"},{"feature":"CPAN::Mirrors","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Nox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","970","0"],"version":"0.97"},{"feature":"CPAN::Plugin::Specfile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"CPAN::Prompt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Shell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","900"],"version":"5.5009"},{"feature":"CPAN::Tarzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::URL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"Carp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Carp::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Class::Struct","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","660","0"],"version":"0.66"},{"feature":"Compress::Raw::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Raw::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"Config::Extensions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"Config::Perl::V","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"Cwd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"DB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"DBM_Filter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"DBM_Filter::compress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::int32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::null","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DB_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","855","0"],"version":"1.855"},{"feature":"Data::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","176","0"],"version":"2.176"},{"feature":"Devel::PPPort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","620","0"],"version":"3.62"},{"feature":"Devel::Peek","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Devel::SelfStubber","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Digest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::MD5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","580","0"],"version":"2.58"},{"feature":"Digest::SHA","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","20","0"],"version":"6.02"},{"feature":"Digest::base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"DirHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Dumpvalue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"DynaLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"Encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","80","0"],"version":"3.08"},{"feature":"Encode::Alias","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"Encode::Byte","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::CJKConstants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::CN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::CN::HZ","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"Encode::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.05"},{"feature":"Encode::EBCDIC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::Encoder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::GSM0338","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"Encode::Guess","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::JP::H2Z","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::JP::JIS7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::KR::2022_KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::MIME::Header","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"Encode::MIME::Header::ISO_2022_JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Encode::MIME::Name","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Encode::Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::TW","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"Encode::Unicode::UTF7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"English","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Errno","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"Exporter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"Exporter::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"ExtUtils::CBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::BCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::MSVC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::aix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::android","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::dec_osf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::os2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Command::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","250","0"],"version":"0.25"},{"feature":"ExtUtils::Constant::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"ExtUtils::Constant::ProxySubs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"ExtUtils::Constant::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"ExtUtils::Constant::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"ExtUtils::Embed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","350","0"],"version":"1.35"},{"feature":"ExtUtils::Install","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Liblist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Liblist::Kid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_AIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Any","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_BeOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_DOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_NW5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_UWIN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win95","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Manifest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","730","0"],"version":"1.73"},{"feature":"ExtUtils::Miniperl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"ExtUtils::Mkbootstrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Mksymlists","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Packlist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::ParseXS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::CountLines","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Eval","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Utilities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::Typemaps","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::InputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::OutputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Type","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::XSSymSet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.4"},{"feature":"ExtUtils::testlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"Fatal","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"Fcntl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","140","0"],"version":"1.14"},{"feature":"File::Basename","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","850","0"],"version":"2.85"},{"feature":"File::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","600"],"version":"1.1006"},{"feature":"File::Copy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","350","0"],"version":"2.35"},{"feature":"File::DosGlob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"File::Fetch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.00"},{"feature":"File::Find","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","380","0"],"version":"1.38"},{"feature":"File::Glob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"File::GlobMapper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"File::Path","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"File::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::AmigaOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Epoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Temp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","231","100"],"version":"0.2311"},{"feature":"File::stat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"FileCache","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"FileHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Filter::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","960","0"],"version":"0.96"},{"feature":"Filter::Util::Call","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","600","0"],"version":"1.60"},{"feature":"FindBin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"GDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Getopt::Long","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","520","0"],"version":"2.52"},{"feature":"Getopt::Std","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"HTTP::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","76","0"],"version":"0.076"},{"feature":"Hash::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","240","0"],"version":"0.24"},{"feature":"Hash::Util::FieldHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"I18N::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"I18N::LangTags","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","450","0"],"version":"0.45"},{"feature":"I18N::LangTags::Detect","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"I18N::LangTags::List","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","400","0"],"version":"0.40"},{"feature":"I18N::Langinfo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","190","0"],"version":"0.19"},{"feature":"IO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Compress::Adapter::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base::Common","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::RawDeflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Extra","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Dir","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Pipe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Poll","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Seekable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Select","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::INET","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::IP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"IO::Socket::UNIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Uncompress::Adapter::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyUncompress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Gunzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::RawInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Unzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"IPC::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"IPC::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::Open2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"IPC::Open3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"IPC::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SharedMem","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SysV","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"JSON::PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"JSON::PP::Boolean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"List::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"List::Util::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Locale::Maketext","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Locale::Maketext::Guts","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::GutsLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","210","100"],"version":"0.21_01"},{"feature":"MIME::Base64","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"MIME::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"Math::BigFloat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigFloat::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigInt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Calc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::FastCalc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","500","900"],"version":"0.5009"},{"feature":"Math::BigInt::Lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigRat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","261","400"],"version":"0.2614"},{"feature":"Math::Complex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","590","200"],"version":"1.5902"},{"feature":"Math::Trig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","100"],"version":"1.03_01"},{"feature":"Memoize::AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Expire","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireFile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireTest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Module::CoreList","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::CoreList::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::Load","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"Module::Load::Conditional","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","740","0"],"version":"0.74"},{"feature":"Module::Loaded","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","80","0"],"version":"0.08"},{"feature":"Module::Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","37"],"version":"1.000037"},{"feature":"Moped::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10","0"],"version":"0.01"},{"feature":"NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"NEXT","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","670","100"],"version":"0.67_01"},{"feature":"Net::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Domain","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::A","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::E","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::I","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::L","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::dataconn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::NNTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::POP3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Ping","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","740","0"],"version":"2.74"},{"feature":"Net::SMTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Time","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::hostent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Net::netent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::protoent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::servent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"O","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"ODBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"OS2::DLL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"OS2::ExtAttr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::PrfDB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"OS2::REXX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Opcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","490","0"],"version":"1.49"},{"feature":"POSIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","970","0"],"version":"1.97"},{"feature":"Params::Check","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","380","0"],"version":"0.38"},{"feature":"Parse::CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"Perl::OSType","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.010"},{"feature":"PerlIO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"PerlIO::encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","0"],"version":"0.28"},{"feature":"PerlIO::mmap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","17","0"],"version":"0.017"},{"feature":"PerlIO::scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","310","0"],"version":"0.31"},{"feature":"PerlIO::via","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"PerlIO::via::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"Pod::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","740","0"],"version":"1.74"},{"feature":"Pod::Escapes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Pod::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Functions::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Html","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Pod::Man","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::ParseLink","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Perldoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","100"],"version":"3.2801"},{"feature":"Pod::Perldoc::BaseTo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::GetOptsOO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToANSI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToChecker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToMan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToNroff","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToPod","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToRtf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTerm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTk","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToXml","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::BlackBox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsXML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLBatch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLLegacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Pod::Simple::LinkSection","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Methody","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Progress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserEndToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserStartToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserTextToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::RTF","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Search","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::SimpleTree","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TextContent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TiedOutFH","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Transcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeDumb","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeSmart","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XHTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XMLOutStream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Overstrike","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Termcap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Usage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","10","0"],"version":"2.01"},{"feature":"SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"Safe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","430","0"],"version":"2.43"},{"feature":"Scalar::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Search::Dict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"SelectSaver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"SelfLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.030"},{"feature":"Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","230","0"],"version":"3.23"},{"feature":"Sub::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Sys::Hostname","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Sys::Syslog","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"TAP::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::ParallelSession","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness::Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Object","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Aggregator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Grammar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::IteratorFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Multiplexer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Bailout","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Comment","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Pragma","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Unknown","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::ResultFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Job","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Spinner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Source","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Executable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::RawTAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Reader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Writer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Term::ANSIColor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Term::Cap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Term::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","403","0"],"version":"1.403"},{"feature":"Term::ReadLine","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","310","0"],"version":"1.31"},{"feature":"Test2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Breakage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Instance","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Stack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Bail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Diag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Fail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Note","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Pass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::TAP::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::V2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Waiting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::About","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Amnesty","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Assert","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Control","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Render","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter::TAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor::Terminator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver::Files","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Tools::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::ExternalMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Facets2Legacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::IO::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","114","0"],"version":"2.114"},{"feature":"Test::Builder::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::TodoDiag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Test::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Capture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::CaptureRunner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Delegate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::use::ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Text::Abbrev","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Text::Balanced","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Text::ParseWords","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","300","0"],"version":"3.30"},{"feature":"Text::Tabs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Text::Wrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Thread","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","50","0"],"version":"3.05"},{"feature":"Thread::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","140","0"],"version":"3.14"},{"feature":"Thread::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","130","0"],"version":"2.13"},{"feature":"Tie::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Tie::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Tie::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","200","0"],"version":"4.2"},{"feature":"Tie::Hash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::Hash::NamedCapture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"Tie::Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"Tie::RefHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.40"},{"feature":"Tie::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::StdHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","600","0"],"version":"4.6"},{"feature":"Tie::SubstrHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Time::HiRes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","976","600"],"version":"1.9766"},{"feature":"Time::Local","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Time::Piece","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::Seconds","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::gmtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"Time::localtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Time::tm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"UNIVERSAL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["13","0","0"],"version":"13.0.0"},{"feature":"Unicode::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Big5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::GB2312","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::JISX0208","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Korean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Pinyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Stroke","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Zhuyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Normalize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","280","0"],"version":"1.28"},{"feature":"Unicode::UCD","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","750","0"],"version":"0.75"},{"feature":"User::grent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"User::pwent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"VMS::DCLsym","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"VMS::Filespec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"VMS::Stdio","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","450","0"],"version":"2.45"},{"feature":"Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","540","0"],"version":"0.54"},{"feature":"Win32API::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","120","301"],"version":"0.1203_01"},{"feature":"Win32API::File::inc::ExtUtils::Myconst2perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1"},{"feature":"Win32CORE","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"XS::APItest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"XS::Typemap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"XSLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","300","0"],"version":"0.30"},{"feature":"_charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"attributes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"autodie","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::Guard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::GuardStack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception::system","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::hints","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autouse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"bigint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bignum","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bigrat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"blib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"bytes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"deprecate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"diagnostics","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","370","0"],"version":"1.37"},{"feature":"encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","0","0"],"version":"3.00"},{"feature":"encoding::warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"experimental","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","22","0"],"version":"0.022"},{"feature":"feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"fields","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"filetest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"if","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","900"],"version":"0.0609"},{"feature":"integer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"less","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","650","0"],"version":"0.65"},{"feature":"locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"mro","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","250","0"],"version":"1.25"},{"feature":"ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"open","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"ops","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"overload","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"overloading","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","238","0"],"version":"0.238"},{"feature":"perlfaq","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","11","70"],"version":"5.20201107"},{"feature":"re","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"sigtrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"sort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"strict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"subs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"threads","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","260","0"],"version":"2.26"},{"feature":"threads::shared","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","240","0"],"version":"1.24"},{"feature":"vars","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"vmsish","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"warnings::register","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Bump again","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"perl","namespace":"language","version_requirements":[{"comparator":"eq","version":"5.32.1"}]}]}],"solver_version":1} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-failure.json b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-failure.json new file mode 100644 index 0000000000..5ab4428333 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-failure.json @@ -0,0 +1 @@ +{"camel_flags":[],"from_recipe_store":true,"image":{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"},"is_indemnified":false,"platform":{"cpu_architecture":{"cpu_architecture_id":"4cdba18d-0851-4925-9ae5-9c8a2987828a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/cpu-architectures/4cdba18d-0851-4925-9ae5-9c8a2987828a"},"bit_width":"64","name":"x86","provided_features":[{"feature":"x86 64-bit","is_activestate_version":false,"is_default_provider":true,"namespace":"cpu-architecture","sortable_version":["1","0"],"version":"1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"cpu_extensions":[],"creation_timestamp":"2021-01-15T18:05:36.924Z","display_name":"CentOS 8, Linux 4.18.0, glibc 2.28 x86 64-bit","end_of_support_date":"2025-12-31","images":[{"image_id":"00216735-694e-4ef8-a7d5-7724b9200be0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/00216735-694e-4ef8-a7d5-7724b9200be0"},"name":"docker-registry.activestate.build/activestate/centos-8-build","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","1","0"],"version":"1.1","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"eq","sortable_version":[]}]}],"revision":1,"revision_timestamp":"2021-01-15T18:07:52.645Z"},{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"}],"is_user_visible":true,"kernel":{"kernel_id":"ef737274-fff9-4164-b72b-88067613f822","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822"},"name":"Linux"},"kernel_version":{"kernel_version_id":"61f9365e-03ed-448f-9a24-2b845727e4f5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822/versions/61f9365e-03ed-448f-9a24-2b845727e4f5"},"sortable_version":["4","18","0","0"],"version":"4.18.0","provided_features":[{"feature":"Linux","is_activestate_version":false,"is_default_provider":true,"namespace":"kernel","sortable_version":["4","18","0","0"],"version":"4.18.0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:04.588Z"},"libc":{"libc_id":"09a2eb42-ad34-4734-a93e-4b97395577df","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df"},"name":"glibc"},"libc_version":{"libc_version_id":"22d234e7-145e-4688-9d05-ee164b4ffa12","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df/versions/22d234e7-145e-4688-9d05-ee164b4ffa12"},"sortable_version":["2","28","0"],"version":"2.28","provided_features":[{"feature":"glibc","is_activestate_version":false,"is_default_provider":true,"namespace":"libc","sortable_version":["2","28","0"],"version":"2.28"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:19.136Z"},"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/platforms/7c998ec2-7491-4e75-be4d-8885800ef5f2"},"operating_system":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99"},"operating_system_id":"7b3a2dbb-d543-48d6-8390-7e7b63751e99","has_libc":true,"name":"CentOS"},"operating_system_version":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99/versions/42cab97b-9d80-407f-89a8-230836868e88"},"operating_system_version_id":"42cab97b-9d80-407f-89a8-230836868e88","sortable_version":["8","0"],"version":"8","provided_features":[{"feature":"CentOS","is_activestate_version":false,"is_default_provider":true,"namespace":"operating-system","sortable_version":["8","0"],"version":"8"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:50.448Z"},"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2"},"recipe_id":"ea103bb8-1e74-58ff-8f35-3bc14994d268","recipe_store_timestamp":"2021-02-20T07:49:46.271Z","resolved_ingredients":[{"alternatives":[],"artifact_id":"8c2f830d-1b31-5448-a0a4-aa9d8fcacc4b","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-09-30T17:54:34.749Z","ingredient_id":"888f7a88-fdc8-58f7-8e34-1e28425f3c5a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/888f7a88-fdc8-58f7-8e34-1e28425f3c5a"},"name":"noop-builder","normalized_name":"noop-builder","primary_namespace":"builder","description":"Does the thing - which is nothing - successfully! Hooray!","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-30T17:54:34.749Z","ingredient_id":"888f7a88-fdc8-58f7-8e34-1e28425f3c5a","ingredient_version_id":"fcfb451f-d86d-5977-ae48-f27610f7d5ab","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/888f7a88-fdc8-58f7-8e34-1e28425f3c5a/versions/fcfb451f-d86d-5977-ae48-f27610f7d5ab","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/888f7a88-fdc8-58f7-8e34-1e28425f3c5a"},"revision":2,"revision_timestamp":"2020-10-30T17:03:52.420Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-06-25T07:05:14.000Z","source_uri":"https://github.com/ActiveState/platform-builders/tree/noop-builder-1.0.0/builder/noop-builder","sortable_version":["1","0","0","0"],"version":"1.0.0","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/65710b34592066ff70669c67ea0031b138f4249c768c429b74f6f2efe781e077/noop-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"65710b34592066ff70669c67ea0031b138f4249c768c429b74f6f2efe781e077","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"noop-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Initial upload.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"cf3d86c1-2587-564e-a7b2-0cf109ce263e","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-08-10T23:47:40.385Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"name":"perl-core-builder","normalized_name":"perl-core-builder","primary_namespace":"builder","description":"Builds the core Perl interpreter on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-30T17:58:38.567Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31/versions/d5ac8c7c-b025-5418-ab77-a139e60e1d41","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"revision":2,"revision_timestamp":"2020-10-30T17:04:06.702Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-06-25T07:05:14.000Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-core-builder","sortable_version":["1","0","23","0"],"version":"1.0.23","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374/perl-core-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"perl-core-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","23","0"],"version":"1.0.23"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Initial builder for perl 5.30+","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"a1ebbc88-daeb-5588-8086-c99de70eabf7","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"ed446cc4-4e4d-5986-ad77-ed04a3b2e58b"}],"ingredient":{"creation_timestamp":"2020-08-10T23:48:55.390Z","ingredient_id":"196722f9-5600-5d89-9c47-42460922fdb1","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1"},"name":"perl-module-builder","normalized_name":"perl-module-builder","primary_namespace":"builder","description":"Builds Perl modules on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-12-07T20:54:12.006Z","ingredient_id":"196722f9-5600-5d89-9c47-42460922fdb1","ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1/versions/c4164b54-9b8f-55fc-ae5a-cd47c6389687","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1"},"revision":1,"revision_timestamp":"2020-12-07T20:54:12.006Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-12-07T20:23:01.043Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-module-builder","sortable_version":["1","0","36","0"],"version":"1.0.36","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/bb8bb535334fb012df0550a528692f4826893b91b055ac73ffb37dd00322a7b6/perl-module-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"bb8bb535334fb012df0550a528692f4826893b91b055ac73ffb37dd00322a7b6","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"perl-module-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","36","0"],"version":"1.0.36"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Created new version 1.0.36 from 1.0.35.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"f7c88044-fdcd-5023-a0ce-9c4a6fcc2708","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-08-10T23:48:13.169Z","ingredient_id":"4c0fd8d2-5c39-5ecf-958e-325efdea1ef2","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2"},"name":"perl-module-lib","normalized_name":"perl-module-lib","primary_namespace":"builder-lib","description":"Builds Perl modules on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-12-07T20:54:42.776Z","ingredient_id":"4c0fd8d2-5c39-5ecf-958e-325efdea1ef2","ingredient_version_id":"ed446cc4-4e4d-5986-ad77-ed04a3b2e58b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2/versions/ed446cc4-4e4d-5986-ad77-ed04a3b2e58b","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2"},"revision":2,"revision_timestamp":"2020-12-10T17:22:10.292Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-12-07T20:25:59.954Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-module-lib","sortable_version":["1","0","36","0"],"version":"1.0.36","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/abdb22574b2300f30e98ab9239892f379c0c60bf33634a2b49518bddc730413d/perl-module-lib.tar.gz","scanner_license_expression":"unknown","source_checksum":"abdb22574b2300f30e98ab9239892f379c0c60bf33634a2b49518bddc730413d","status":"stable","provided_features":[{"feature":"perl-module-lib","is_activestate_version":false,"is_default_provider":true,"namespace":"builder-lib","sortable_version":["1","0","36","0"],"version":"1.0.36"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"Created new version 1.0.36 from 1.0.35.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"c894fa23-0416-556d-9ca5-fdf9375595bc","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"9c514f0f-5abb-546a-840a-1c97f2010c78"},{"dependency_types":["build"],"ingredient_version_id":"b8f76881-09d4-53fd-8cc6-e595b6d69132"},{"dependency_types":["build"],"ingredient_version_id":"fa7a0c73-1e93-5e08-8f6b-a009e82d7179"},{"dependency_types":["build"],"ingredient_version_id":"fcfb451f-d86d-5977-ae48-f27610f7d5ab"}],"ingredient":{"creation_timestamp":"2020-11-04T00:07:57.937Z","ingredient_id":"bcdc3172-a686-5b04-aace-400fc127d5a4","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bcdc3172-a686-5b04-aace-400fc127d5a4"},"name":"Testing","normalized_name":"Testing","primary_namespace":"bundles/perl","description":"Modules and tools for automating testing, test frameworks, etc."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-11-04T00:07:57.937Z","ingredient_id":"bcdc3172-a686-5b04-aace-400fc127d5a4","ingredient_version_id":"21141224-b8b8-565c-8fdf-4ded24fcbd8d","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bcdc3172-a686-5b04-aace-400fc127d5a4/versions/21141224-b8b8-565c-8fdf-4ded24fcbd8d","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bcdc3172-a686-5b04-aace-400fc127d5a4"},"revision":3,"revision_timestamp":"2020-11-04T23:20:03.446Z","copyright_text":"To be added.","is_binary_only":true,"license_expression":"Artistic-2.0","release_timestamp":"2017-12-29T00:00:00.000Z","sortable_version":["1","0","0"],"version":"1.00","activestate_license_expression":"[\"Artistic-2.0\"]","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/internal/3b96afde8004eb24d11bfd06c63048414c1cb6e8abedf0730e5141fc6c16f540/void.tar.gz","scanner_license_expression":"[\"Artistic-2.0\"]","source_checksum":"3b96afde8004eb24d11bfd06c63048414c1cb6e8abedf0730e5141fc6c16f540","status":"stable","provided_features":[{"feature":"Testing","is_activestate_version":false,"is_default_provider":true,"namespace":"bundles/perl","sortable_version":["1","0","0"],"version":"1.00"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"Testing","namespace":"bundles/perl","version_requirements":[{"comparator":"eq","version":"1.00"}]}]},{"alternatives":[],"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41"}],"ingredient":{"creation_timestamp":"2019-10-01T16:56:32.665Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"name":"perl","normalized_name":"perl","primary_namespace":"language","description":"Practical Extraction and Report Language"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2021-01-29T18:11:47.039Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206/versions/86005392-bdbf-59bd-a716-70ce7fcd3a66","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"revision":3,"revision_timestamp":"2021-02-03T21:14:56.873Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"1970-01-01T00:00:00.000Z","source_uri":"https://cpan.metacpan.org/authors/id/S/SH/SHAY/perl-5.32.1.tar.gz","sortable_version":["5","32","1"],"version":"5.32.1","activestate_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/language/03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c/perl-5.32.1.tar.gz","scanner_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","source_checksum":"03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c","status":"stable","provided_features":[{"feature":"alternative-built-language","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1","0"],"version":"5.32.1"},{"feature":"perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1"],"version":"5.32.1"},{"feature":"Amiga::ARexx","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","50","0"],"version":"0.05"},{"feature":"Amiga::Exec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"App::Cpan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","676","0"],"version":"1.676"},{"feature":"App::Prove","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Archive::Tar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Attribute::Handlers","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"AutoLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","740","0"],"version":"5.74"},{"feature":"AutoSplit","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"B","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","820","0"],"version":"1.82"},{"feature":"B::Concise","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.004"},{"feature":"B::Deparse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"B::Op_private","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"B::Showlex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"B::Terse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"B::Xref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Benchmark","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"CPAN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"CPAN::Author","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Bundle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","500"],"version":"5.5005"},{"feature":"CPAN::CacheMgr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::DeferredCode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::Distribution","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Distroprefs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","0","100"],"version":"6.0001"},{"feature":"CPAN::Distrostatus","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::RecursiveDependency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Exception::blocked_urllist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"CPAN::Exception::yaml_not_installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::yaml_process_error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::FTP::netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"CPAN::FirstTime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","531","500"],"version":"5.5315"},{"feature":"CPAN::HTTP::Client","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HTTP::Credentials","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HandleConfig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","100"],"version":"5.5011"},{"feature":"CPAN::Index","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","120","0"],"version":"2.12"},{"feature":"CPAN::InfoObj","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Kwalify","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::LWP::UserAgent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Converter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::History","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Merge","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Prereqs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Requirements","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","140","0"],"version":"2.140"},{"feature":"CPAN::Meta::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Validator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","18","0"],"version":"0.018"},{"feature":"CPAN::Mirrors","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Nox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","970","0"],"version":"0.97"},{"feature":"CPAN::Plugin::Specfile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"CPAN::Prompt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Shell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","900"],"version":"5.5009"},{"feature":"CPAN::Tarzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::URL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"Carp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Carp::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Class::Struct","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","660","0"],"version":"0.66"},{"feature":"Compress::Raw::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Raw::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"Config::Extensions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"Config::Perl::V","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"Cwd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"DB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"DBM_Filter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"DBM_Filter::compress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::int32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::null","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DB_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","855","0"],"version":"1.855"},{"feature":"Data::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","176","0"],"version":"2.176"},{"feature":"Devel::PPPort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","620","0"],"version":"3.62"},{"feature":"Devel::Peek","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Devel::SelfStubber","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Digest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::MD5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","580","0"],"version":"2.58"},{"feature":"Digest::SHA","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","20","0"],"version":"6.02"},{"feature":"Digest::base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"DirHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Dumpvalue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"DynaLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"Encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","80","0"],"version":"3.08"},{"feature":"Encode::Alias","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"Encode::Byte","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::CJKConstants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::CN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::CN::HZ","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"Encode::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.05"},{"feature":"Encode::EBCDIC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::Encoder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::GSM0338","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"Encode::Guess","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::JP::H2Z","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::JP::JIS7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::KR::2022_KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::MIME::Header","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"Encode::MIME::Header::ISO_2022_JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Encode::MIME::Name","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Encode::Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::TW","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"Encode::Unicode::UTF7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"English","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Errno","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"Exporter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"Exporter::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"ExtUtils::CBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::BCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::MSVC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::aix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::android","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::dec_osf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::os2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Command::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","250","0"],"version":"0.25"},{"feature":"ExtUtils::Constant::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"ExtUtils::Constant::ProxySubs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"ExtUtils::Constant::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"ExtUtils::Constant::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"ExtUtils::Embed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","350","0"],"version":"1.35"},{"feature":"ExtUtils::Install","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Liblist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Liblist::Kid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_AIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Any","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_BeOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_DOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_NW5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_UWIN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win95","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Manifest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","730","0"],"version":"1.73"},{"feature":"ExtUtils::Miniperl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"ExtUtils::Mkbootstrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Mksymlists","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Packlist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::ParseXS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::CountLines","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Eval","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Utilities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::Typemaps","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::InputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::OutputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Type","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::XSSymSet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.4"},{"feature":"ExtUtils::testlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"Fatal","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"Fcntl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","140","0"],"version":"1.14"},{"feature":"File::Basename","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","850","0"],"version":"2.85"},{"feature":"File::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","600"],"version":"1.1006"},{"feature":"File::Copy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","350","0"],"version":"2.35"},{"feature":"File::DosGlob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"File::Fetch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.00"},{"feature":"File::Find","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","380","0"],"version":"1.38"},{"feature":"File::Glob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"File::GlobMapper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"File::Path","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"File::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::AmigaOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Epoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Temp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","231","100"],"version":"0.2311"},{"feature":"File::stat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"FileCache","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"FileHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Filter::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","960","0"],"version":"0.96"},{"feature":"Filter::Util::Call","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","600","0"],"version":"1.60"},{"feature":"FindBin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"GDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Getopt::Long","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","520","0"],"version":"2.52"},{"feature":"Getopt::Std","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"HTTP::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","76","0"],"version":"0.076"},{"feature":"Hash::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","240","0"],"version":"0.24"},{"feature":"Hash::Util::FieldHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"I18N::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"I18N::LangTags","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","450","0"],"version":"0.45"},{"feature":"I18N::LangTags::Detect","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"I18N::LangTags::List","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","400","0"],"version":"0.40"},{"feature":"I18N::Langinfo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","190","0"],"version":"0.19"},{"feature":"IO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Compress::Adapter::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base::Common","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::RawDeflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Extra","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Dir","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Pipe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Poll","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Seekable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Select","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::INET","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::IP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"IO::Socket::UNIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Uncompress::Adapter::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyUncompress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Gunzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::RawInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Unzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"IPC::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"IPC::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::Open2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"IPC::Open3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"IPC::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SharedMem","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SysV","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"JSON::PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"JSON::PP::Boolean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"List::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"List::Util::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Locale::Maketext","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Locale::Maketext::Guts","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::GutsLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","210","100"],"version":"0.21_01"},{"feature":"MIME::Base64","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"MIME::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"Math::BigFloat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigFloat::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigInt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Calc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::FastCalc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","500","900"],"version":"0.5009"},{"feature":"Math::BigInt::Lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigRat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","261","400"],"version":"0.2614"},{"feature":"Math::Complex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","590","200"],"version":"1.5902"},{"feature":"Math::Trig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","100"],"version":"1.03_01"},{"feature":"Memoize::AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Expire","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireFile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireTest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Module::CoreList","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::CoreList::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::Load","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"Module::Load::Conditional","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","740","0"],"version":"0.74"},{"feature":"Module::Loaded","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","80","0"],"version":"0.08"},{"feature":"Module::Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","37"],"version":"1.000037"},{"feature":"Moped::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10","0"],"version":"0.01"},{"feature":"NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"NEXT","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","670","100"],"version":"0.67_01"},{"feature":"Net::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Domain","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::A","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::E","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::I","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::L","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::dataconn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::NNTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::POP3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Ping","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","740","0"],"version":"2.74"},{"feature":"Net::SMTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Time","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::hostent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Net::netent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::protoent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::servent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"O","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"ODBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"OS2::DLL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"OS2::ExtAttr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::PrfDB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"OS2::REXX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Opcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","490","0"],"version":"1.49"},{"feature":"POSIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","970","0"],"version":"1.97"},{"feature":"Params::Check","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","380","0"],"version":"0.38"},{"feature":"Parse::CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"Perl::OSType","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.010"},{"feature":"PerlIO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"PerlIO::encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","0"],"version":"0.28"},{"feature":"PerlIO::mmap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","17","0"],"version":"0.017"},{"feature":"PerlIO::scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","310","0"],"version":"0.31"},{"feature":"PerlIO::via","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"PerlIO::via::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"Pod::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","740","0"],"version":"1.74"},{"feature":"Pod::Escapes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Pod::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Functions::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Html","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Pod::Man","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::ParseLink","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Perldoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","100"],"version":"3.2801"},{"feature":"Pod::Perldoc::BaseTo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::GetOptsOO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToANSI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToChecker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToMan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToNroff","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToPod","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToRtf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTerm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTk","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToXml","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::BlackBox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsXML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLBatch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLLegacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Pod::Simple::LinkSection","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Methody","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Progress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserEndToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserStartToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserTextToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::RTF","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Search","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::SimpleTree","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TextContent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TiedOutFH","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Transcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeDumb","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeSmart","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XHTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XMLOutStream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Overstrike","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Termcap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Usage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","10","0"],"version":"2.01"},{"feature":"SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"Safe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","430","0"],"version":"2.43"},{"feature":"Scalar::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Search::Dict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"SelectSaver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"SelfLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.030"},{"feature":"Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","230","0"],"version":"3.23"},{"feature":"Sub::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Sys::Hostname","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Sys::Syslog","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"TAP::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::ParallelSession","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness::Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Object","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Aggregator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Grammar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::IteratorFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Multiplexer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Bailout","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Comment","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Pragma","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Unknown","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::ResultFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Job","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Spinner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Source","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Executable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::RawTAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Reader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Writer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Term::ANSIColor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Term::Cap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Term::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","403","0"],"version":"1.403"},{"feature":"Term::ReadLine","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","310","0"],"version":"1.31"},{"feature":"Test2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Breakage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Instance","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Stack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Bail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Diag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Fail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Note","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Pass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::TAP::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::V2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Waiting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::About","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Amnesty","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Assert","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Control","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Render","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter::TAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor::Terminator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver::Files","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Tools::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::ExternalMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Facets2Legacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::IO::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","114","0"],"version":"2.114"},{"feature":"Test::Builder::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::TodoDiag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Test::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Capture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::CaptureRunner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Delegate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::use::ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Text::Abbrev","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Text::Balanced","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Text::ParseWords","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","300","0"],"version":"3.30"},{"feature":"Text::Tabs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Text::Wrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Thread","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","50","0"],"version":"3.05"},{"feature":"Thread::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","140","0"],"version":"3.14"},{"feature":"Thread::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","130","0"],"version":"2.13"},{"feature":"Tie::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Tie::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Tie::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","200","0"],"version":"4.2"},{"feature":"Tie::Hash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::Hash::NamedCapture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"Tie::Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"Tie::RefHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.40"},{"feature":"Tie::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::StdHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","600","0"],"version":"4.6"},{"feature":"Tie::SubstrHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Time::HiRes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","976","600"],"version":"1.9766"},{"feature":"Time::Local","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Time::Piece","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::Seconds","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::gmtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"Time::localtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Time::tm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"UNIVERSAL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["13","0","0"],"version":"13.0.0"},{"feature":"Unicode::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Big5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::GB2312","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::JISX0208","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Korean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Pinyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Stroke","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Zhuyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Normalize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","280","0"],"version":"1.28"},{"feature":"Unicode::UCD","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","750","0"],"version":"0.75"},{"feature":"User::grent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"User::pwent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"VMS::DCLsym","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"VMS::Filespec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"VMS::Stdio","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","450","0"],"version":"2.45"},{"feature":"Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","540","0"],"version":"0.54"},{"feature":"Win32API::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","120","301"],"version":"0.1203_01"},{"feature":"Win32API::File::inc::ExtUtils::Myconst2perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1"},{"feature":"Win32CORE","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"XS::APItest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"XS::Typemap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"XSLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","300","0"],"version":"0.30"},{"feature":"_charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"attributes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"autodie","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::Guard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::GuardStack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception::system","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::hints","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autouse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"bigint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bignum","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bigrat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"blib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"bytes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"deprecate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"diagnostics","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","370","0"],"version":"1.37"},{"feature":"encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","0","0"],"version":"3.00"},{"feature":"encoding::warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"experimental","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","22","0"],"version":"0.022"},{"feature":"feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"fields","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"filetest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"if","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","900"],"version":"0.0609"},{"feature":"integer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"less","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","650","0"],"version":"0.65"},{"feature":"locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"mro","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","250","0"],"version":"1.25"},{"feature":"ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"open","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"ops","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"overload","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"overloading","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","238","0"],"version":"0.238"},{"feature":"perlfaq","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","11","70"],"version":"5.20201107"},{"feature":"re","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"sigtrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"sort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"strict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"subs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"threads","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","260","0"],"version":"2.26"},{"feature":"threads::shared","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","240","0"],"version":"1.24"},{"feature":"vars","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"vmsish","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"warnings::register","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Bump again","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"perl","namespace":"language","version_requirements":[{"comparator":"eq","version":"5.32.1"}]}]},{"alternatives":[],"artifact_id":"48951744-f839-5031-8cf4-6e82a4be2089","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2020-05-28T03:10:35.310Z","ingredient_id":"15bb23b0-0232-5fb9-b791-3e5a905aa4a7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15bb23b0-0232-5fb9-b791-3e5a905aa4a7"},"name":"Data-UUID","normalized_name":"Data-UUID","primary_namespace":"language/perl","description":"Globally/Universally Unique Identifiers (GUIDs/UUIDs)"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-05-28T03:10:35.310Z","ingredient_id":"15bb23b0-0232-5fb9-b791-3e5a905aa4a7","ingredient_version_id":"e8527602-630b-57ab-b21f-a185719a6c91","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15bb23b0-0232-5fb9-b791-3e5a905aa4a7/versions/e8527602-630b-57ab-b21f-a185719a6c91","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15bb23b0-0232-5fb9-b791-3e5a905aa4a7"},"revision":6,"revision_timestamp":"2020-10-28T19:35:01.617Z","copyright_text":"TODO","documentation_uri":"https://metacpan.org/release/Ricardo SIGNES 😄/Data-UUID-1.226","is_binary_only":false,"license_expression":"[\"BSD-3-Clause\"]","release_timestamp":"2020-04-13T01:43:57.000Z","source_uri":"https://cpan.metacpan.org/authors/id/R/RJ/RJBS/Data-UUID-1.226.tar.gz","sortable_version":["1","226","0"],"version":"1.226","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/093d57ffa0d411a94bafafae495697db26f5c9d0277198fe3f7cf2be22996453/Data-UUID-1.226.tar.gz","scanner_license_expression":"[\"BSD-3-Clause\"]","source_checksum":"093d57ffa0d411a94bafafae495697db26f5c9d0277198fe3f7cf2be22996453","status":"stable","provided_features":[{"feature":"Data-UUID","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","226","0"],"version":"1.226"},{"feature":"Data::UUID","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","226","0"],"version":"1.226"}],"author_platform_user_id":"a19a07b9-313a-4e8f-916b-633457d72be8","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"0029ae25-8497-5130-8268-1f0fe26ccc77","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:20.957Z","ingredient_id":"c3ce160c-83dc-521f-9f12-116d103c0d5a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c3ce160c-83dc-521f-9f12-116d103c0d5a"},"name":"Importer","normalized_name":"Importer","primary_namespace":"language/perl","description":"Alternative but compatible interface to modules that export symbols."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-17T21:14:23.110Z","ingredient_id":"c3ce160c-83dc-521f-9f12-116d103c0d5a","ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c3ce160c-83dc-521f-9f12-116d103c0d5a/versions/2be11022-8f99-5eff-b80e-77f0fade3d27","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c3ce160c-83dc-521f-9f12-116d103c0d5a"},"revision":2,"revision_timestamp":"2020-11-04T20:14:53.251Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Importer-0.025","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2018-02-19T04:44:43.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Importer-0.025.tar.gz","sortable_version":["0","25","0"],"version":"0.025","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/0745138c487d74033d0cbeb36f06595036dc7e688f1a5dbec9cc2fa799e13946/Importer-0.025.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"0745138c487d74033d0cbeb36f06595036dc7e688f1a5dbec9cc2fa799e13946","status":"stable","provided_features":[{"feature":"Importer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","25","0"],"version":"0.025"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Data Acquisition import run with commit ID 0000000000000000000000000000000000000000 and reason: Could not be determined from the database query","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"6591f01d-939d-5080-bb1a-7816ff4d020b","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2020-07-24T03:05:37.269Z","ingredient_id":"2e19a04a-565b-5140-85d3-d102bb043ea8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2e19a04a-565b-5140-85d3-d102bb043ea8"},"name":"Long-Jump","normalized_name":"Long-Jump","primary_namespace":"language/perl","description":"Mechanism for returning to a specific point from a deeply nested stack."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-07-24T03:05:37.269Z","ingredient_id":"2e19a04a-565b-5140-85d3-d102bb043ea8","ingredient_version_id":"6c89ed56-ef22-541a-bf87-9ff4e10ee371","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2e19a04a-565b-5140-85d3-d102bb043ea8/versions/6c89ed56-ef22-541a-bf87-9ff4e10ee371","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2e19a04a-565b-5140-85d3-d102bb043ea8"},"revision":3,"revision_timestamp":"2020-10-28T19:26:23.384Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Long-Jump-0.000001","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2019-09-29T23:36:56.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Long-Jump-0.000001.tar.gz","sortable_version":["0","0","1"],"version":"0.000001","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/d5d6456d86992b559d8f66fc90960f919292cd3803c13403faac575762c77af4/Long-Jump-0.000001.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"d5d6456d86992b559d8f66fc90960f919292cd3803c13403faac575762c77af4","status":"stable","provided_features":[{"feature":"Long-Jump","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","1"],"version":"0.000001"},{"feature":"Long::Jump","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","1"],"version":"0.000001"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"7c541a6a-4dfd-5135-8b98-2b44b5d1a816","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:52.524Z","ingredient_id":"8967b3df-1d60-5fe5-a9d2-d1506eaee353","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8967b3df-1d60-5fe5-a9d2-d1506eaee353"},"name":"Module-Pluggable","normalized_name":"Module-Pluggable","primary_namespace":"language/perl","description":"automatically give your module the ability to have plugins"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:52.524Z","ingredient_id":"8967b3df-1d60-5fe5-a9d2-d1506eaee353","ingredient_version_id":"0f028feb-10aa-531d-9660-b56c19fb7b43","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8967b3df-1d60-5fe5-a9d2-d1506eaee353/versions/0f028feb-10aa-531d-9660-b56c19fb7b43","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8967b3df-1d60-5fe5-a9d2-d1506eaee353"},"revision":7,"revision_timestamp":"2020-10-28T19:20:35.640Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2015-08-05T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/S/SI/SIMONW/Module-Pluggable-5.2.tar.gz","sortable_version":["5","200","0"],"version":"5.2","activestate_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","camel_extras":{"mm_fullext":"Module/Pluggable"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/b3f2ad45e4fd10b3fb90d912d78d8b795ab295480db56dc64e86b9fa75c5a6df/Module-Pluggable-5.2.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"b3f2ad45e4fd10b3fb90d912d78d8b795ab295480db56dc64e86b9fa75c5a6df","status":"stable","provided_features":[{"feature":"Devel::InnerPackage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","200","0"],"version":"5.2"},{"feature":"Module-Pluggable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","200","0"],"version":"5.2"},{"feature":"Module::Pluggable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","200","0"],"version":"5.2"},{"feature":"Module::Pluggable::Object","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","200","0"],"version":"5.2"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"7f8a7197-b277-5621-a6f3-7f2ef32d871b","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:53:43.175Z","ingredient_id":"419b3d3f-2c08-58dc-b06a-5890d25878ab","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/419b3d3f-2c08-58dc-b06a-5890d25878ab"},"name":"Scope-Guard","normalized_name":"Scope-Guard","primary_namespace":"language/perl","description":"lexically-scoped resource management"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:53:43.175Z","ingredient_id":"419b3d3f-2c08-58dc-b06a-5890d25878ab","ingredient_version_id":"1ff5b410-a933-53c7-b3a1-f11524b53213","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/419b3d3f-2c08-58dc-b06a-5890d25878ab/versions/1ff5b410-a933-53c7-b3a1-f11524b53213","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/419b3d3f-2c08-58dc-b06a-5890d25878ab"},"revision":5,"revision_timestamp":"2020-10-28T19:21:37.794Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2015-07-19T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/C/CH/CHOCOLATE/Scope-Guard-0.21.tar.gz","sortable_version":["0","210","0"],"version":"0.21","activestate_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","camel_extras":{"mm_fullext":"Scope/Guard"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/8c9b1bea5c56448e2c3fadc65d05be9e4690a3823a80f39d2f10fdd8f777d278/Scope-Guard-0.21.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"8c9b1bea5c56448e2c3fadc65d05be9e4690a3823a80f39d2f10fdd8f777d278","status":"stable","provided_features":[{"feature":"Scope-Guard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","210","0"],"version":"0.21"},{"feature":"Scope::Guard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","210","0"],"version":"0.21"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"29983a5b-49c4-5cf4-a2c5-2490647d6910","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime"],"ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27"},{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:53:51.949Z","ingredient_id":"bd0582e7-a354-5e28-868e-c772965b793f","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bd0582e7-a354-5e28-868e-c772965b793f"},"name":"Sub-Info","normalized_name":"Sub-Info","primary_namespace":"language/perl","description":"Tool for inspecting subroutines."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-05-28T00:53:33.249Z","ingredient_id":"bd0582e7-a354-5e28-868e-c772965b793f","ingredient_version_id":"9e33e514-0b22-504b-8409-6d0bdbf86108","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bd0582e7-a354-5e28-868e-c772965b793f/versions/9e33e514-0b22-504b-8409-6d0bdbf86108","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bd0582e7-a354-5e28-868e-c772965b793f"},"revision":4,"revision_timestamp":"2021-02-16T16:39:17.261Z","copyright_text":"TODO","documentation_uri":"https://metacpan.org/release/Chad Granum/Sub-Info-0.002","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2016-12-24T12:17:00.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Sub-Info-0.002.tar.gz","sortable_version":["0","2","0"],"version":"0.002","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Sub/Info"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/ea3056d696bdeff21a99d340d5570887d39a8cc47bff23adfc82df6758cdd0ea/Sub-Info-0.002.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"ea3056d696bdeff21a99d340d5570887d39a8cc47bff23adfc82df6758cdd0ea","status":"stable","provided_features":[{"feature":"Sub-Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","0"],"version":"0.002"},{"feature":"Sub::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","0"],"version":"0.002"}],"author_platform_user_id":"8fd0aa9c-0483-4ee7-9197-96c9194c0318","comment":"Add build dependencies for Auto-intstall - Importer","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"4d95557d-2200-5a56-a809-4ea3d3502b20","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime"],"ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27"},{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:54:02.753Z","ingredient_id":"d8ad5efe-897b-5342-8ad1-f4abbd328ab4","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d8ad5efe-897b-5342-8ad1-f4abbd328ab4"},"name":"Term-Table","normalized_name":"Term-Table","primary_namespace":"language/perl","description":"Format a header and rows into a table"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-17T21:15:15.752Z","ingredient_id":"d8ad5efe-897b-5342-8ad1-f4abbd328ab4","ingredient_version_id":"7e483f34-00ad-523a-91be-e9ddf74366a5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d8ad5efe-897b-5342-8ad1-f4abbd328ab4/versions/7e483f34-00ad-523a-91be-e9ddf74366a5","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d8ad5efe-897b-5342-8ad1-f4abbd328ab4"},"revision":3,"revision_timestamp":"2021-02-19T04:13:53.554Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Term-Table-0.015","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2019-11-19T07:59:44.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Term-Table-0.015.tar.gz","sortable_version":["0","15","0"],"version":"0.015","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/d8a18b2801f91f0e5d747147ce786964a76f91d18568652908a3dc06a9b948d5/Term-Table-0.015.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"d8a18b2801f91f0e5d747147ce786964a76f91d18568652908a3dc06a9b948d5","status":"stable","provided_features":[{"feature":"Term-Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::Cell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::CellStack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::LineBreak","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::Spacer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"}],"author_platform_user_id":"8fd0aa9c-0483-4ee7-9197-96c9194c0318","comment":"Data Acquisition import run with commit ID 0000000000000000000000000000000000000000 and reason: Could not be determined from the database query","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"288aa0db-c0e4-55e7-8f67-fc2da409be70","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"1ff5b410-a933-53c7-b3a1-f11524b53213"},{"dependency_types":["runtime"],"ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27"},{"dependency_types":["runtime"],"ingredient_version_id":"4bd9f2db-1c09-5a14-82a3-7cb6d966d18c"},{"dependency_types":["runtime"],"ingredient_version_id":"6c89ed56-ef22-541a-bf87-9ff4e10ee371"},{"dependency_types":["runtime"],"ingredient_version_id":"7e483f34-00ad-523a-91be-e9ddf74366a5"},{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"},{"dependency_types":["runtime"],"ingredient_version_id":"d85188d8-231d-589f-9bdd-fc5667cc2d2f"},{"dependency_types":["runtime"],"ingredient_version_id":"e8527602-630b-57ab-b21f-a185719a6c91"},{"dependency_types":["runtime"],"ingredient_version_id":"ee3bc68e-abb3-58ff-aa9c-60b7412df7e2"},{"dependency_types":["runtime"],"ingredient_version_id":"fa7a0c73-1e93-5e08-8f6b-a009e82d7179"}],"ingredient":{"creation_timestamp":"2020-05-28T03:57:35.831Z","ingredient_id":"7cc539a3-0ee6-5e80-a948-dbd38b3f26db","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7cc539a3-0ee6-5e80-a948-dbd38b3f26db"},"name":"Test2-Harness","normalized_name":"Test2-Harness","primary_namespace":"language/perl","description":"A new and improved test harness with better Test2 integration."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2021-01-13T02:09:51.439Z","ingredient_id":"7cc539a3-0ee6-5e80-a948-dbd38b3f26db","ingredient_version_id":"9c514f0f-5abb-546a-840a-1c97f2010c78","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7cc539a3-0ee6-5e80-a948-dbd38b3f26db/versions/9c514f0f-5abb-546a-840a-1c97f2010c78","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7cc539a3-0ee6-5e80-a948-dbd38b3f26db"},"revision":2,"revision_timestamp":"2021-02-02T23:55:10.154Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Test2-Harness-1.000042","is_binary_only":false,"license_expression":"Artistic-1.0-Perl, GPL-1.0-or-later","release_timestamp":"2020-11-18T06:47:53.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test2-Harness-1.000042.tar.gz","sortable_version":["1","0","42"],"version":"1.000042","activestate_license_expression":"Artistic-1.0-Perl, GPL-1.0-or-later","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/aaf231a68af1a6ffd6a11188875fcf572e373e43c8285945227b9d687b43db2d/Test2-Harness-1.000042.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"aaf231a68af1a6ffd6a11188875fcf572e373e43c8285945227b9d687b43db2d","status":"stable","provided_features":[{"feature":"App::Yath","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::auditor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::collector","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::failed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::help","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::init","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::projects","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::reload","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::replay","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::run","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::runner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::spawn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::speedtag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::start","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::stop","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::times","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::watch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::which","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Converting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Option","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Display","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Finder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Logging","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Persist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::PreCommand","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Run","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Runner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Workspace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin::Git","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin::Notify","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin::SelfTest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin::SysInfo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin::YathUI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2-Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Formatter::QVF","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Formatter::Stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Formatter::Test2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Formatter::Test2::Composer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Auditor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Auditor::TimeTracker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Auditor::Watcher","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Collector","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Collector::JobDir","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Collector::TapParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Finder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::IPC::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Log","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Log::CoverageAggregator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Renderer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Renderer::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Run","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::DepTracer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Job","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Preload","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Preload::Stage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Preloader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Preloader::Stage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Resource","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Run","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Spawn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Spawn::Run","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::State","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Settings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Settings::Prefix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::TestFile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::File::JSON","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::File::JSONL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::File::Stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::File::Value","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::JSON","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::Term","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::UUID","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Tools::HarnessTester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"}],"author_platform_user_id":"2e044215-1b51-498f-a440-ae0cc11bdd4c","comment":"Fix improper Perl core version","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"282e3768-e12a-51ed-831f-7cbc212ba8bd","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2020-08-04T05:03:47.447Z","ingredient_id":"475ab2a1-ee4c-5337-b9c0-5991daa7d9ad","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/475ab2a1-ee4c-5337-b9c0-5991daa7d9ad"},"name":"Test2-Plugin-MemUsage","normalized_name":"Test2-Plugin-MemUsage","primary_namespace":"language/perl","description":"Collect and display memory usage information."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-08-04T05:03:47.447Z","ingredient_id":"475ab2a1-ee4c-5337-b9c0-5991daa7d9ad","ingredient_version_id":"d85188d8-231d-589f-9bdd-fc5667cc2d2f","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/475ab2a1-ee4c-5337-b9c0-5991daa7d9ad/versions/d85188d8-231d-589f-9bdd-fc5667cc2d2f","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/475ab2a1-ee4c-5337-b9c0-5991daa7d9ad"},"revision":3,"revision_timestamp":"2020-10-28T19:33:54.008Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Test2-Plugin-MemUsage-0.002003","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2020-02-26T16:09:51.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test2-Plugin-MemUsage-0.002003.tar.gz","sortable_version":["0","2","3"],"version":"0.002003","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/5e0662d5a823ae081641f5ce82843111eec1831cd31f883a6c6de54afdf87c25/Test2-Plugin-MemUsage-0.002003.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"5e0662d5a823ae081641f5ce82843111eec1831cd31f883a6c6de54afdf87c25","status":"stable","provided_features":[{"feature":"Test2-Plugin-MemUsage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","3"],"version":"0.002003"},{"feature":"Test2::Plugin::MemUsage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","3"],"version":"0.002003"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"5ad88c8a-bc8f-50a0-9f61-74856cd28017","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:54:23.311Z","ingredient_id":"ad9a26f2-c23b-54b1-ada2-3327ff7fd40d","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ad9a26f2-c23b-54b1-ada2-3327ff7fd40d"},"name":"Test2-Plugin-NoWarnings","normalized_name":"Test2-Plugin-NoWarnings","primary_namespace":"language/perl","description":"Fail if tests warn"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-05-28T00:53:49.862Z","ingredient_id":"ad9a26f2-c23b-54b1-ada2-3327ff7fd40d","ingredient_version_id":"b8f76881-09d4-53fd-8cc6-e595b6d69132","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ad9a26f2-c23b-54b1-ada2-3327ff7fd40d/versions/b8f76881-09d4-53fd-8cc6-e595b6d69132","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ad9a26f2-c23b-54b1-ada2-3327ff7fd40d"},"revision":3,"revision_timestamp":"2020-10-28T19:31:31.379Z","copyright_text":"TODO","documentation_uri":"https://metacpan.org/release/Dave Rolsky/Test2-Plugin-NoWarnings-0.06","is_binary_only":false,"license_expression":"[\"Artistic-2.0\"]","release_timestamp":"2017-06-04T22:24:22.000Z","source_uri":"https://cpan.metacpan.org/authors/id/D/DR/DROLSKY/Test2-Plugin-NoWarnings-0.06.tar.gz","sortable_version":["0","60","0"],"version":"0.06","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Test2/Plugin/NoWarnings"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/8288c1d934f69a03224598fbb715adc079c0d1609bfbaea6c88682aab1995800/Test2-Plugin-NoWarnings-0.06.tar.gz","scanner_license_expression":"[\"Artistic-2.0\"]","source_checksum":"8288c1d934f69a03224598fbb715adc079c0d1609bfbaea6c88682aab1995800","status":"stable","provided_features":[{"feature":"Test2-Plugin-NoWarnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"Test2::Event::Warning","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"Test2::Plugin::NoWarnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"c3e652a7-676e-594f-b87f-93d19122f3f4","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"},{"dependency_types":["runtime"],"ingredient_version_id":"e8527602-630b-57ab-b21f-a185719a6c91"}],"ingredient":{"creation_timestamp":"2020-08-04T05:03:50.581Z","ingredient_id":"cfacafbc-90b3-50d6-a0d3-3320ec24434c","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/cfacafbc-90b3-50d6-a0d3-3320ec24434c"},"name":"Test2-Plugin-UUID","normalized_name":"Test2-Plugin-UUID","primary_namespace":"language/perl","description":"Use REAL UUIDs in Test2"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-08-04T05:03:50.581Z","ingredient_id":"cfacafbc-90b3-50d6-a0d3-3320ec24434c","ingredient_version_id":"4bd9f2db-1c09-5a14-82a3-7cb6d966d18c","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/cfacafbc-90b3-50d6-a0d3-3320ec24434c/versions/4bd9f2db-1c09-5a14-82a3-7cb6d966d18c","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/cfacafbc-90b3-50d6-a0d3-3320ec24434c"},"revision":3,"revision_timestamp":"2020-10-28T19:24:08.293Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Test2-Plugin-UUID-0.002001","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2019-08-16T22:46:14.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test2-Plugin-UUID-0.002001.tar.gz","sortable_version":["0","2","1"],"version":"0.002001","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/4c6c8d484d7153d8779dc155a992b203095b5c5aa1cfb1ee8bcedcd0601878c9/Test2-Plugin-UUID-0.002001.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"4c6c8d484d7153d8779dc155a992b203095b5c5aa1cfb1ee8bcedcd0601878c9","status":"stable","provided_features":[{"feature":"Test2-Plugin-UUID","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","1"],"version":"0.002001"},{"feature":"Test2::Plugin::UUID","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","1"],"version":"0.002001"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"30dc7965-0a69-5686-831a-e563fa73a98c","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"0f028feb-10aa-531d-9660-b56c19fb7b43"},{"dependency_types":["runtime"],"ingredient_version_id":"1ff5b410-a933-53c7-b3a1-f11524b53213"},{"dependency_types":["build","runtime"],"ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27"},{"dependency_types":["runtime"],"ingredient_version_id":"7e483f34-00ad-523a-91be-e9ddf74366a5"},{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["runtime"],"ingredient_version_id":"9e33e514-0b22-504b-8409-6d0bdbf86108"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:54:24.108Z","ingredient_id":"9bd2d82e-5607-5b1e-9f58-05d8ce6a171b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9bd2d82e-5607-5b1e-9f58-05d8ce6a171b"},"name":"Test2-Suite","normalized_name":"Test2-Suite","primary_namespace":"language/perl","description":"Distribution with a rich set of tools built upon the Test2 framework."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-17T20:03:44.338Z","ingredient_id":"9bd2d82e-5607-5b1e-9f58-05d8ce6a171b","ingredient_version_id":"fa7a0c73-1e93-5e08-8f6b-a009e82d7179","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9bd2d82e-5607-5b1e-9f58-05d8ce6a171b/versions/fa7a0c73-1e93-5e08-8f6b-a009e82d7179","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9bd2d82e-5607-5b1e-9f58-05d8ce6a171b"},"revision":2,"revision_timestamp":"2021-02-19T04:22:07.305Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Test2-Suite-0.000127","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2019-10-31T11:27:54.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test2-Suite-0.000127.tar.gz","sortable_version":["0","0","127"],"version":"0.000127","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/09443e7c99f9bef2c3f5999b919800db7d265b2c55f177726d3e5a61d8dbe690/Test2-Suite-0.000127.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"09443e7c99f9bef2c3f5999b919800db7d265b2c55f177726d3e5a61d8dbe690","status":"stable","provided_features":[{"feature":"Test2-Suite","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::AsyncSubtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::AsyncSubtest::Event::Attach","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::AsyncSubtest::Event::Detach","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::AsyncSubtest::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::AsyncSubtest::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Bundle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Bundle::Extended","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Bundle::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Bundle::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Bag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Bool","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Custom","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::DeepRef","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Delta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::EventMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Float","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Hash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Negatable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Number","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Object","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::OrderedSubset","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Pattern","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Ref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Set","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::String","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Undef","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Wildcard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::EndToEnd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::Hubs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::Utilities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Contributing","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Testing","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Testing::Introduction","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Testing::Migrating","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Testing::Planning","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Testing::Todo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::FirstTool","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Nesting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Plugin::TestExit","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Plugin::TestingDone","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Plugin::ToolCompletes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Plugin::ToolStarts","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::TestBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Testing","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Mock","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::BailOnFail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::DieOnFail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::ExitSummary","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::SRand","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::Times","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::UTF8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::AuthorTesting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::EnvVar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::Fork","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::Perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::RealFork","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::Threads","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Suite","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Todo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::AsyncSubtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Basic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Class","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::ClassicCompare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Defer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Exports","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::GenTemp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Grab","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Mock","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Ref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Target","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Grabber","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Ref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Stash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Sub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Table::Cell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Table::LineBreak","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Term","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Times","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::V0","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::BlockBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::Build","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::Runner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::Task","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::Task::Action","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::Task::Group","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"}],"author_platform_user_id":"8fd0aa9c-0483-4ee7-9197-96c9194c0318","comment":"Data Acquisition import run with commit ID 0000000000000000000000000000000000000000 and reason: Could not be determined from the database query","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"3ac7b175-6fc9-569c-bb15-785fe14298a2","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["runtime"],"ingredient_version_id":"bac128cd-1439-5857-b5b5-5633763f78d5"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"},{"dependency_types":["runtime"],"ingredient_version_id":"e41f38b7-11e6-52e8-9f12-eba3533f3055"}],"ingredient":{"creation_timestamp":"2019-10-01T16:54:59.206Z","ingredient_id":"378500a3-1420-5d36-9033-97913dba50c4","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/378500a3-1420-5d36-9033-97913dba50c4"},"name":"Win32-Console-ANSI","normalized_name":"Win32-Console-ANSI","primary_namespace":"language/perl","description":"Perl extension to emulate ANSI console on Win32 system."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:54:59.206Z","ingredient_id":"378500a3-1420-5d36-9033-97913dba50c4","ingredient_version_id":"e0f207c2-9922-51e3-95cf-e586da39436e","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/378500a3-1420-5d36-9033-97913dba50c4/versions/e0f207c2-9922-51e3-95cf-e586da39436e","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/378500a3-1420-5d36-9033-97913dba50c4"},"revision":8,"revision_timestamp":"2020-10-28T19:34:30.379Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-10-24T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/J/JL/JLMOREL/Win32-Console-ANSI-1.11.tar.gz","sortable_version":["1","110","0"],"version":"1.11","activestate_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","camel_extras":{"mm_fullext":"Win32/Console/ANSI","require_os":["MSWin32","MSWin32"]},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/18b547c7548e1de70965a600bdf37ba27fe1ee5913ca1374a576033d545c60c4/Win32-Console-ANSI-1.11.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"18b547c7548e1de70965a600bdf37ba27fe1ee5913ca1374a576033d545c60c4","status":"stable","provided_features":[{"feature":"Win32-Console-ANSI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"Win32::Console::ANSI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"}],"author_platform_user_id":"a19a07b9-313a-4e8f-916b-633457d72be8","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"Win32-Console-ANSI","namespace":"language/perl","version_requirements":null}]},{"alternatives":[],"artifact_id":"d806994e-1154-5b81-9104-b8d4d4dd72a4","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:55:05.526Z","ingredient_id":"af49cff4-b49e-5283-b849-26aa66f7e082","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/af49cff4-b49e-5283-b849-26aa66f7e082"},"name":"Win32-Pipe","normalized_name":"Win32-Pipe","primary_namespace":"language/perl","description":"Win32 Named Pipe"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-05-28T00:54:06.553Z","ingredient_id":"af49cff4-b49e-5283-b849-26aa66f7e082","ingredient_version_id":"bac128cd-1439-5857-b5b5-5633763f78d5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/af49cff4-b49e-5283-b849-26aa66f7e082/versions/bac128cd-1439-5857-b5b5-5633763f78d5","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/af49cff4-b49e-5283-b849-26aa66f7e082"},"revision":4,"revision_timestamp":"2020-11-03T18:12:27.020Z","copyright_text":"TODO","documentation_uri":"https://metacpan.org/release/Jan Dubois/Win32-Pipe-0.025","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2013-12-05T09:18:51.000Z","source_uri":"https://cpan.metacpan.org/authors/id/J/JD/JDB/Win32-Pipe-0.025.tar.gz","sortable_version":["0","25","0"],"version":"0.025","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Win32/Pipe","require_os":["MSWin32","MSWin32"]},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/63bd454c4e29a856b28a764cf8f7ca0873b060045f394c5a3583111ac49da252/Win32-Pipe-0.025.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"63bd454c4e29a856b28a764cf8f7ca0873b060045f394c5a3583111ac49da252","status":"stable","provided_features":[{"feature":"Win32-Pipe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","25","0"],"version":"0.025"},{"feature":"Win32::Pipe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","25","0"],"version":"0.025"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":[{"creation_timestamp":"2020-11-03T18:12:26.459Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/4cc8004c-0c2b-4bdc-b431-0504b9f8b93b"},"patch_id":"4cc8004c-0c2b-4bdc-b431-0504b9f8b93b","conditions":null,"content":"s3://platform-sources/patches/b791da67a771fa2bc3957ca75d089edee1a8cfc426416a527067a05a34866e49.patch","description":"Win32-Pipe ~ In the CPipe class, szError is defined as an array of strings\n(LPSTR szError[ERROR_TEXT_SIZE]) but is used everywhere as a string\nof length ERROR_TEXT_SIZE, being explicitly cast to char * in a\nnumber of places. Newer MinGW GCC versions catch this when an\nattempt is made to null terminate the string (array of strings)\nwith a 0 character which is a char, not a char * and quite\nrightly call out the illegal implied cast.\n\nChange szError to be of type CHAR[] to reflect the actual usage.","sequence_number":1}],"resolved_requirements":[]},{"alternatives":[],"artifact_id":"08f7470e-bd8b-5ef1-a94d-a04960d355eb","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:55:05.914Z","ingredient_id":"1abb3432-3102-5dac-9dd7-cc34c7978b7f","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/1abb3432-3102-5dac-9dd7-cc34c7978b7f"},"name":"Win32-Process","normalized_name":"Win32-Process","primary_namespace":"language/perl","description":"Create and manipulate processes"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:55:05.914Z","ingredient_id":"1abb3432-3102-5dac-9dd7-cc34c7978b7f","ingredient_version_id":"e41f38b7-11e6-52e8-9f12-eba3533f3055","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/1abb3432-3102-5dac-9dd7-cc34c7978b7f/versions/e41f38b7-11e6-52e8-9f12-eba3533f3055","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/1abb3432-3102-5dac-9dd7-cc34c7978b7f"},"revision":5,"revision_timestamp":"2020-10-28T19:34:40.682Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-Perl OR GPL-1.0-or-later","release_timestamp":"2013-12-11T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/J/JD/JDB/Win32-Process-0.16.tar.gz","sortable_version":["0","160","0"],"version":"0.16","activestate_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","camel_extras":{"mm_fullext":"Win32/Process","require_os":["MSWin32","MSWin32"]},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/d9030c50aff11b63f6b3e482b9d81a68472812eddc346e3273c4996814ece6e3/Win32-Process-0.16.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"d9030c50aff11b63f6b3e482b9d81a68472812eddc346e3273c4996814ece6e3","status":"stable","provided_features":[{"feature":"Win32-Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","160","0"],"version":"0.16"},{"feature":"Win32::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","160","0"],"version":"0.16"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"c1e8c6c4-ea11-55a4-b415-97da2d32121e","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2020-08-04T03:41:54.942Z","ingredient_id":"d467d24f-854c-5970-acac-acda9cb97d15","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d467d24f-854c-5970-acac-acda9cb97d15"},"name":"goto-file","normalized_name":"goto-file","primary_namespace":"language/perl","description":"Stop parsing the current file and move on to a different one.","website":"https://github.com/exodist/goto-file"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-08-04T03:41:54.942Z","ingredient_id":"d467d24f-854c-5970-acac-acda9cb97d15","ingredient_version_id":"ee3bc68e-abb3-58ff-aa9c-60b7412df7e2","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d467d24f-854c-5970-acac-acda9cb97d15/versions/ee3bc68e-abb3-58ff-aa9c-60b7412df7e2","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d467d24f-854c-5970-acac-acda9cb97d15"},"revision":3,"revision_timestamp":"2020-10-28T19:35:27.454Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/goto-file-0.005","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2017-10-24T15:33:30.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/goto-file-0.005.tar.gz","sortable_version":["0","5","0"],"version":"0.005","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/c6cdd5ee4a6cdcbdbf314d92a4f9985dbcdf9e4258048cae76125c052aa31f77/goto-file-0.005.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"c6cdd5ee4a6cdcbdbf314d92a4f9985dbcdf9e4258048cae76125c052aa31f77","status":"stable","provided_features":[{"feature":"goto-file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","5","0"],"version":"0.005"},{"feature":"goto::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","5","0"],"version":"0.005"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]}],"solver_version":1} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-bundle.json b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-bundle.json new file mode 100644 index 0000000000..d181ba904e --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-bundle.json @@ -0,0 +1 @@ +{"camel_flags":[],"from_recipe_store":true,"image":{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"},"is_indemnified":false,"platform":{"cpu_architecture":{"cpu_architecture_id":"4cdba18d-0851-4925-9ae5-9c8a2987828a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/cpu-architectures/4cdba18d-0851-4925-9ae5-9c8a2987828a"},"bit_width":"64","name":"x86","provided_features":[{"feature":"x86 64-bit","is_activestate_version":false,"is_default_provider":true,"namespace":"cpu-architecture","sortable_version":["1","0"],"version":"1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"cpu_extensions":[],"creation_timestamp":"2021-01-15T18:05:36.924Z","display_name":"CentOS 8, Linux 4.18.0, glibc 2.28 x86 64-bit","end_of_support_date":"2025-12-31","images":[{"image_id":"00216735-694e-4ef8-a7d5-7724b9200be0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/00216735-694e-4ef8-a7d5-7724b9200be0"},"name":"docker-registry.activestate.build/activestate/centos-8-build","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","1","0"],"version":"1.1","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"eq","sortable_version":[]}]}],"revision":1,"revision_timestamp":"2021-01-15T18:07:52.645Z"},{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"}],"is_user_visible":true,"kernel":{"kernel_id":"ef737274-fff9-4164-b72b-88067613f822","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822"},"name":"Linux"},"kernel_version":{"kernel_version_id":"61f9365e-03ed-448f-9a24-2b845727e4f5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822/versions/61f9365e-03ed-448f-9a24-2b845727e4f5"},"sortable_version":["4","18","0","0"],"version":"4.18.0","provided_features":[{"feature":"Linux","is_activestate_version":false,"is_default_provider":true,"namespace":"kernel","sortable_version":["4","18","0","0"],"version":"4.18.0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:04.588Z"},"libc":{"libc_id":"09a2eb42-ad34-4734-a93e-4b97395577df","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df"},"name":"glibc"},"libc_version":{"libc_version_id":"22d234e7-145e-4688-9d05-ee164b4ffa12","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df/versions/22d234e7-145e-4688-9d05-ee164b4ffa12"},"sortable_version":["2","28","0"],"version":"2.28","provided_features":[{"feature":"glibc","is_activestate_version":false,"is_default_provider":true,"namespace":"libc","sortable_version":["2","28","0"],"version":"2.28"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:19.136Z"},"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/platforms/7c998ec2-7491-4e75-be4d-8885800ef5f2"},"operating_system":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99"},"operating_system_id":"7b3a2dbb-d543-48d6-8390-7e7b63751e99","has_libc":true,"name":"CentOS"},"operating_system_version":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99/versions/42cab97b-9d80-407f-89a8-230836868e88"},"operating_system_version_id":"42cab97b-9d80-407f-89a8-230836868e88","sortable_version":["8","0"],"version":"8","provided_features":[{"feature":"CentOS","is_activestate_version":false,"is_default_provider":true,"namespace":"operating-system","sortable_version":["8","0"],"version":"8"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:50.448Z"},"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2"},"recipe_id":"410f6ec8-2e41-5085-9ffe-b6860b7f60d3","recipe_store_timestamp":"2021-02-20T07:48:45.559Z","resolved_ingredients":[{"alternatives":[],"artifact_id":"8c2f830d-1b31-5448-a0a4-aa9d8fcacc4b","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-09-30T17:54:34.749Z","ingredient_id":"888f7a88-fdc8-58f7-8e34-1e28425f3c5a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/888f7a88-fdc8-58f7-8e34-1e28425f3c5a"},"name":"noop-builder","normalized_name":"noop-builder","primary_namespace":"builder","description":"Does the thing - which is nothing - successfully! Hooray!","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-30T17:54:34.749Z","ingredient_id":"888f7a88-fdc8-58f7-8e34-1e28425f3c5a","ingredient_version_id":"fcfb451f-d86d-5977-ae48-f27610f7d5ab","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/888f7a88-fdc8-58f7-8e34-1e28425f3c5a/versions/fcfb451f-d86d-5977-ae48-f27610f7d5ab","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/888f7a88-fdc8-58f7-8e34-1e28425f3c5a"},"revision":2,"revision_timestamp":"2020-10-30T17:03:52.420Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-06-25T07:05:14.000Z","source_uri":"https://github.com/ActiveState/platform-builders/tree/noop-builder-1.0.0/builder/noop-builder","sortable_version":["1","0","0","0"],"version":"1.0.0","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/65710b34592066ff70669c67ea0031b138f4249c768c429b74f6f2efe781e077/noop-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"65710b34592066ff70669c67ea0031b138f4249c768c429b74f6f2efe781e077","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"noop-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Initial upload.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"cf3d86c1-2587-564e-a7b2-0cf109ce263e","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-08-10T23:47:40.385Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"name":"perl-core-builder","normalized_name":"perl-core-builder","primary_namespace":"builder","description":"Builds the core Perl interpreter on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-30T17:58:38.567Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31/versions/d5ac8c7c-b025-5418-ab77-a139e60e1d41","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"revision":2,"revision_timestamp":"2020-10-30T17:04:06.702Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-06-25T07:05:14.000Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-core-builder","sortable_version":["1","0","23","0"],"version":"1.0.23","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374/perl-core-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"perl-core-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","23","0"],"version":"1.0.23"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Initial builder for perl 5.30+","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"a1ebbc88-daeb-5588-8086-c99de70eabf7","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"ed446cc4-4e4d-5986-ad77-ed04a3b2e58b"}],"ingredient":{"creation_timestamp":"2020-08-10T23:48:55.390Z","ingredient_id":"196722f9-5600-5d89-9c47-42460922fdb1","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1"},"name":"perl-module-builder","normalized_name":"perl-module-builder","primary_namespace":"builder","description":"Builds Perl modules on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-12-07T20:54:12.006Z","ingredient_id":"196722f9-5600-5d89-9c47-42460922fdb1","ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1/versions/c4164b54-9b8f-55fc-ae5a-cd47c6389687","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1"},"revision":1,"revision_timestamp":"2020-12-07T20:54:12.006Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-12-07T20:23:01.043Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-module-builder","sortable_version":["1","0","36","0"],"version":"1.0.36","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/bb8bb535334fb012df0550a528692f4826893b91b055ac73ffb37dd00322a7b6/perl-module-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"bb8bb535334fb012df0550a528692f4826893b91b055ac73ffb37dd00322a7b6","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"perl-module-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","36","0"],"version":"1.0.36"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Created new version 1.0.36 from 1.0.35.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"f7c88044-fdcd-5023-a0ce-9c4a6fcc2708","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-08-10T23:48:13.169Z","ingredient_id":"4c0fd8d2-5c39-5ecf-958e-325efdea1ef2","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2"},"name":"perl-module-lib","normalized_name":"perl-module-lib","primary_namespace":"builder-lib","description":"Builds Perl modules on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-12-07T20:54:42.776Z","ingredient_id":"4c0fd8d2-5c39-5ecf-958e-325efdea1ef2","ingredient_version_id":"ed446cc4-4e4d-5986-ad77-ed04a3b2e58b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2/versions/ed446cc4-4e4d-5986-ad77-ed04a3b2e58b","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2"},"revision":2,"revision_timestamp":"2020-12-10T17:22:10.292Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-12-07T20:25:59.954Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-module-lib","sortable_version":["1","0","36","0"],"version":"1.0.36","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/abdb22574b2300f30e98ab9239892f379c0c60bf33634a2b49518bddc730413d/perl-module-lib.tar.gz","scanner_license_expression":"unknown","source_checksum":"abdb22574b2300f30e98ab9239892f379c0c60bf33634a2b49518bddc730413d","status":"stable","provided_features":[{"feature":"perl-module-lib","is_activestate_version":false,"is_default_provider":true,"namespace":"builder-lib","sortable_version":["1","0","36","0"],"version":"1.0.36"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"Created new version 1.0.36 from 1.0.35.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"c894fa23-0416-556d-9ca5-fdf9375595bc","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"9c514f0f-5abb-546a-840a-1c97f2010c78"},{"dependency_types":["build"],"ingredient_version_id":"b8f76881-09d4-53fd-8cc6-e595b6d69132"},{"dependency_types":["build"],"ingredient_version_id":"fa7a0c73-1e93-5e08-8f6b-a009e82d7179"},{"dependency_types":["build"],"ingredient_version_id":"fcfb451f-d86d-5977-ae48-f27610f7d5ab"}],"ingredient":{"creation_timestamp":"2020-11-04T00:07:57.937Z","ingredient_id":"bcdc3172-a686-5b04-aace-400fc127d5a4","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bcdc3172-a686-5b04-aace-400fc127d5a4"},"name":"Testing","normalized_name":"Testing","primary_namespace":"bundles/perl","description":"Modules and tools for automating testing, test frameworks, etc."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-11-04T00:07:57.937Z","ingredient_id":"bcdc3172-a686-5b04-aace-400fc127d5a4","ingredient_version_id":"21141224-b8b8-565c-8fdf-4ded24fcbd8d","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bcdc3172-a686-5b04-aace-400fc127d5a4/versions/21141224-b8b8-565c-8fdf-4ded24fcbd8d","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bcdc3172-a686-5b04-aace-400fc127d5a4"},"revision":3,"revision_timestamp":"2020-11-04T23:20:03.446Z","copyright_text":"To be added.","is_binary_only":true,"license_expression":"Artistic-2.0","release_timestamp":"2017-12-29T00:00:00.000Z","sortable_version":["1","0","0"],"version":"1.00","activestate_license_expression":"[\"Artistic-2.0\"]","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/internal/3b96afde8004eb24d11bfd06c63048414c1cb6e8abedf0730e5141fc6c16f540/void.tar.gz","scanner_license_expression":"[\"Artistic-2.0\"]","source_checksum":"3b96afde8004eb24d11bfd06c63048414c1cb6e8abedf0730e5141fc6c16f540","status":"stable","provided_features":[{"feature":"Testing","is_activestate_version":false,"is_default_provider":true,"namespace":"bundles/perl","sortable_version":["1","0","0"],"version":"1.00"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"Testing","namespace":"bundles/perl","version_requirements":[{"comparator":"eq","version":"1.00"}]}]},{"alternatives":[],"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41"}],"ingredient":{"creation_timestamp":"2019-10-01T16:56:32.665Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"name":"perl","normalized_name":"perl","primary_namespace":"language","description":"Practical Extraction and Report Language"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2021-01-29T18:11:47.039Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206/versions/86005392-bdbf-59bd-a716-70ce7fcd3a66","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"revision":3,"revision_timestamp":"2021-02-03T21:14:56.873Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"1970-01-01T00:00:00.000Z","source_uri":"https://cpan.metacpan.org/authors/id/S/SH/SHAY/perl-5.32.1.tar.gz","sortable_version":["5","32","1"],"version":"5.32.1","activestate_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/language/03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c/perl-5.32.1.tar.gz","scanner_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","source_checksum":"03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c","status":"stable","provided_features":[{"feature":"alternative-built-language","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1","0"],"version":"5.32.1"},{"feature":"perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1"],"version":"5.32.1"},{"feature":"Amiga::ARexx","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","50","0"],"version":"0.05"},{"feature":"Amiga::Exec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"App::Cpan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","676","0"],"version":"1.676"},{"feature":"App::Prove","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Archive::Tar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Attribute::Handlers","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"AutoLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","740","0"],"version":"5.74"},{"feature":"AutoSplit","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"B","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","820","0"],"version":"1.82"},{"feature":"B::Concise","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.004"},{"feature":"B::Deparse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"B::Op_private","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"B::Showlex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"B::Terse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"B::Xref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Benchmark","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"CPAN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"CPAN::Author","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Bundle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","500"],"version":"5.5005"},{"feature":"CPAN::CacheMgr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::DeferredCode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::Distribution","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Distroprefs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","0","100"],"version":"6.0001"},{"feature":"CPAN::Distrostatus","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::RecursiveDependency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Exception::blocked_urllist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"CPAN::Exception::yaml_not_installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::yaml_process_error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::FTP::netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"CPAN::FirstTime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","531","500"],"version":"5.5315"},{"feature":"CPAN::HTTP::Client","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HTTP::Credentials","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HandleConfig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","100"],"version":"5.5011"},{"feature":"CPAN::Index","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","120","0"],"version":"2.12"},{"feature":"CPAN::InfoObj","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Kwalify","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::LWP::UserAgent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Converter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::History","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Merge","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Prereqs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Requirements","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","140","0"],"version":"2.140"},{"feature":"CPAN::Meta::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Validator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","18","0"],"version":"0.018"},{"feature":"CPAN::Mirrors","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Nox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","970","0"],"version":"0.97"},{"feature":"CPAN::Plugin::Specfile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"CPAN::Prompt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Shell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","900"],"version":"5.5009"},{"feature":"CPAN::Tarzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::URL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"Carp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Carp::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Class::Struct","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","660","0"],"version":"0.66"},{"feature":"Compress::Raw::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Raw::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"Config::Extensions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"Config::Perl::V","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"Cwd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"DB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"DBM_Filter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"DBM_Filter::compress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::int32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::null","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DB_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","855","0"],"version":"1.855"},{"feature":"Data::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","176","0"],"version":"2.176"},{"feature":"Devel::PPPort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","620","0"],"version":"3.62"},{"feature":"Devel::Peek","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Devel::SelfStubber","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Digest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::MD5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","580","0"],"version":"2.58"},{"feature":"Digest::SHA","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","20","0"],"version":"6.02"},{"feature":"Digest::base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"DirHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Dumpvalue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"DynaLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"Encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","80","0"],"version":"3.08"},{"feature":"Encode::Alias","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"Encode::Byte","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::CJKConstants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::CN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::CN::HZ","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"Encode::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.05"},{"feature":"Encode::EBCDIC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::Encoder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::GSM0338","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"Encode::Guess","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::JP::H2Z","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::JP::JIS7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::KR::2022_KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::MIME::Header","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"Encode::MIME::Header::ISO_2022_JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Encode::MIME::Name","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Encode::Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::TW","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"Encode::Unicode::UTF7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"English","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Errno","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"Exporter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"Exporter::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"ExtUtils::CBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::BCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::MSVC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::aix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::android","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::dec_osf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::os2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Command::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","250","0"],"version":"0.25"},{"feature":"ExtUtils::Constant::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"ExtUtils::Constant::ProxySubs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"ExtUtils::Constant::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"ExtUtils::Constant::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"ExtUtils::Embed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","350","0"],"version":"1.35"},{"feature":"ExtUtils::Install","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Liblist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Liblist::Kid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_AIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Any","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_BeOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_DOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_NW5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_UWIN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win95","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Manifest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","730","0"],"version":"1.73"},{"feature":"ExtUtils::Miniperl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"ExtUtils::Mkbootstrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Mksymlists","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Packlist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::ParseXS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::CountLines","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Eval","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Utilities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::Typemaps","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::InputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::OutputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Type","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::XSSymSet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.4"},{"feature":"ExtUtils::testlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"Fatal","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"Fcntl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","140","0"],"version":"1.14"},{"feature":"File::Basename","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","850","0"],"version":"2.85"},{"feature":"File::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","600"],"version":"1.1006"},{"feature":"File::Copy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","350","0"],"version":"2.35"},{"feature":"File::DosGlob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"File::Fetch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.00"},{"feature":"File::Find","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","380","0"],"version":"1.38"},{"feature":"File::Glob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"File::GlobMapper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"File::Path","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"File::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::AmigaOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Epoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Temp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","231","100"],"version":"0.2311"},{"feature":"File::stat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"FileCache","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"FileHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Filter::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","960","0"],"version":"0.96"},{"feature":"Filter::Util::Call","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","600","0"],"version":"1.60"},{"feature":"FindBin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"GDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Getopt::Long","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","520","0"],"version":"2.52"},{"feature":"Getopt::Std","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"HTTP::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","76","0"],"version":"0.076"},{"feature":"Hash::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","240","0"],"version":"0.24"},{"feature":"Hash::Util::FieldHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"I18N::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"I18N::LangTags","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","450","0"],"version":"0.45"},{"feature":"I18N::LangTags::Detect","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"I18N::LangTags::List","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","400","0"],"version":"0.40"},{"feature":"I18N::Langinfo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","190","0"],"version":"0.19"},{"feature":"IO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Compress::Adapter::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base::Common","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::RawDeflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Extra","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Dir","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Pipe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Poll","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Seekable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Select","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::INET","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::IP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"IO::Socket::UNIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Uncompress::Adapter::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyUncompress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Gunzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::RawInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Unzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"IPC::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"IPC::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::Open2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"IPC::Open3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"IPC::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SharedMem","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SysV","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"JSON::PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"JSON::PP::Boolean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"List::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"List::Util::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Locale::Maketext","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Locale::Maketext::Guts","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::GutsLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","210","100"],"version":"0.21_01"},{"feature":"MIME::Base64","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"MIME::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"Math::BigFloat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigFloat::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigInt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Calc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::FastCalc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","500","900"],"version":"0.5009"},{"feature":"Math::BigInt::Lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigRat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","261","400"],"version":"0.2614"},{"feature":"Math::Complex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","590","200"],"version":"1.5902"},{"feature":"Math::Trig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","100"],"version":"1.03_01"},{"feature":"Memoize::AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Expire","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireFile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireTest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Module::CoreList","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::CoreList::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::Load","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"Module::Load::Conditional","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","740","0"],"version":"0.74"},{"feature":"Module::Loaded","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","80","0"],"version":"0.08"},{"feature":"Module::Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","37"],"version":"1.000037"},{"feature":"Moped::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10","0"],"version":"0.01"},{"feature":"NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"NEXT","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","670","100"],"version":"0.67_01"},{"feature":"Net::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Domain","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::A","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::E","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::I","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::L","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::dataconn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::NNTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::POP3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Ping","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","740","0"],"version":"2.74"},{"feature":"Net::SMTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Time","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::hostent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Net::netent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::protoent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::servent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"O","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"ODBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"OS2::DLL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"OS2::ExtAttr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::PrfDB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"OS2::REXX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Opcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","490","0"],"version":"1.49"},{"feature":"POSIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","970","0"],"version":"1.97"},{"feature":"Params::Check","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","380","0"],"version":"0.38"},{"feature":"Parse::CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"Perl::OSType","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.010"},{"feature":"PerlIO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"PerlIO::encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","0"],"version":"0.28"},{"feature":"PerlIO::mmap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","17","0"],"version":"0.017"},{"feature":"PerlIO::scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","310","0"],"version":"0.31"},{"feature":"PerlIO::via","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"PerlIO::via::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"Pod::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","740","0"],"version":"1.74"},{"feature":"Pod::Escapes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Pod::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Functions::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Html","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Pod::Man","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::ParseLink","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Perldoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","100"],"version":"3.2801"},{"feature":"Pod::Perldoc::BaseTo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::GetOptsOO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToANSI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToChecker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToMan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToNroff","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToPod","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToRtf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTerm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTk","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToXml","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::BlackBox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsXML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLBatch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLLegacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Pod::Simple::LinkSection","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Methody","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Progress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserEndToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserStartToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserTextToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::RTF","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Search","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::SimpleTree","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TextContent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TiedOutFH","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Transcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeDumb","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeSmart","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XHTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XMLOutStream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Overstrike","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Termcap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Usage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","10","0"],"version":"2.01"},{"feature":"SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"Safe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","430","0"],"version":"2.43"},{"feature":"Scalar::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Search::Dict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"SelectSaver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"SelfLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.030"},{"feature":"Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","230","0"],"version":"3.23"},{"feature":"Sub::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Sys::Hostname","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Sys::Syslog","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"TAP::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::ParallelSession","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness::Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Object","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Aggregator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Grammar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::IteratorFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Multiplexer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Bailout","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Comment","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Pragma","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Unknown","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::ResultFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Job","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Spinner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Source","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Executable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::RawTAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Reader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Writer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Term::ANSIColor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Term::Cap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Term::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","403","0"],"version":"1.403"},{"feature":"Term::ReadLine","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","310","0"],"version":"1.31"},{"feature":"Test2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Breakage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Instance","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Stack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Bail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Diag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Fail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Note","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Pass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::TAP::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::V2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Waiting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::About","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Amnesty","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Assert","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Control","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Render","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter::TAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor::Terminator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver::Files","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Tools::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::ExternalMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Facets2Legacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::IO::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","114","0"],"version":"2.114"},{"feature":"Test::Builder::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::TodoDiag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Test::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Capture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::CaptureRunner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Delegate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::use::ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Text::Abbrev","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Text::Balanced","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Text::ParseWords","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","300","0"],"version":"3.30"},{"feature":"Text::Tabs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Text::Wrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Thread","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","50","0"],"version":"3.05"},{"feature":"Thread::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","140","0"],"version":"3.14"},{"feature":"Thread::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","130","0"],"version":"2.13"},{"feature":"Tie::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Tie::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Tie::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","200","0"],"version":"4.2"},{"feature":"Tie::Hash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::Hash::NamedCapture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"Tie::Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"Tie::RefHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.40"},{"feature":"Tie::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::StdHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","600","0"],"version":"4.6"},{"feature":"Tie::SubstrHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Time::HiRes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","976","600"],"version":"1.9766"},{"feature":"Time::Local","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Time::Piece","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::Seconds","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::gmtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"Time::localtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Time::tm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"UNIVERSAL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["13","0","0"],"version":"13.0.0"},{"feature":"Unicode::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Big5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::GB2312","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::JISX0208","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Korean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Pinyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Stroke","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Zhuyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Normalize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","280","0"],"version":"1.28"},{"feature":"Unicode::UCD","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","750","0"],"version":"0.75"},{"feature":"User::grent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"User::pwent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"VMS::DCLsym","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"VMS::Filespec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"VMS::Stdio","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","450","0"],"version":"2.45"},{"feature":"Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","540","0"],"version":"0.54"},{"feature":"Win32API::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","120","301"],"version":"0.1203_01"},{"feature":"Win32API::File::inc::ExtUtils::Myconst2perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1"},{"feature":"Win32CORE","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"XS::APItest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"XS::Typemap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"XSLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","300","0"],"version":"0.30"},{"feature":"_charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"attributes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"autodie","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::Guard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::GuardStack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception::system","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::hints","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autouse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"bigint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bignum","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bigrat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"blib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"bytes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"deprecate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"diagnostics","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","370","0"],"version":"1.37"},{"feature":"encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","0","0"],"version":"3.00"},{"feature":"encoding::warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"experimental","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","22","0"],"version":"0.022"},{"feature":"feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"fields","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"filetest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"if","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","900"],"version":"0.0609"},{"feature":"integer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"less","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","650","0"],"version":"0.65"},{"feature":"locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"mro","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","250","0"],"version":"1.25"},{"feature":"ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"open","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"ops","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"overload","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"overloading","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","238","0"],"version":"0.238"},{"feature":"perlfaq","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","11","70"],"version":"5.20201107"},{"feature":"re","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"sigtrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"sort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"strict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"subs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"threads","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","260","0"],"version":"2.26"},{"feature":"threads::shared","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","240","0"],"version":"1.24"},{"feature":"vars","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"vmsish","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"warnings::register","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Bump again","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"perl","namespace":"language","version_requirements":[{"comparator":"eq","version":"5.32.1"}]}]},{"alternatives":[],"artifact_id":"48951744-f839-5031-8cf4-6e82a4be2089","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2020-05-28T03:10:35.310Z","ingredient_id":"15bb23b0-0232-5fb9-b791-3e5a905aa4a7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15bb23b0-0232-5fb9-b791-3e5a905aa4a7"},"name":"Data-UUID","normalized_name":"Data-UUID","primary_namespace":"language/perl","description":"Globally/Universally Unique Identifiers (GUIDs/UUIDs)"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-05-28T03:10:35.310Z","ingredient_id":"15bb23b0-0232-5fb9-b791-3e5a905aa4a7","ingredient_version_id":"e8527602-630b-57ab-b21f-a185719a6c91","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15bb23b0-0232-5fb9-b791-3e5a905aa4a7/versions/e8527602-630b-57ab-b21f-a185719a6c91","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15bb23b0-0232-5fb9-b791-3e5a905aa4a7"},"revision":6,"revision_timestamp":"2020-10-28T19:35:01.617Z","copyright_text":"TODO","documentation_uri":"https://metacpan.org/release/Ricardo SIGNES 😄/Data-UUID-1.226","is_binary_only":false,"license_expression":"[\"BSD-3-Clause\"]","release_timestamp":"2020-04-13T01:43:57.000Z","source_uri":"https://cpan.metacpan.org/authors/id/R/RJ/RJBS/Data-UUID-1.226.tar.gz","sortable_version":["1","226","0"],"version":"1.226","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/093d57ffa0d411a94bafafae495697db26f5c9d0277198fe3f7cf2be22996453/Data-UUID-1.226.tar.gz","scanner_license_expression":"[\"BSD-3-Clause\"]","source_checksum":"093d57ffa0d411a94bafafae495697db26f5c9d0277198fe3f7cf2be22996453","status":"stable","provided_features":[{"feature":"Data-UUID","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","226","0"],"version":"1.226"},{"feature":"Data::UUID","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","226","0"],"version":"1.226"}],"author_platform_user_id":"a19a07b9-313a-4e8f-916b-633457d72be8","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"0029ae25-8497-5130-8268-1f0fe26ccc77","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:20.957Z","ingredient_id":"c3ce160c-83dc-521f-9f12-116d103c0d5a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c3ce160c-83dc-521f-9f12-116d103c0d5a"},"name":"Importer","normalized_name":"Importer","primary_namespace":"language/perl","description":"Alternative but compatible interface to modules that export symbols."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-17T21:14:23.110Z","ingredient_id":"c3ce160c-83dc-521f-9f12-116d103c0d5a","ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c3ce160c-83dc-521f-9f12-116d103c0d5a/versions/2be11022-8f99-5eff-b80e-77f0fade3d27","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c3ce160c-83dc-521f-9f12-116d103c0d5a"},"revision":2,"revision_timestamp":"2020-11-04T20:14:53.251Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Importer-0.025","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2018-02-19T04:44:43.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Importer-0.025.tar.gz","sortable_version":["0","25","0"],"version":"0.025","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/0745138c487d74033d0cbeb36f06595036dc7e688f1a5dbec9cc2fa799e13946/Importer-0.025.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"0745138c487d74033d0cbeb36f06595036dc7e688f1a5dbec9cc2fa799e13946","status":"stable","provided_features":[{"feature":"Importer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","25","0"],"version":"0.025"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Data Acquisition import run with commit ID 0000000000000000000000000000000000000000 and reason: Could not be determined from the database query","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"6591f01d-939d-5080-bb1a-7816ff4d020b","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2020-07-24T03:05:37.269Z","ingredient_id":"2e19a04a-565b-5140-85d3-d102bb043ea8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2e19a04a-565b-5140-85d3-d102bb043ea8"},"name":"Long-Jump","normalized_name":"Long-Jump","primary_namespace":"language/perl","description":"Mechanism for returning to a specific point from a deeply nested stack."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-07-24T03:05:37.269Z","ingredient_id":"2e19a04a-565b-5140-85d3-d102bb043ea8","ingredient_version_id":"6c89ed56-ef22-541a-bf87-9ff4e10ee371","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2e19a04a-565b-5140-85d3-d102bb043ea8/versions/6c89ed56-ef22-541a-bf87-9ff4e10ee371","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2e19a04a-565b-5140-85d3-d102bb043ea8"},"revision":3,"revision_timestamp":"2020-10-28T19:26:23.384Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Long-Jump-0.000001","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2019-09-29T23:36:56.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Long-Jump-0.000001.tar.gz","sortable_version":["0","0","1"],"version":"0.000001","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/d5d6456d86992b559d8f66fc90960f919292cd3803c13403faac575762c77af4/Long-Jump-0.000001.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"d5d6456d86992b559d8f66fc90960f919292cd3803c13403faac575762c77af4","status":"stable","provided_features":[{"feature":"Long-Jump","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","1"],"version":"0.000001"},{"feature":"Long::Jump","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","1"],"version":"0.000001"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"7c541a6a-4dfd-5135-8b98-2b44b5d1a816","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:52.524Z","ingredient_id":"8967b3df-1d60-5fe5-a9d2-d1506eaee353","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8967b3df-1d60-5fe5-a9d2-d1506eaee353"},"name":"Module-Pluggable","normalized_name":"Module-Pluggable","primary_namespace":"language/perl","description":"automatically give your module the ability to have plugins"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:52.524Z","ingredient_id":"8967b3df-1d60-5fe5-a9d2-d1506eaee353","ingredient_version_id":"0f028feb-10aa-531d-9660-b56c19fb7b43","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8967b3df-1d60-5fe5-a9d2-d1506eaee353/versions/0f028feb-10aa-531d-9660-b56c19fb7b43","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8967b3df-1d60-5fe5-a9d2-d1506eaee353"},"revision":7,"revision_timestamp":"2020-10-28T19:20:35.640Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2015-08-05T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/S/SI/SIMONW/Module-Pluggable-5.2.tar.gz","sortable_version":["5","200","0"],"version":"5.2","activestate_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","camel_extras":{"mm_fullext":"Module/Pluggable"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/b3f2ad45e4fd10b3fb90d912d78d8b795ab295480db56dc64e86b9fa75c5a6df/Module-Pluggable-5.2.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"b3f2ad45e4fd10b3fb90d912d78d8b795ab295480db56dc64e86b9fa75c5a6df","status":"stable","provided_features":[{"feature":"Devel::InnerPackage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","200","0"],"version":"5.2"},{"feature":"Module-Pluggable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","200","0"],"version":"5.2"},{"feature":"Module::Pluggable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","200","0"],"version":"5.2"},{"feature":"Module::Pluggable::Object","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","200","0"],"version":"5.2"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"7f8a7197-b277-5621-a6f3-7f2ef32d871b","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:53:43.175Z","ingredient_id":"419b3d3f-2c08-58dc-b06a-5890d25878ab","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/419b3d3f-2c08-58dc-b06a-5890d25878ab"},"name":"Scope-Guard","normalized_name":"Scope-Guard","primary_namespace":"language/perl","description":"lexically-scoped resource management"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:53:43.175Z","ingredient_id":"419b3d3f-2c08-58dc-b06a-5890d25878ab","ingredient_version_id":"1ff5b410-a933-53c7-b3a1-f11524b53213","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/419b3d3f-2c08-58dc-b06a-5890d25878ab/versions/1ff5b410-a933-53c7-b3a1-f11524b53213","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/419b3d3f-2c08-58dc-b06a-5890d25878ab"},"revision":5,"revision_timestamp":"2020-10-28T19:21:37.794Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2015-07-19T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/C/CH/CHOCOLATE/Scope-Guard-0.21.tar.gz","sortable_version":["0","210","0"],"version":"0.21","activestate_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","camel_extras":{"mm_fullext":"Scope/Guard"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/8c9b1bea5c56448e2c3fadc65d05be9e4690a3823a80f39d2f10fdd8f777d278/Scope-Guard-0.21.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"8c9b1bea5c56448e2c3fadc65d05be9e4690a3823a80f39d2f10fdd8f777d278","status":"stable","provided_features":[{"feature":"Scope-Guard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","210","0"],"version":"0.21"},{"feature":"Scope::Guard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","210","0"],"version":"0.21"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"29983a5b-49c4-5cf4-a2c5-2490647d6910","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime"],"ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27"},{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:53:51.949Z","ingredient_id":"bd0582e7-a354-5e28-868e-c772965b793f","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bd0582e7-a354-5e28-868e-c772965b793f"},"name":"Sub-Info","normalized_name":"Sub-Info","primary_namespace":"language/perl","description":"Tool for inspecting subroutines."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-05-28T00:53:33.249Z","ingredient_id":"bd0582e7-a354-5e28-868e-c772965b793f","ingredient_version_id":"9e33e514-0b22-504b-8409-6d0bdbf86108","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bd0582e7-a354-5e28-868e-c772965b793f/versions/9e33e514-0b22-504b-8409-6d0bdbf86108","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/bd0582e7-a354-5e28-868e-c772965b793f"},"revision":4,"revision_timestamp":"2021-02-16T16:39:17.261Z","copyright_text":"TODO","documentation_uri":"https://metacpan.org/release/Chad Granum/Sub-Info-0.002","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2016-12-24T12:17:00.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Sub-Info-0.002.tar.gz","sortable_version":["0","2","0"],"version":"0.002","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Sub/Info"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/ea3056d696bdeff21a99d340d5570887d39a8cc47bff23adfc82df6758cdd0ea/Sub-Info-0.002.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"ea3056d696bdeff21a99d340d5570887d39a8cc47bff23adfc82df6758cdd0ea","status":"stable","provided_features":[{"feature":"Sub-Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","0"],"version":"0.002"},{"feature":"Sub::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","0"],"version":"0.002"}],"author_platform_user_id":"8fd0aa9c-0483-4ee7-9197-96c9194c0318","comment":"Add build dependencies for Auto-intstall - Importer","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"4d95557d-2200-5a56-a809-4ea3d3502b20","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime"],"ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27"},{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:54:02.753Z","ingredient_id":"d8ad5efe-897b-5342-8ad1-f4abbd328ab4","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d8ad5efe-897b-5342-8ad1-f4abbd328ab4"},"name":"Term-Table","normalized_name":"Term-Table","primary_namespace":"language/perl","description":"Format a header and rows into a table"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-17T21:15:15.752Z","ingredient_id":"d8ad5efe-897b-5342-8ad1-f4abbd328ab4","ingredient_version_id":"7e483f34-00ad-523a-91be-e9ddf74366a5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d8ad5efe-897b-5342-8ad1-f4abbd328ab4/versions/7e483f34-00ad-523a-91be-e9ddf74366a5","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d8ad5efe-897b-5342-8ad1-f4abbd328ab4"},"revision":3,"revision_timestamp":"2021-02-19T04:13:53.554Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Term-Table-0.015","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2019-11-19T07:59:44.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Term-Table-0.015.tar.gz","sortable_version":["0","15","0"],"version":"0.015","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/d8a18b2801f91f0e5d747147ce786964a76f91d18568652908a3dc06a9b948d5/Term-Table-0.015.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"d8a18b2801f91f0e5d747147ce786964a76f91d18568652908a3dc06a9b948d5","status":"stable","provided_features":[{"feature":"Term-Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::Cell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::CellStack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::LineBreak","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::Spacer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"},{"feature":"Term::Table::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.015"}],"author_platform_user_id":"8fd0aa9c-0483-4ee7-9197-96c9194c0318","comment":"Data Acquisition import run with commit ID 0000000000000000000000000000000000000000 and reason: Could not be determined from the database query","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"288aa0db-c0e4-55e7-8f67-fc2da409be70","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"1ff5b410-a933-53c7-b3a1-f11524b53213"},{"dependency_types":["runtime"],"ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27"},{"dependency_types":["runtime"],"ingredient_version_id":"4bd9f2db-1c09-5a14-82a3-7cb6d966d18c"},{"dependency_types":["runtime"],"ingredient_version_id":"6c89ed56-ef22-541a-bf87-9ff4e10ee371"},{"dependency_types":["runtime"],"ingredient_version_id":"7e483f34-00ad-523a-91be-e9ddf74366a5"},{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"},{"dependency_types":["runtime"],"ingredient_version_id":"d85188d8-231d-589f-9bdd-fc5667cc2d2f"},{"dependency_types":["runtime"],"ingredient_version_id":"e8527602-630b-57ab-b21f-a185719a6c91"},{"dependency_types":["runtime"],"ingredient_version_id":"ee3bc68e-abb3-58ff-aa9c-60b7412df7e2"},{"dependency_types":["runtime"],"ingredient_version_id":"fa7a0c73-1e93-5e08-8f6b-a009e82d7179"}],"ingredient":{"creation_timestamp":"2020-05-28T03:57:35.831Z","ingredient_id":"7cc539a3-0ee6-5e80-a948-dbd38b3f26db","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7cc539a3-0ee6-5e80-a948-dbd38b3f26db"},"name":"Test2-Harness","normalized_name":"Test2-Harness","primary_namespace":"language/perl","description":"A new and improved test harness with better Test2 integration."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2021-01-13T02:09:51.439Z","ingredient_id":"7cc539a3-0ee6-5e80-a948-dbd38b3f26db","ingredient_version_id":"9c514f0f-5abb-546a-840a-1c97f2010c78","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7cc539a3-0ee6-5e80-a948-dbd38b3f26db/versions/9c514f0f-5abb-546a-840a-1c97f2010c78","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7cc539a3-0ee6-5e80-a948-dbd38b3f26db"},"revision":2,"revision_timestamp":"2021-02-02T23:55:10.154Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Test2-Harness-1.000042","is_binary_only":false,"license_expression":"Artistic-1.0-Perl, GPL-1.0-or-later","release_timestamp":"2020-11-18T06:47:53.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test2-Harness-1.000042.tar.gz","sortable_version":["1","0","42"],"version":"1.000042","activestate_license_expression":"Artistic-1.0-Perl, GPL-1.0-or-later","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/aaf231a68af1a6ffd6a11188875fcf572e373e43c8285945227b9d687b43db2d/Test2-Harness-1.000042.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"aaf231a68af1a6ffd6a11188875fcf572e373e43c8285945227b9d687b43db2d","status":"stable","provided_features":[{"feature":"App::Yath","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::auditor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::collector","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::failed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::help","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::init","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::projects","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::reload","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::replay","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::run","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::runner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::spawn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::speedtag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::start","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::stop","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::times","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::watch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Command::which","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Converting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Option","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Display","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Finder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Logging","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Persist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::PreCommand","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Run","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Runner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Options::Workspace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin::Git","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin::Notify","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin::SelfTest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin::SysInfo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Plugin::YathUI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"App::Yath::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2-Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Formatter::QVF","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Formatter::Stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Formatter::Test2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Formatter::Test2::Composer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Auditor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Auditor::TimeTracker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Auditor::Watcher","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Collector","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Collector::JobDir","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Collector::TapParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Finder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::IPC::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Log","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Log::CoverageAggregator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Renderer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Renderer::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Run","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::DepTracer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Job","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Preload","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Preload::Stage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Preloader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Preloader::Stage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Resource","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Run","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Spawn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::Spawn::Run","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Runner::State","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Settings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Settings::Prefix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::TestFile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::File::JSON","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::File::JSONL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::File::Stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::File::Value","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::JSON","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::Term","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Harness::Util::UUID","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"},{"feature":"Test2::Tools::HarnessTester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","42"],"version":"1.000042"}],"author_platform_user_id":"2e044215-1b51-498f-a440-ae0cc11bdd4c","comment":"Fix improper Perl core version","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"282e3768-e12a-51ed-831f-7cbc212ba8bd","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2020-08-04T05:03:47.447Z","ingredient_id":"475ab2a1-ee4c-5337-b9c0-5991daa7d9ad","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/475ab2a1-ee4c-5337-b9c0-5991daa7d9ad"},"name":"Test2-Plugin-MemUsage","normalized_name":"Test2-Plugin-MemUsage","primary_namespace":"language/perl","description":"Collect and display memory usage information."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-08-04T05:03:47.447Z","ingredient_id":"475ab2a1-ee4c-5337-b9c0-5991daa7d9ad","ingredient_version_id":"d85188d8-231d-589f-9bdd-fc5667cc2d2f","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/475ab2a1-ee4c-5337-b9c0-5991daa7d9ad/versions/d85188d8-231d-589f-9bdd-fc5667cc2d2f","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/475ab2a1-ee4c-5337-b9c0-5991daa7d9ad"},"revision":3,"revision_timestamp":"2020-10-28T19:33:54.008Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Test2-Plugin-MemUsage-0.002003","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2020-02-26T16:09:51.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test2-Plugin-MemUsage-0.002003.tar.gz","sortable_version":["0","2","3"],"version":"0.002003","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/5e0662d5a823ae081641f5ce82843111eec1831cd31f883a6c6de54afdf87c25/Test2-Plugin-MemUsage-0.002003.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"5e0662d5a823ae081641f5ce82843111eec1831cd31f883a6c6de54afdf87c25","status":"stable","provided_features":[{"feature":"Test2-Plugin-MemUsage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","3"],"version":"0.002003"},{"feature":"Test2::Plugin::MemUsage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","3"],"version":"0.002003"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"5ad88c8a-bc8f-50a0-9f61-74856cd28017","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:54:23.311Z","ingredient_id":"ad9a26f2-c23b-54b1-ada2-3327ff7fd40d","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ad9a26f2-c23b-54b1-ada2-3327ff7fd40d"},"name":"Test2-Plugin-NoWarnings","normalized_name":"Test2-Plugin-NoWarnings","primary_namespace":"language/perl","description":"Fail if tests warn"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-05-28T00:53:49.862Z","ingredient_id":"ad9a26f2-c23b-54b1-ada2-3327ff7fd40d","ingredient_version_id":"b8f76881-09d4-53fd-8cc6-e595b6d69132","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ad9a26f2-c23b-54b1-ada2-3327ff7fd40d/versions/b8f76881-09d4-53fd-8cc6-e595b6d69132","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ad9a26f2-c23b-54b1-ada2-3327ff7fd40d"},"revision":3,"revision_timestamp":"2020-10-28T19:31:31.379Z","copyright_text":"TODO","documentation_uri":"https://metacpan.org/release/Dave Rolsky/Test2-Plugin-NoWarnings-0.06","is_binary_only":false,"license_expression":"[\"Artistic-2.0\"]","release_timestamp":"2017-06-04T22:24:22.000Z","source_uri":"https://cpan.metacpan.org/authors/id/D/DR/DROLSKY/Test2-Plugin-NoWarnings-0.06.tar.gz","sortable_version":["0","60","0"],"version":"0.06","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Test2/Plugin/NoWarnings"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/8288c1d934f69a03224598fbb715adc079c0d1609bfbaea6c88682aab1995800/Test2-Plugin-NoWarnings-0.06.tar.gz","scanner_license_expression":"[\"Artistic-2.0\"]","source_checksum":"8288c1d934f69a03224598fbb715adc079c0d1609bfbaea6c88682aab1995800","status":"stable","provided_features":[{"feature":"Test2-Plugin-NoWarnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"Test2::Event::Warning","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"Test2::Plugin::NoWarnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"c3e652a7-676e-594f-b87f-93d19122f3f4","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"},{"dependency_types":["runtime"],"ingredient_version_id":"e8527602-630b-57ab-b21f-a185719a6c91"}],"ingredient":{"creation_timestamp":"2020-08-04T05:03:50.581Z","ingredient_id":"cfacafbc-90b3-50d6-a0d3-3320ec24434c","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/cfacafbc-90b3-50d6-a0d3-3320ec24434c"},"name":"Test2-Plugin-UUID","normalized_name":"Test2-Plugin-UUID","primary_namespace":"language/perl","description":"Use REAL UUIDs in Test2"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-08-04T05:03:50.581Z","ingredient_id":"cfacafbc-90b3-50d6-a0d3-3320ec24434c","ingredient_version_id":"4bd9f2db-1c09-5a14-82a3-7cb6d966d18c","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/cfacafbc-90b3-50d6-a0d3-3320ec24434c/versions/4bd9f2db-1c09-5a14-82a3-7cb6d966d18c","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/cfacafbc-90b3-50d6-a0d3-3320ec24434c"},"revision":3,"revision_timestamp":"2020-10-28T19:24:08.293Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Test2-Plugin-UUID-0.002001","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2019-08-16T22:46:14.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test2-Plugin-UUID-0.002001.tar.gz","sortable_version":["0","2","1"],"version":"0.002001","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/4c6c8d484d7153d8779dc155a992b203095b5c5aa1cfb1ee8bcedcd0601878c9/Test2-Plugin-UUID-0.002001.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"4c6c8d484d7153d8779dc155a992b203095b5c5aa1cfb1ee8bcedcd0601878c9","status":"stable","provided_features":[{"feature":"Test2-Plugin-UUID","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","1"],"version":"0.002001"},{"feature":"Test2::Plugin::UUID","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","1"],"version":"0.002001"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"30dc7965-0a69-5686-831a-e563fa73a98c","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"0f028feb-10aa-531d-9660-b56c19fb7b43"},{"dependency_types":["runtime"],"ingredient_version_id":"1ff5b410-a933-53c7-b3a1-f11524b53213"},{"dependency_types":["build","runtime"],"ingredient_version_id":"2be11022-8f99-5eff-b80e-77f0fade3d27"},{"dependency_types":["runtime"],"ingredient_version_id":"7e483f34-00ad-523a-91be-e9ddf74366a5"},{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["runtime"],"ingredient_version_id":"9e33e514-0b22-504b-8409-6d0bdbf86108"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:54:24.108Z","ingredient_id":"9bd2d82e-5607-5b1e-9f58-05d8ce6a171b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9bd2d82e-5607-5b1e-9f58-05d8ce6a171b"},"name":"Test2-Suite","normalized_name":"Test2-Suite","primary_namespace":"language/perl","description":"Distribution with a rich set of tools built upon the Test2 framework."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-17T20:03:44.338Z","ingredient_id":"9bd2d82e-5607-5b1e-9f58-05d8ce6a171b","ingredient_version_id":"fa7a0c73-1e93-5e08-8f6b-a009e82d7179","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9bd2d82e-5607-5b1e-9f58-05d8ce6a171b/versions/fa7a0c73-1e93-5e08-8f6b-a009e82d7179","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9bd2d82e-5607-5b1e-9f58-05d8ce6a171b"},"revision":2,"revision_timestamp":"2021-02-19T04:22:07.305Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/Test2-Suite-0.000127","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2019-10-31T11:27:54.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test2-Suite-0.000127.tar.gz","sortable_version":["0","0","127"],"version":"0.000127","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/09443e7c99f9bef2c3f5999b919800db7d265b2c55f177726d3e5a61d8dbe690/Test2-Suite-0.000127.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"09443e7c99f9bef2c3f5999b919800db7d265b2c55f177726d3e5a61d8dbe690","status":"stable","provided_features":[{"feature":"Test2-Suite","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::AsyncSubtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::AsyncSubtest::Event::Attach","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::AsyncSubtest::Event::Detach","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::AsyncSubtest::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::AsyncSubtest::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Bundle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Bundle::Extended","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Bundle::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Bundle::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Bag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Bool","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Custom","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::DeepRef","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Delta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::EventMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Float","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Hash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Negatable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Number","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Object","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::OrderedSubset","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Pattern","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Ref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Set","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::String","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Undef","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Compare::Wildcard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::EndToEnd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::Hubs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Anatomy::Utilities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Contributing","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Testing","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Testing::Introduction","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Testing::Migrating","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Testing::Planning","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Testing::Todo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::FirstTool","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Nesting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Plugin::TestExit","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Plugin::TestingDone","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Plugin::ToolCompletes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Plugin::ToolStarts","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::TestBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Manual::Tooling::Testing","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Mock","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::BailOnFail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::DieOnFail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::ExitSummary","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::SRand","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::Times","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Plugin::UTF8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::AuthorTesting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::EnvVar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::Fork","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::Perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::RealFork","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Require::Threads","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Suite","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Todo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::AsyncSubtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Basic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Class","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::ClassicCompare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Defer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Exports","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::GenTemp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Grab","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Mock","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Ref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Target","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Tools::Warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Grabber","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Ref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Stash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Sub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Table::Cell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Table::LineBreak","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Term","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Util::Times","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::V0","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::BlockBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::Build","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::Runner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::Task","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::Task::Action","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"},{"feature":"Test2::Workflow::Task::Group","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","0","127"],"version":"0.000127"}],"author_platform_user_id":"8fd0aa9c-0483-4ee7-9197-96c9194c0318","comment":"Data Acquisition import run with commit ID 0000000000000000000000000000000000000000 and reason: Could not be determined from the database query","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"c1e8c6c4-ea11-55a4-b415-97da2d32121e","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2020-08-04T03:41:54.942Z","ingredient_id":"d467d24f-854c-5970-acac-acda9cb97d15","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d467d24f-854c-5970-acac-acda9cb97d15"},"name":"goto-file","normalized_name":"goto-file","primary_namespace":"language/perl","description":"Stop parsing the current file and move on to a different one.","website":"https://github.com/exodist/goto-file"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-08-04T03:41:54.942Z","ingredient_id":"d467d24f-854c-5970-acac-acda9cb97d15","ingredient_version_id":"ee3bc68e-abb3-58ff-aa9c-60b7412df7e2","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d467d24f-854c-5970-acac-acda9cb97d15/versions/ee3bc68e-abb3-58ff-aa9c-60b7412df7e2","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d467d24f-854c-5970-acac-acda9cb97d15"},"revision":3,"revision_timestamp":"2020-10-28T19:35:27.454Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Chad Granum/goto-file-0.005","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2017-10-24T15:33:30.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/goto-file-0.005.tar.gz","sortable_version":["0","5","0"],"version":"0.005","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/c6cdd5ee4a6cdcbdbf314d92a4f9985dbcdf9e4258048cae76125c052aa31f77/goto-file-0.005.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"c6cdd5ee4a6cdcbdbf314d92a4f9985dbcdf9e4258048cae76125c052aa31f77","status":"stable","provided_features":[{"feature":"goto-file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","5","0"],"version":"0.005"},{"feature":"goto::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","5","0"],"version":"0.005"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]}],"solver_version":1} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-package.json b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-package.json new file mode 100644 index 0000000000..0b84a41d44 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-package.json @@ -0,0 +1 @@ +{"camel_flags":[],"from_recipe_store":true,"image":{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"},"is_indemnified":false,"platform":{"cpu_architecture":{"cpu_architecture_id":"4cdba18d-0851-4925-9ae5-9c8a2987828a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/cpu-architectures/4cdba18d-0851-4925-9ae5-9c8a2987828a"},"bit_width":"64","name":"x86","provided_features":[{"feature":"x86 64-bit","is_activestate_version":false,"is_default_provider":true,"namespace":"cpu-architecture","sortable_version":["1","0"],"version":"1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"cpu_extensions":[],"creation_timestamp":"2021-01-15T18:05:36.924Z","display_name":"CentOS 8, Linux 4.18.0, glibc 2.28 x86 64-bit","end_of_support_date":"2025-12-31","images":[{"image_id":"00216735-694e-4ef8-a7d5-7724b9200be0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/00216735-694e-4ef8-a7d5-7724b9200be0"},"name":"docker-registry.activestate.build/activestate/centos-8-build","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","1","0"],"version":"1.1","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"eq","sortable_version":[]}]}],"revision":1,"revision_timestamp":"2021-01-15T18:07:52.645Z"},{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"}],"is_user_visible":true,"kernel":{"kernel_id":"ef737274-fff9-4164-b72b-88067613f822","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822"},"name":"Linux"},"kernel_version":{"kernel_version_id":"61f9365e-03ed-448f-9a24-2b845727e4f5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822/versions/61f9365e-03ed-448f-9a24-2b845727e4f5"},"sortable_version":["4","18","0","0"],"version":"4.18.0","provided_features":[{"feature":"Linux","is_activestate_version":false,"is_default_provider":true,"namespace":"kernel","sortable_version":["4","18","0","0"],"version":"4.18.0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:04.588Z"},"libc":{"libc_id":"09a2eb42-ad34-4734-a93e-4b97395577df","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df"},"name":"glibc"},"libc_version":{"libc_version_id":"22d234e7-145e-4688-9d05-ee164b4ffa12","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df/versions/22d234e7-145e-4688-9d05-ee164b4ffa12"},"sortable_version":["2","28","0"],"version":"2.28","provided_features":[{"feature":"glibc","is_activestate_version":false,"is_default_provider":true,"namespace":"libc","sortable_version":["2","28","0"],"version":"2.28"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:19.136Z"},"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/platforms/7c998ec2-7491-4e75-be4d-8885800ef5f2"},"operating_system":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99"},"operating_system_id":"7b3a2dbb-d543-48d6-8390-7e7b63751e99","has_libc":true,"name":"CentOS"},"operating_system_version":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99/versions/42cab97b-9d80-407f-89a8-230836868e88"},"operating_system_version_id":"42cab97b-9d80-407f-89a8-230836868e88","sortable_version":["8","0"],"version":"8","provided_features":[{"feature":"CentOS","is_activestate_version":false,"is_default_provider":true,"namespace":"operating-system","sortable_version":["8","0"],"version":"8"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:50.448Z"},"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2"},"recipe_id":"b50600fa-f2ef-5079-afbb-550bf3b8295d","recipe_store_timestamp":"2021-02-20T07:46:16.324Z","resolved_ingredients":[{"alternatives":[],"artifact_id":"cf3d86c1-2587-564e-a7b2-0cf109ce263e","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-08-10T23:47:40.385Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"name":"perl-core-builder","normalized_name":"perl-core-builder","primary_namespace":"builder","description":"Builds the core Perl interpreter on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-30T17:58:38.567Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31/versions/d5ac8c7c-b025-5418-ab77-a139e60e1d41","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"revision":2,"revision_timestamp":"2020-10-30T17:04:06.702Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-06-25T07:05:14.000Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-core-builder","sortable_version":["1","0","23","0"],"version":"1.0.23","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374/perl-core-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"perl-core-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","23","0"],"version":"1.0.23"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Initial builder for perl 5.30+","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"a1ebbc88-daeb-5588-8086-c99de70eabf7","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"ed446cc4-4e4d-5986-ad77-ed04a3b2e58b"}],"ingredient":{"creation_timestamp":"2020-08-10T23:48:55.390Z","ingredient_id":"196722f9-5600-5d89-9c47-42460922fdb1","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1"},"name":"perl-module-builder","normalized_name":"perl-module-builder","primary_namespace":"builder","description":"Builds Perl modules on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-12-07T20:54:12.006Z","ingredient_id":"196722f9-5600-5d89-9c47-42460922fdb1","ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1/versions/c4164b54-9b8f-55fc-ae5a-cd47c6389687","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1"},"revision":1,"revision_timestamp":"2020-12-07T20:54:12.006Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-12-07T20:23:01.043Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-module-builder","sortable_version":["1","0","36","0"],"version":"1.0.36","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/bb8bb535334fb012df0550a528692f4826893b91b055ac73ffb37dd00322a7b6/perl-module-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"bb8bb535334fb012df0550a528692f4826893b91b055ac73ffb37dd00322a7b6","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"perl-module-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","36","0"],"version":"1.0.36"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Created new version 1.0.36 from 1.0.35.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"f7c88044-fdcd-5023-a0ce-9c4a6fcc2708","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-08-10T23:48:13.169Z","ingredient_id":"4c0fd8d2-5c39-5ecf-958e-325efdea1ef2","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2"},"name":"perl-module-lib","normalized_name":"perl-module-lib","primary_namespace":"builder-lib","description":"Builds Perl modules on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-12-07T20:54:42.776Z","ingredient_id":"4c0fd8d2-5c39-5ecf-958e-325efdea1ef2","ingredient_version_id":"ed446cc4-4e4d-5986-ad77-ed04a3b2e58b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2/versions/ed446cc4-4e4d-5986-ad77-ed04a3b2e58b","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2"},"revision":2,"revision_timestamp":"2020-12-10T17:22:10.292Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-12-07T20:25:59.954Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-module-lib","sortable_version":["1","0","36","0"],"version":"1.0.36","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/abdb22574b2300f30e98ab9239892f379c0c60bf33634a2b49518bddc730413d/perl-module-lib.tar.gz","scanner_license_expression":"unknown","source_checksum":"abdb22574b2300f30e98ab9239892f379c0c60bf33634a2b49518bddc730413d","status":"stable","provided_features":[{"feature":"perl-module-lib","is_activestate_version":false,"is_default_provider":true,"namespace":"builder-lib","sortable_version":["1","0","36","0"],"version":"1.0.36"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"Created new version 1.0.36 from 1.0.35.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41"}],"ingredient":{"creation_timestamp":"2019-10-01T16:56:32.665Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"name":"perl","normalized_name":"perl","primary_namespace":"language","description":"Practical Extraction and Report Language"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2021-01-29T18:11:47.039Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206/versions/86005392-bdbf-59bd-a716-70ce7fcd3a66","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"revision":3,"revision_timestamp":"2021-02-03T21:14:56.873Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"1970-01-01T00:00:00.000Z","source_uri":"https://cpan.metacpan.org/authors/id/S/SH/SHAY/perl-5.32.1.tar.gz","sortable_version":["5","32","1"],"version":"5.32.1","activestate_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/language/03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c/perl-5.32.1.tar.gz","scanner_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","source_checksum":"03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c","status":"stable","provided_features":[{"feature":"alternative-built-language","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1","0"],"version":"5.32.1"},{"feature":"perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1"],"version":"5.32.1"},{"feature":"Amiga::ARexx","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","50","0"],"version":"0.05"},{"feature":"Amiga::Exec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"App::Cpan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","676","0"],"version":"1.676"},{"feature":"App::Prove","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Archive::Tar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Attribute::Handlers","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"AutoLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","740","0"],"version":"5.74"},{"feature":"AutoSplit","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"B","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","820","0"],"version":"1.82"},{"feature":"B::Concise","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.004"},{"feature":"B::Deparse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"B::Op_private","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"B::Showlex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"B::Terse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"B::Xref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Benchmark","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"CPAN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"CPAN::Author","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Bundle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","500"],"version":"5.5005"},{"feature":"CPAN::CacheMgr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::DeferredCode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::Distribution","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Distroprefs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","0","100"],"version":"6.0001"},{"feature":"CPAN::Distrostatus","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::RecursiveDependency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Exception::blocked_urllist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"CPAN::Exception::yaml_not_installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::yaml_process_error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::FTP::netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"CPAN::FirstTime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","531","500"],"version":"5.5315"},{"feature":"CPAN::HTTP::Client","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HTTP::Credentials","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HandleConfig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","100"],"version":"5.5011"},{"feature":"CPAN::Index","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","120","0"],"version":"2.12"},{"feature":"CPAN::InfoObj","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Kwalify","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::LWP::UserAgent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Converter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::History","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Merge","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Prereqs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Requirements","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","140","0"],"version":"2.140"},{"feature":"CPAN::Meta::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Validator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","18","0"],"version":"0.018"},{"feature":"CPAN::Mirrors","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Nox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","970","0"],"version":"0.97"},{"feature":"CPAN::Plugin::Specfile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"CPAN::Prompt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Shell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","900"],"version":"5.5009"},{"feature":"CPAN::Tarzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::URL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"Carp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Carp::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Class::Struct","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","660","0"],"version":"0.66"},{"feature":"Compress::Raw::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Raw::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"Config::Extensions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"Config::Perl::V","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"Cwd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"DB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"DBM_Filter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"DBM_Filter::compress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::int32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::null","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DB_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","855","0"],"version":"1.855"},{"feature":"Data::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","176","0"],"version":"2.176"},{"feature":"Devel::PPPort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","620","0"],"version":"3.62"},{"feature":"Devel::Peek","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Devel::SelfStubber","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Digest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::MD5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","580","0"],"version":"2.58"},{"feature":"Digest::SHA","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","20","0"],"version":"6.02"},{"feature":"Digest::base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"DirHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Dumpvalue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"DynaLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"Encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","80","0"],"version":"3.08"},{"feature":"Encode::Alias","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"Encode::Byte","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::CJKConstants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::CN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::CN::HZ","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"Encode::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.05"},{"feature":"Encode::EBCDIC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::Encoder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::GSM0338","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"Encode::Guess","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::JP::H2Z","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::JP::JIS7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::KR::2022_KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::MIME::Header","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"Encode::MIME::Header::ISO_2022_JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Encode::MIME::Name","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Encode::Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::TW","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"Encode::Unicode::UTF7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"English","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Errno","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"Exporter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"Exporter::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"ExtUtils::CBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::BCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::MSVC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::aix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::android","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::dec_osf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::os2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Command::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","250","0"],"version":"0.25"},{"feature":"ExtUtils::Constant::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"ExtUtils::Constant::ProxySubs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"ExtUtils::Constant::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"ExtUtils::Constant::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"ExtUtils::Embed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","350","0"],"version":"1.35"},{"feature":"ExtUtils::Install","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Liblist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Liblist::Kid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_AIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Any","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_BeOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_DOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_NW5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_UWIN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win95","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Manifest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","730","0"],"version":"1.73"},{"feature":"ExtUtils::Miniperl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"ExtUtils::Mkbootstrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Mksymlists","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Packlist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::ParseXS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::CountLines","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Eval","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Utilities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::Typemaps","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::InputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::OutputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Type","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::XSSymSet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.4"},{"feature":"ExtUtils::testlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"Fatal","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"Fcntl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","140","0"],"version":"1.14"},{"feature":"File::Basename","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","850","0"],"version":"2.85"},{"feature":"File::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","600"],"version":"1.1006"},{"feature":"File::Copy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","350","0"],"version":"2.35"},{"feature":"File::DosGlob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"File::Fetch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.00"},{"feature":"File::Find","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","380","0"],"version":"1.38"},{"feature":"File::Glob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"File::GlobMapper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"File::Path","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"File::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::AmigaOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Epoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Temp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","231","100"],"version":"0.2311"},{"feature":"File::stat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"FileCache","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"FileHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Filter::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","960","0"],"version":"0.96"},{"feature":"Filter::Util::Call","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","600","0"],"version":"1.60"},{"feature":"FindBin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"GDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Getopt::Long","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","520","0"],"version":"2.52"},{"feature":"Getopt::Std","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"HTTP::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","76","0"],"version":"0.076"},{"feature":"Hash::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","240","0"],"version":"0.24"},{"feature":"Hash::Util::FieldHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"I18N::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"I18N::LangTags","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","450","0"],"version":"0.45"},{"feature":"I18N::LangTags::Detect","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"I18N::LangTags::List","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","400","0"],"version":"0.40"},{"feature":"I18N::Langinfo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","190","0"],"version":"0.19"},{"feature":"IO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Compress::Adapter::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base::Common","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::RawDeflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Extra","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Dir","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Pipe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Poll","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Seekable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Select","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::INET","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::IP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"IO::Socket::UNIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Uncompress::Adapter::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyUncompress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Gunzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::RawInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Unzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"IPC::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"IPC::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::Open2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"IPC::Open3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"IPC::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SharedMem","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SysV","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"JSON::PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"JSON::PP::Boolean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"List::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"List::Util::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Locale::Maketext","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Locale::Maketext::Guts","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::GutsLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","210","100"],"version":"0.21_01"},{"feature":"MIME::Base64","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"MIME::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"Math::BigFloat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigFloat::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigInt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Calc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::FastCalc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","500","900"],"version":"0.5009"},{"feature":"Math::BigInt::Lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigRat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","261","400"],"version":"0.2614"},{"feature":"Math::Complex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","590","200"],"version":"1.5902"},{"feature":"Math::Trig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","100"],"version":"1.03_01"},{"feature":"Memoize::AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Expire","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireFile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireTest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Module::CoreList","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::CoreList::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::Load","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"Module::Load::Conditional","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","740","0"],"version":"0.74"},{"feature":"Module::Loaded","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","80","0"],"version":"0.08"},{"feature":"Module::Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","37"],"version":"1.000037"},{"feature":"Moped::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10","0"],"version":"0.01"},{"feature":"NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"NEXT","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","670","100"],"version":"0.67_01"},{"feature":"Net::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Domain","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::A","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::E","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::I","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::L","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::dataconn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::NNTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::POP3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Ping","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","740","0"],"version":"2.74"},{"feature":"Net::SMTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Time","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::hostent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Net::netent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::protoent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::servent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"O","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"ODBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"OS2::DLL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"OS2::ExtAttr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::PrfDB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"OS2::REXX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Opcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","490","0"],"version":"1.49"},{"feature":"POSIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","970","0"],"version":"1.97"},{"feature":"Params::Check","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","380","0"],"version":"0.38"},{"feature":"Parse::CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"Perl::OSType","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.010"},{"feature":"PerlIO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"PerlIO::encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","0"],"version":"0.28"},{"feature":"PerlIO::mmap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","17","0"],"version":"0.017"},{"feature":"PerlIO::scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","310","0"],"version":"0.31"},{"feature":"PerlIO::via","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"PerlIO::via::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"Pod::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","740","0"],"version":"1.74"},{"feature":"Pod::Escapes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Pod::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Functions::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Html","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Pod::Man","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::ParseLink","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Perldoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","100"],"version":"3.2801"},{"feature":"Pod::Perldoc::BaseTo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::GetOptsOO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToANSI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToChecker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToMan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToNroff","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToPod","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToRtf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTerm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTk","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToXml","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::BlackBox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsXML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLBatch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLLegacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Pod::Simple::LinkSection","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Methody","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Progress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserEndToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserStartToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserTextToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::RTF","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Search","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::SimpleTree","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TextContent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TiedOutFH","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Transcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeDumb","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeSmart","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XHTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XMLOutStream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Overstrike","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Termcap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Usage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","10","0"],"version":"2.01"},{"feature":"SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"Safe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","430","0"],"version":"2.43"},{"feature":"Scalar::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Search::Dict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"SelectSaver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"SelfLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.030"},{"feature":"Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","230","0"],"version":"3.23"},{"feature":"Sub::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Sys::Hostname","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Sys::Syslog","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"TAP::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::ParallelSession","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness::Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Object","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Aggregator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Grammar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::IteratorFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Multiplexer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Bailout","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Comment","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Pragma","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Unknown","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::ResultFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Job","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Spinner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Source","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Executable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::RawTAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Reader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Writer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Term::ANSIColor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Term::Cap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Term::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","403","0"],"version":"1.403"},{"feature":"Term::ReadLine","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","310","0"],"version":"1.31"},{"feature":"Test2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Breakage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Instance","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Stack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Bail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Diag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Fail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Note","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Pass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::TAP::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::V2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Waiting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::About","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Amnesty","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Assert","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Control","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Render","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter::TAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor::Terminator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver::Files","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Tools::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::ExternalMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Facets2Legacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::IO::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","114","0"],"version":"2.114"},{"feature":"Test::Builder::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::TodoDiag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Test::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Capture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::CaptureRunner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Delegate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::use::ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Text::Abbrev","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Text::Balanced","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Text::ParseWords","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","300","0"],"version":"3.30"},{"feature":"Text::Tabs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Text::Wrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Thread","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","50","0"],"version":"3.05"},{"feature":"Thread::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","140","0"],"version":"3.14"},{"feature":"Thread::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","130","0"],"version":"2.13"},{"feature":"Tie::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Tie::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Tie::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","200","0"],"version":"4.2"},{"feature":"Tie::Hash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::Hash::NamedCapture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"Tie::Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"Tie::RefHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.40"},{"feature":"Tie::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::StdHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","600","0"],"version":"4.6"},{"feature":"Tie::SubstrHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Time::HiRes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","976","600"],"version":"1.9766"},{"feature":"Time::Local","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Time::Piece","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::Seconds","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::gmtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"Time::localtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Time::tm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"UNIVERSAL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["13","0","0"],"version":"13.0.0"},{"feature":"Unicode::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Big5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::GB2312","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::JISX0208","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Korean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Pinyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Stroke","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Zhuyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Normalize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","280","0"],"version":"1.28"},{"feature":"Unicode::UCD","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","750","0"],"version":"0.75"},{"feature":"User::grent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"User::pwent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"VMS::DCLsym","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"VMS::Filespec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"VMS::Stdio","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","450","0"],"version":"2.45"},{"feature":"Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","540","0"],"version":"0.54"},{"feature":"Win32API::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","120","301"],"version":"0.1203_01"},{"feature":"Win32API::File::inc::ExtUtils::Myconst2perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1"},{"feature":"Win32CORE","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"XS::APItest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"XS::Typemap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"XSLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","300","0"],"version":"0.30"},{"feature":"_charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"attributes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"autodie","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::Guard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::GuardStack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception::system","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::hints","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autouse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"bigint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bignum","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bigrat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"blib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"bytes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"deprecate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"diagnostics","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","370","0"],"version":"1.37"},{"feature":"encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","0","0"],"version":"3.00"},{"feature":"encoding::warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"experimental","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","22","0"],"version":"0.022"},{"feature":"feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"fields","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"filetest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"if","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","900"],"version":"0.0609"},{"feature":"integer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"less","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","650","0"],"version":"0.65"},{"feature":"locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"mro","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","250","0"],"version":"1.25"},{"feature":"ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"open","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"ops","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"overload","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"overloading","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","238","0"],"version":"0.238"},{"feature":"perlfaq","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","11","70"],"version":"5.20201107"},{"feature":"re","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"sigtrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"sort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"strict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"subs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"threads","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","260","0"],"version":"2.26"},{"feature":"threads::shared","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","240","0"],"version":"1.24"},{"feature":"vars","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"vmsish","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"warnings::register","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Bump again","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"perl","namespace":"language","version_requirements":[{"comparator":"eq","version":"5.32.1"}]}]},{"alternatives":[],"artifact_id":"41dbce7b-0d0f-597b-bb6f-411a4fb0b829","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:49:47.162Z","ingredient_id":"30c076f2-aeec-5c1d-bff1-0e289f201c27","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/30c076f2-aeec-5c1d-bff1-0e289f201c27"},"name":"Canary-Stability","normalized_name":"Canary-Stability","primary_namespace":"language/perl","description":"unknown"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:49:47.162Z","ingredient_id":"30c076f2-aeec-5c1d-bff1-0e289f201c27","ingredient_version_id":"9930b34d-2ad3-507f-912f-729e5bb4e3e1","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/30c076f2-aeec-5c1d-bff1-0e289f201c27/versions/9930b34d-2ad3-507f-912f-729e5bb4e3e1","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/30c076f2-aeec-5c1d-bff1-0e289f201c27"},"revision":5,"revision_timestamp":"2020-10-28T19:29:22.748Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2019-04-22T00:00:00.000Z","source_uri":"https://cpan.metacpan.org/authors/id/M/ML/MLEHMANN/Canary-Stability-2013.tar.gz","sortable_version":["2013","0","0"],"version":"2013","activestate_license_expression":"[\"UNKNOWN\"]","camel_extras":{"mm_fullext":"Canary/Stability"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/a5c91c62cf95fcb868f60eab5c832908f6905221013fea2bce3ff57046d7b6ea/Canary-Stability-2013.tar.gz","scanner_license_expression":"[\"UNKNOWN\"]","source_checksum":"a5c91c62cf95fcb868f60eab5c832908f6905221013fea2bce3ff57046d7b6ea","status":"stable","provided_features":[{"feature":"Canary-Stability","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","0","0"],"version":"2013"},{"feature":"Canary::Stability","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","0","0"],"version":"2013"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"bfe02625-c7d6-5604-ae04-2e5b4c9592a2","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["runtime"],"ingredient_version_id":"bc4acfbd-4c39-59fd-bc9c-62662b851b3d"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:21.454Z","ingredient_id":"d7097446-572b-5dd9-a9b8-3a3007254971","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d7097446-572b-5dd9-a9b8-3a3007254971"},"name":"JSON","normalized_name":"JSON","primary_namespace":"language/perl","description":"JSON (JavaScript Object Notation) encoder/decoder"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:21.454Z","ingredient_id":"d7097446-572b-5dd9-a9b8-3a3007254971","ingredient_version_id":"a64758c6-32a6-5c57-8c43-64a5e53d7309","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d7097446-572b-5dd9-a9b8-3a3007254971/versions/a64758c6-32a6-5c57-8c43-64a5e53d7309","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d7097446-572b-5dd9-a9b8-3a3007254971"},"revision":5,"revision_timestamp":"2020-10-28T19:30:10.278Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-12-21T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/I/IS/ISHIGAKI/JSON-2.97001.tar.gz","sortable_version":["2","970","10"],"version":"2.97001","activestate_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","camel_extras":{"mm_fullext":"JSON"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/e277d9385633574923f48c297e1b8acad3170c69fa590e31fa466040fc6f8f5a/JSON-2.97001.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"e277d9385633574923f48c297e1b8acad3170c69fa590e31fa466040fc6f8f5a","status":"stable","provided_features":[{"feature":"JSON","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","970","10"],"version":"2.97001"},{"feature":"JSON::Backend::PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","970","10"],"version":"2.97001"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"JSON","namespace":"language/perl","version_requirements":[{"comparator":"eq","version":"2.97001"}]}]},{"alternatives":[],"artifact_id":"d51871fd-d270-5423-82b9-78b567c53636","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"09e2438e-36a3-534b-9626-f5a8825d84ad"},{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"9930b34d-2ad3-507f-912f-729e5bb4e3e1"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"},{"dependency_types":["runtime"],"ingredient_version_id":"f547017b-1726-5839-bb7f-214e420b2f66"}],"ingredient":{"creation_timestamp":"2020-05-28T03:27:37.165Z","ingredient_id":"7175217d-d9f2-5995-81ac-e02130308bff","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7175217d-d9f2-5995-81ac-e02130308bff"},"name":"JSON-XS","normalized_name":"JSON-XS","primary_namespace":"language/perl","description":"JSON serialising/deserialising, done correctly and fast"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-11-06T22:06:27.391Z","ingredient_id":"7175217d-d9f2-5995-81ac-e02130308bff","ingredient_version_id":"bc4acfbd-4c39-59fd-bc9c-62662b851b3d","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7175217d-d9f2-5995-81ac-e02130308bff/versions/bc4acfbd-4c39-59fd-bc9c-62662b851b3d","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7175217d-d9f2-5995-81ac-e02130308bff"},"revision":2,"revision_timestamp":"2020-11-06T22:08:22.659Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Marc A. Lehmann/JSON-XS-4.03","is_binary_only":false,"license_expression":"[\"UNKNOWN\"]","release_timestamp":"2020-10-27T22:06:42.000Z","source_uri":"https://cpan.metacpan.org/authors/id/M/ML/MLEHMANN/JSON-XS-4.03.tar.gz","sortable_version":["4","30","0"],"version":"4.03","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/515536f45f2fa1a7e88c8824533758d0121d267ab9cb453a1b5887c8a56b9068/JSON-XS-4.03.tar.gz","scanner_license_expression":"[\"UNKNOWN\"]","source_checksum":"515536f45f2fa1a7e88c8824533758d0121d267ab9cb453a1b5887c8a56b9068","status":"stable","provided_features":[{"feature":"JSON-XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","30","0"],"version":"4.03"},{"feature":"JSON::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","30","0"],"version":"4.03"}],"author_platform_user_id":"e51a58da-d22b-49c2-9fe6-f143159120eb","comment":"Data Acquisition import run with commit ID 480d651c28a7e7ec4c859026ee7769bf55b04eb3 and reason: Could not be determined from the database query","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"c62e933c-7f68-5e94-8fcd-5f978e3825b4","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"09e2438e-36a3-534b-9626-f5a8825d84ad"},{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2020-05-28T04:02:06.763Z","ingredient_id":"39c3be00-6b88-5a55-84c4-73dc262804c8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/39c3be00-6b88-5a55-84c4-73dc262804c8"},"name":"Types-Serialiser","normalized_name":"Types-Serialiser","primary_namespace":"language/perl","description":"simple data types for common serialisation formats"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-05-28T04:02:06.763Z","ingredient_id":"39c3be00-6b88-5a55-84c4-73dc262804c8","ingredient_version_id":"f547017b-1726-5839-bb7f-214e420b2f66","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/39c3be00-6b88-5a55-84c4-73dc262804c8/versions/f547017b-1726-5839-bb7f-214e420b2f66","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/39c3be00-6b88-5a55-84c4-73dc262804c8"},"revision":3,"revision_timestamp":"2020-10-28T19:36:01.552Z","copyright_text":"TODO","documentation_uri":"https://metacpan.org/release/Marc A. Lehmann/Types-Serialiser-1.0","is_binary_only":false,"license_expression":"[\"UNKNOWN\"]","release_timestamp":"2013-12-01T02:33:51.000Z","source_uri":"https://cpan.metacpan.org/authors/id/M/ML/MLEHMANN/Types-Serialiser-1.0.tar.gz","sortable_version":["1","0","0"],"version":"1.0","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/7ad3347849d8a3da6470135018d6af5fd8e58b4057cd568c3813695f2a04730d/Types-Serialiser-1.0.tar.gz","scanner_license_expression":"[\"UNKNOWN\"]","source_checksum":"7ad3347849d8a3da6470135018d6af5fd8e58b4057cd568c3813695f2a04730d","status":"stable","provided_features":[{"feature":"Types-Serialiser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Types::Serialiser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Types::Serialiser::BooleanBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Types::Serialiser::Error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"added by migration to correct missing language core dependencies","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"279d6621-2756-5f82-b1d4-1bd7a41dfc57","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:55:32.137Z","ingredient_id":"e85cb0a8-36db-5b6c-85f3-eeb294932e62","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/e85cb0a8-36db-5b6c-85f3-eeb294932e62"},"name":"common-sense","normalized_name":"common-sense","primary_namespace":"language/perl","description":"save a tree AND a kitten, use common::sense!"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-11-06T22:12:09.083Z","ingredient_id":"e85cb0a8-36db-5b6c-85f3-eeb294932e62","ingredient_version_id":"09e2438e-36a3-534b-9626-f5a8825d84ad","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/e85cb0a8-36db-5b6c-85f3-eeb294932e62/versions/09e2438e-36a3-534b-9626-f5a8825d84ad","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/e85cb0a8-36db-5b6c-85f3-eeb294932e62"},"revision":2,"revision_timestamp":"2020-11-06T22:14:53.147Z","copyright_text":"Could not be determined","documentation_uri":"https://metacpan.org/release/Marc A. Lehmann/common-sense-3.75","is_binary_only":false,"license_expression":"[\"UNKNOWN\"]","release_timestamp":"2020-04-02T11:54:39.000Z","source_uri":"https://cpan.metacpan.org/authors/id/M/ML/MLEHMANN/common-sense-3.75.tar.gz","sortable_version":["3","750","0"],"version":"3.75","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/a86a1c4ca4f3006d7479064425a09fa5b6689e57261fcb994fe67d061cba0e7e/common-sense-3.75.tar.gz","scanner_license_expression":"[\"UNKNOWN\"]","source_checksum":"a86a1c4ca4f3006d7479064425a09fa5b6689e57261fcb994fe67d061cba0e7e","status":"stable","provided_features":[{"feature":"common-sense","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"common::sense","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"}],"author_platform_user_id":"e51a58da-d22b-49c2-9fe6-f143159120eb","comment":"Data Acquisition import run with commit ID 480d651c28a7e7ec4c859026ee7769bf55b04eb3 and reason: Could not be determined from the database query","is_stable_revision":true},"patches":null,"resolved_requirements":[]}],"solver_version":1} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-removed.json b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-removed.json new file mode 100644 index 0000000000..52f1bb3f8f --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-removed.json @@ -0,0 +1 @@ +{"camel_flags":[],"from_recipe_store":true,"image":{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"},"is_indemnified":false,"platform":{"cpu_architecture":{"cpu_architecture_id":"4cdba18d-0851-4925-9ae5-9c8a2987828a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/cpu-architectures/4cdba18d-0851-4925-9ae5-9c8a2987828a"},"bit_width":"64","name":"x86","provided_features":[{"feature":"x86 64-bit","is_activestate_version":false,"is_default_provider":true,"namespace":"cpu-architecture","sortable_version":["1","0"],"version":"1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"cpu_extensions":[],"creation_timestamp":"2021-01-15T18:05:36.924Z","display_name":"CentOS 8, Linux 4.18.0, glibc 2.28 x86 64-bit","end_of_support_date":"2025-12-31","images":[{"image_id":"00216735-694e-4ef8-a7d5-7724b9200be0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/00216735-694e-4ef8-a7d5-7724b9200be0"},"name":"docker-registry.activestate.build/activestate/centos-8-build","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","1","0"],"version":"1.1","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"eq","sortable_version":[]}]}],"revision":1,"revision_timestamp":"2021-01-15T18:07:52.645Z"},{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"}],"is_user_visible":true,"kernel":{"kernel_id":"ef737274-fff9-4164-b72b-88067613f822","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822"},"name":"Linux"},"kernel_version":{"kernel_version_id":"61f9365e-03ed-448f-9a24-2b845727e4f5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822/versions/61f9365e-03ed-448f-9a24-2b845727e4f5"},"sortable_version":["4","18","0","0"],"version":"4.18.0","provided_features":[{"feature":"Linux","is_activestate_version":false,"is_default_provider":true,"namespace":"kernel","sortable_version":["4","18","0","0"],"version":"4.18.0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:04.588Z"},"libc":{"libc_id":"09a2eb42-ad34-4734-a93e-4b97395577df","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df"},"name":"glibc"},"libc_version":{"libc_version_id":"22d234e7-145e-4688-9d05-ee164b4ffa12","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df/versions/22d234e7-145e-4688-9d05-ee164b4ffa12"},"sortable_version":["2","28","0"],"version":"2.28","provided_features":[{"feature":"glibc","is_activestate_version":false,"is_default_provider":true,"namespace":"libc","sortable_version":["2","28","0"],"version":"2.28"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:19.136Z"},"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/platforms/7c998ec2-7491-4e75-be4d-8885800ef5f2"},"operating_system":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99"},"operating_system_id":"7b3a2dbb-d543-48d6-8390-7e7b63751e99","has_libc":true,"name":"CentOS"},"operating_system_version":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99/versions/42cab97b-9d80-407f-89a8-230836868e88"},"operating_system_version_id":"42cab97b-9d80-407f-89a8-230836868e88","sortable_version":["8","0"],"version":"8","provided_features":[{"feature":"CentOS","is_activestate_version":false,"is_default_provider":true,"namespace":"operating-system","sortable_version":["8","0"],"version":"8"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:50.448Z"},"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2"},"recipe_id":"aa21f7c8-85a7-5cc2-8ee8-f8bd3b342406","recipe_store_timestamp":"2021-02-04T17:59:12.286Z","resolved_ingredients":[{"alternatives":[],"artifact_id":"cf3d86c1-2587-564e-a7b2-0cf109ce263e","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-08-10T23:47:40.385Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"name":"perl-core-builder","normalized_name":"perl-core-builder","primary_namespace":"builder","description":"Builds the core Perl interpreter on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-30T17:58:38.567Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31/versions/d5ac8c7c-b025-5418-ab77-a139e60e1d41","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"revision":2,"revision_timestamp":"2020-10-30T17:04:06.702Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-06-25T07:05:14.000Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-core-builder","sortable_version":["1","0","23","0"],"version":"1.0.23","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374/perl-core-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"perl-core-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","23","0"],"version":"1.0.23"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Initial builder for perl 5.30+","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41"}],"ingredient":{"creation_timestamp":"2019-10-01T16:56:32.665Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"name":"perl","normalized_name":"perl","primary_namespace":"language","description":"Practical Extraction and Report Language"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2021-01-29T18:11:47.039Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206/versions/86005392-bdbf-59bd-a716-70ce7fcd3a66","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"revision":3,"revision_timestamp":"2021-02-03T21:14:56.873Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"1970-01-01T00:00:00.000Z","source_uri":"https://cpan.metacpan.org/authors/id/S/SH/SHAY/perl-5.32.1.tar.gz","sortable_version":["5","32","1"],"version":"5.32.1","activestate_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/language/03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c/perl-5.32.1.tar.gz","scanner_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","source_checksum":"03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c","status":"stable","provided_features":[{"feature":"alternative-built-language","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1","0"],"version":"5.32.1"},{"feature":"perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1"],"version":"5.32.1"},{"feature":"Amiga::ARexx","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","50","0"],"version":"0.05"},{"feature":"Amiga::Exec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"App::Cpan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","676","0"],"version":"1.676"},{"feature":"App::Prove","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Archive::Tar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Attribute::Handlers","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"AutoLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","740","0"],"version":"5.74"},{"feature":"AutoSplit","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"B","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","820","0"],"version":"1.82"},{"feature":"B::Concise","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.004"},{"feature":"B::Deparse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"B::Op_private","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"B::Showlex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"B::Terse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"B::Xref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Benchmark","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"CPAN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"CPAN::Author","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Bundle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","500"],"version":"5.5005"},{"feature":"CPAN::CacheMgr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::DeferredCode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::Distribution","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Distroprefs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","0","100"],"version":"6.0001"},{"feature":"CPAN::Distrostatus","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::RecursiveDependency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Exception::blocked_urllist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"CPAN::Exception::yaml_not_installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::yaml_process_error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::FTP::netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"CPAN::FirstTime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","531","500"],"version":"5.5315"},{"feature":"CPAN::HTTP::Client","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HTTP::Credentials","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HandleConfig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","100"],"version":"5.5011"},{"feature":"CPAN::Index","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","120","0"],"version":"2.12"},{"feature":"CPAN::InfoObj","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Kwalify","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::LWP::UserAgent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Converter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::History","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Merge","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Prereqs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Requirements","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","140","0"],"version":"2.140"},{"feature":"CPAN::Meta::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Validator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","18","0"],"version":"0.018"},{"feature":"CPAN::Mirrors","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Nox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","970","0"],"version":"0.97"},{"feature":"CPAN::Plugin::Specfile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"CPAN::Prompt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Shell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","900"],"version":"5.5009"},{"feature":"CPAN::Tarzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::URL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"Carp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Carp::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Class::Struct","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","660","0"],"version":"0.66"},{"feature":"Compress::Raw::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Raw::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"Config::Extensions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"Config::Perl::V","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"Cwd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"DB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"DBM_Filter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"DBM_Filter::compress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::int32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::null","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DB_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","855","0"],"version":"1.855"},{"feature":"Data::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","176","0"],"version":"2.176"},{"feature":"Devel::PPPort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","620","0"],"version":"3.62"},{"feature":"Devel::Peek","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Devel::SelfStubber","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Digest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::MD5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","580","0"],"version":"2.58"},{"feature":"Digest::SHA","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","20","0"],"version":"6.02"},{"feature":"Digest::base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"DirHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Dumpvalue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"DynaLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"Encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","80","0"],"version":"3.08"},{"feature":"Encode::Alias","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"Encode::Byte","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::CJKConstants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::CN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::CN::HZ","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"Encode::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.05"},{"feature":"Encode::EBCDIC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::Encoder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::GSM0338","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"Encode::Guess","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::JP::H2Z","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::JP::JIS7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::KR::2022_KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::MIME::Header","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"Encode::MIME::Header::ISO_2022_JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Encode::MIME::Name","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Encode::Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::TW","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"Encode::Unicode::UTF7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"English","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Errno","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"Exporter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"Exporter::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"ExtUtils::CBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::BCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::MSVC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::aix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::android","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::dec_osf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::os2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Command::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","250","0"],"version":"0.25"},{"feature":"ExtUtils::Constant::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"ExtUtils::Constant::ProxySubs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"ExtUtils::Constant::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"ExtUtils::Constant::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"ExtUtils::Embed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","350","0"],"version":"1.35"},{"feature":"ExtUtils::Install","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Liblist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Liblist::Kid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_AIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Any","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_BeOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_DOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_NW5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_UWIN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win95","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Manifest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","730","0"],"version":"1.73"},{"feature":"ExtUtils::Miniperl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"ExtUtils::Mkbootstrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Mksymlists","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Packlist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::ParseXS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::CountLines","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Eval","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Utilities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::Typemaps","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::InputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::OutputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Type","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::XSSymSet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.4"},{"feature":"ExtUtils::testlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"Fatal","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"Fcntl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","140","0"],"version":"1.14"},{"feature":"File::Basename","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","850","0"],"version":"2.85"},{"feature":"File::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","600"],"version":"1.1006"},{"feature":"File::Copy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","350","0"],"version":"2.35"},{"feature":"File::DosGlob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"File::Fetch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.00"},{"feature":"File::Find","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","380","0"],"version":"1.38"},{"feature":"File::Glob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"File::GlobMapper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"File::Path","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"File::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::AmigaOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Epoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Temp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","231","100"],"version":"0.2311"},{"feature":"File::stat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"FileCache","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"FileHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Filter::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","960","0"],"version":"0.96"},{"feature":"Filter::Util::Call","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","600","0"],"version":"1.60"},{"feature":"FindBin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"GDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Getopt::Long","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","520","0"],"version":"2.52"},{"feature":"Getopt::Std","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"HTTP::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","76","0"],"version":"0.076"},{"feature":"Hash::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","240","0"],"version":"0.24"},{"feature":"Hash::Util::FieldHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"I18N::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"I18N::LangTags","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","450","0"],"version":"0.45"},{"feature":"I18N::LangTags::Detect","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"I18N::LangTags::List","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","400","0"],"version":"0.40"},{"feature":"I18N::Langinfo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","190","0"],"version":"0.19"},{"feature":"IO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Compress::Adapter::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base::Common","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::RawDeflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Extra","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Dir","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Pipe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Poll","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Seekable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Select","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::INET","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::IP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"IO::Socket::UNIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Uncompress::Adapter::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyUncompress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Gunzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::RawInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Unzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"IPC::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"IPC::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::Open2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"IPC::Open3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"IPC::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SharedMem","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SysV","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"JSON::PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"JSON::PP::Boolean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"List::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"List::Util::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Locale::Maketext","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Locale::Maketext::Guts","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::GutsLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","210","100"],"version":"0.21_01"},{"feature":"MIME::Base64","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"MIME::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"Math::BigFloat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigFloat::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigInt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Calc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::FastCalc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","500","900"],"version":"0.5009"},{"feature":"Math::BigInt::Lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigRat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","261","400"],"version":"0.2614"},{"feature":"Math::Complex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","590","200"],"version":"1.5902"},{"feature":"Math::Trig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","100"],"version":"1.03_01"},{"feature":"Memoize::AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Expire","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireFile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireTest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Module::CoreList","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::CoreList::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::Load","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"Module::Load::Conditional","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","740","0"],"version":"0.74"},{"feature":"Module::Loaded","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","80","0"],"version":"0.08"},{"feature":"Module::Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","37"],"version":"1.000037"},{"feature":"Moped::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10","0"],"version":"0.01"},{"feature":"NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"NEXT","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","670","100"],"version":"0.67_01"},{"feature":"Net::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Domain","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::A","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::E","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::I","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::L","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::dataconn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::NNTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::POP3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Ping","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","740","0"],"version":"2.74"},{"feature":"Net::SMTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Time","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::hostent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Net::netent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::protoent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::servent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"O","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"ODBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"OS2::DLL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"OS2::ExtAttr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::PrfDB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"OS2::REXX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Opcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","490","0"],"version":"1.49"},{"feature":"POSIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","970","0"],"version":"1.97"},{"feature":"Params::Check","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","380","0"],"version":"0.38"},{"feature":"Parse::CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"Perl::OSType","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.010"},{"feature":"PerlIO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"PerlIO::encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","0"],"version":"0.28"},{"feature":"PerlIO::mmap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","17","0"],"version":"0.017"},{"feature":"PerlIO::scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","310","0"],"version":"0.31"},{"feature":"PerlIO::via","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"PerlIO::via::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"Pod::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","740","0"],"version":"1.74"},{"feature":"Pod::Escapes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Pod::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Functions::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Html","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Pod::Man","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::ParseLink","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Perldoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","100"],"version":"3.2801"},{"feature":"Pod::Perldoc::BaseTo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::GetOptsOO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToANSI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToChecker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToMan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToNroff","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToPod","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToRtf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTerm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTk","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToXml","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::BlackBox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsXML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLBatch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLLegacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Pod::Simple::LinkSection","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Methody","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Progress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserEndToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserStartToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserTextToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::RTF","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Search","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::SimpleTree","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TextContent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TiedOutFH","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Transcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeDumb","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeSmart","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XHTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XMLOutStream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Overstrike","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Termcap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Usage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","10","0"],"version":"2.01"},{"feature":"SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"Safe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","430","0"],"version":"2.43"},{"feature":"Scalar::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Search::Dict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"SelectSaver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"SelfLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.030"},{"feature":"Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","230","0"],"version":"3.23"},{"feature":"Sub::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Sys::Hostname","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Sys::Syslog","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"TAP::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::ParallelSession","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness::Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Object","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Aggregator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Grammar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::IteratorFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Multiplexer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Bailout","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Comment","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Pragma","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Unknown","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::ResultFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Job","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Spinner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Source","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Executable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::RawTAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Reader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Writer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Term::ANSIColor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Term::Cap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Term::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","403","0"],"version":"1.403"},{"feature":"Term::ReadLine","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","310","0"],"version":"1.31"},{"feature":"Test2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Breakage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Instance","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Stack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Bail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Diag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Fail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Note","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Pass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::TAP::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::V2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Waiting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::About","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Amnesty","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Assert","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Control","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Render","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter::TAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor::Terminator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver::Files","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Tools::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::ExternalMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Facets2Legacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::IO::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","114","0"],"version":"2.114"},{"feature":"Test::Builder::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::TodoDiag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Test::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Capture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::CaptureRunner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Delegate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::use::ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Text::Abbrev","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Text::Balanced","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Text::ParseWords","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","300","0"],"version":"3.30"},{"feature":"Text::Tabs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Text::Wrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Thread","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","50","0"],"version":"3.05"},{"feature":"Thread::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","140","0"],"version":"3.14"},{"feature":"Thread::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","130","0"],"version":"2.13"},{"feature":"Tie::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Tie::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Tie::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","200","0"],"version":"4.2"},{"feature":"Tie::Hash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::Hash::NamedCapture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"Tie::Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"Tie::RefHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.40"},{"feature":"Tie::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::StdHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","600","0"],"version":"4.6"},{"feature":"Tie::SubstrHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Time::HiRes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","976","600"],"version":"1.9766"},{"feature":"Time::Local","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Time::Piece","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::Seconds","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::gmtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"Time::localtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Time::tm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"UNIVERSAL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["13","0","0"],"version":"13.0.0"},{"feature":"Unicode::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Big5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::GB2312","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::JISX0208","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Korean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Pinyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Stroke","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Zhuyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Normalize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","280","0"],"version":"1.28"},{"feature":"Unicode::UCD","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","750","0"],"version":"0.75"},{"feature":"User::grent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"User::pwent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"VMS::DCLsym","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"VMS::Filespec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"VMS::Stdio","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","450","0"],"version":"2.45"},{"feature":"Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","540","0"],"version":"0.54"},{"feature":"Win32API::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","120","301"],"version":"0.1203_01"},{"feature":"Win32API::File::inc::ExtUtils::Myconst2perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1"},{"feature":"Win32CORE","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"XS::APItest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"XS::Typemap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"XSLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","300","0"],"version":"0.30"},{"feature":"_charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"attributes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"autodie","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::Guard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::GuardStack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception::system","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::hints","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autouse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"bigint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bignum","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bigrat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"blib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"bytes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"deprecate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"diagnostics","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","370","0"],"version":"1.37"},{"feature":"encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","0","0"],"version":"3.00"},{"feature":"encoding::warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"experimental","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","22","0"],"version":"0.022"},{"feature":"feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"fields","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"filetest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"if","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","900"],"version":"0.0609"},{"feature":"integer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"less","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","650","0"],"version":"0.65"},{"feature":"locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"mro","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","250","0"],"version":"1.25"},{"feature":"ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"open","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"ops","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"overload","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"overloading","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","238","0"],"version":"0.238"},{"feature":"perlfaq","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","11","70"],"version":"5.20201107"},{"feature":"re","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"sigtrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"sort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"strict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"subs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"threads","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","260","0"],"version":"2.26"},{"feature":"threads::shared","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","240","0"],"version":"1.24"},{"feature":"vars","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"vmsish","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"warnings::register","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Bump again","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"perl","namespace":"language","version_requirements":[{"comparator":"eq","version":"5.32.1"}]}]}],"solver_version":1} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-update.json b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-update.json new file mode 100644 index 0000000000..4c3c489cd7 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/recipes/perl-alternative-one-update.json @@ -0,0 +1 @@ +{"camel_flags":[],"from_recipe_store":true,"image":{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"},"is_indemnified":false,"platform":{"cpu_architecture":{"cpu_architecture_id":"4cdba18d-0851-4925-9ae5-9c8a2987828a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/cpu-architectures/4cdba18d-0851-4925-9ae5-9c8a2987828a"},"bit_width":"64","name":"x86","provided_features":[{"feature":"x86 64-bit","is_activestate_version":false,"is_default_provider":true,"namespace":"cpu-architecture","sortable_version":["1","0"],"version":"1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"cpu_extensions":[],"creation_timestamp":"2021-01-15T18:05:36.924Z","display_name":"CentOS 8, Linux 4.18.0, glibc 2.28 x86 64-bit","end_of_support_date":"2025-12-31","images":[{"image_id":"00216735-694e-4ef8-a7d5-7724b9200be0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/00216735-694e-4ef8-a7d5-7724b9200be0"},"name":"docker-registry.activestate.build/activestate/centos-8-build","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","1","0"],"version":"1.1","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"eq","sortable_version":[]}]}],"revision":1,"revision_timestamp":"2021-01-15T18:07:52.645Z"},{"image_id":"6b334b10-5211-4dc4-b97b-641de9eedcf3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/6b334b10-5211-4dc4-b97b-641de9eedcf3"},"name":"docker-registry.activestate.build/activestate/centos-8-builder","platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2","type":"Docker","sortable_version":["1","13","0"],"version":"1.13","provided_features":[{"feature":"GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"compiler","sortable_version":["8","3","0"],"version":"8.3"},{"feature":"GNU C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"GNU C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++03","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++11","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++14","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C89","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C++98","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO C99","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 77","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 90","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"},{"feature":"ISO Fortran 95","is_activestate_version":true,"is_default_provider":true,"namespace":"compiler","sortable_version":["0","0"],"version":"0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Added a new revision to add compiler features to images","is_stable_revision":true,"conditions":[{"feature":"alternative-builder","namespace":"builder","requirements":[{"comparator":"gte","sortable_version":["0","0","1","0"],"version":"0.0.1"}]},{"feature":"alternative-built-language","namespace":"language","requirements":[{"comparator":"gte","sortable_version":["0","0"],"version":"0"}]}],"revision":1,"revision_timestamp":"2021-02-02T15:39:53.469Z"}],"is_user_visible":true,"kernel":{"kernel_id":"ef737274-fff9-4164-b72b-88067613f822","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822"},"name":"Linux"},"kernel_version":{"kernel_version_id":"61f9365e-03ed-448f-9a24-2b845727e4f5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822/versions/61f9365e-03ed-448f-9a24-2b845727e4f5"},"sortable_version":["4","18","0","0"],"version":"4.18.0","provided_features":[{"feature":"Linux","is_activestate_version":false,"is_default_provider":true,"namespace":"kernel","sortable_version":["4","18","0","0"],"version":"4.18.0"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:04.588Z"},"libc":{"libc_id":"09a2eb42-ad34-4734-a93e-4b97395577df","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df"},"name":"glibc"},"libc_version":{"libc_version_id":"22d234e7-145e-4688-9d05-ee164b4ffa12","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df/versions/22d234e7-145e-4688-9d05-ee164b4ffa12"},"sortable_version":["2","28","0"],"version":"2.28","provided_features":[{"feature":"glibc","is_activestate_version":false,"is_default_provider":true,"namespace":"libc","sortable_version":["2","28","0"],"version":"2.28"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:19.136Z"},"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/platforms/7c998ec2-7491-4e75-be4d-8885800ef5f2"},"operating_system":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99"},"operating_system_id":"7b3a2dbb-d543-48d6-8390-7e7b63751e99","has_libc":true,"name":"CentOS"},"operating_system_version":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99/versions/42cab97b-9d80-407f-89a8-230836868e88"},"operating_system_version_id":"42cab97b-9d80-407f-89a8-230836868e88","sortable_version":["8","0"],"version":"8","provided_features":[{"feature":"CentOS","is_activestate_version":false,"is_default_provider":true,"namespace":"operating-system","sortable_version":["8","0"],"version":"8"}],"author_platform_user_id":"36a36906-04a3-4221-adf1-805632ee9bb7","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2021-01-15T18:03:50.448Z"},"platform_id":"7c998ec2-7491-4e75-be4d-8885800ef5f2"},"recipe_id":"631c1698-0af4-5b38-ac98-2f8df4220b79","recipe_store_timestamp":"2021-02-20T07:47:23.762Z","resolved_ingredients":[{"alternatives":[],"artifact_id":"cf3d86c1-2587-564e-a7b2-0cf109ce263e","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-08-10T23:47:40.385Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"name":"perl-core-builder","normalized_name":"perl-core-builder","primary_namespace":"builder","description":"Builds the core Perl interpreter on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-09-30T17:58:38.567Z","ingredient_id":"a4128de4-f62c-5349-80e6-b072d5aa3e31","ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31/versions/d5ac8c7c-b025-5418-ab77-a139e60e1d41","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a4128de4-f62c-5349-80e6-b072d5aa3e31"},"revision":2,"revision_timestamp":"2020-10-30T17:04:06.702Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-06-25T07:05:14.000Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-core-builder","sortable_version":["1","0","23","0"],"version":"1.0.23","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374/perl-core-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"cb4bd9b790715ae38f4bbc1acffafb5b3d7d328fcfe29974e60ded1fece45374","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"perl-core-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","23","0"],"version":"1.0.23"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Initial builder for perl 5.30+","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"a1ebbc88-daeb-5588-8086-c99de70eabf7","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"ed446cc4-4e4d-5986-ad77-ed04a3b2e58b"}],"ingredient":{"creation_timestamp":"2020-08-10T23:48:55.390Z","ingredient_id":"196722f9-5600-5d89-9c47-42460922fdb1","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1"},"name":"perl-module-builder","normalized_name":"perl-module-builder","primary_namespace":"builder","description":"Builds Perl modules on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-12-07T20:54:12.006Z","ingredient_id":"196722f9-5600-5d89-9c47-42460922fdb1","ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1/versions/c4164b54-9b8f-55fc-ae5a-cd47c6389687","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/196722f9-5600-5d89-9c47-42460922fdb1"},"revision":1,"revision_timestamp":"2020-12-07T20:54:12.006Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-12-07T20:23:01.043Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-module-builder","sortable_version":["1","0","36","0"],"version":"1.0.36","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/bb8bb535334fb012df0550a528692f4826893b91b055ac73ffb37dd00322a7b6/perl-module-builder.tar.gz","scanner_license_expression":"unknown","source_checksum":"bb8bb535334fb012df0550a528692f4826893b91b055ac73ffb37dd00322a7b6","status":"stable","provided_features":[{"feature":"alternative-builder","is_activestate_version":false,"is_default_provider":false,"namespace":"builder","sortable_version":["1","0","0","0"],"version":"1.0.0"},{"feature":"perl-module-builder","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["1","0","36","0"],"version":"1.0.36"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Created new version 1.0.36 from 1.0.35.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"f7c88044-fdcd-5023-a0ce-9c4a6fcc2708","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2020-08-10T23:48:13.169Z","ingredient_id":"4c0fd8d2-5c39-5ecf-958e-325efdea1ef2","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2"},"name":"perl-module-lib","normalized_name":"perl-module-lib","primary_namespace":"builder-lib","description":"Builds Perl modules on the ActiveState platform.","website":"https://activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-12-07T20:54:42.776Z","ingredient_id":"4c0fd8d2-5c39-5ecf-958e-325efdea1ef2","ingredient_version_id":"ed446cc4-4e4d-5986-ad77-ed04a3b2e58b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2/versions/ed446cc4-4e4d-5986-ad77-ed04a3b2e58b","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c0fd8d2-5c39-5ecf-958e-325efdea1ef2"},"revision":2,"revision_timestamp":"2020-12-10T17:22:10.292Z","copyright_text":"To be added.","documentation_uri":"https://activestate.com","is_binary_only":false,"license_expression":"(MIT-1.0)","release_timestamp":"2020-12-07T20:25:59.954Z","source_uri":"https://github.com/ActiveState/platform-builders/builders/perl-module-lib","sortable_version":["1","0","36","0"],"version":"1.0.36","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/builder/abdb22574b2300f30e98ab9239892f379c0c60bf33634a2b49518bddc730413d/perl-module-lib.tar.gz","scanner_license_expression":"unknown","source_checksum":"abdb22574b2300f30e98ab9239892f379c0c60bf33634a2b49518bddc730413d","status":"stable","provided_features":[{"feature":"perl-module-lib","is_activestate_version":false,"is_default_provider":true,"namespace":"builder-lib","sortable_version":["1","0","36","0"],"version":"1.0.36"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"Created new version 1.0.36 from 1.0.35.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"b30ab2e5-4074-572c-8146-da692b1c9e45","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"d5ac8c7c-b025-5418-ab77-a139e60e1d41"}],"ingredient":{"creation_timestamp":"2019-10-01T16:56:32.665Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"name":"perl","normalized_name":"perl","primary_namespace":"language","description":"Practical Extraction and Report Language"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2021-01-29T18:11:47.039Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206/versions/86005392-bdbf-59bd-a716-70ce7fcd3a66","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"revision":3,"revision_timestamp":"2021-02-03T21:14:56.873Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"1970-01-01T00:00:00.000Z","source_uri":"https://cpan.metacpan.org/authors/id/S/SH/SHAY/perl-5.32.1.tar.gz","sortable_version":["5","32","1"],"version":"5.32.1","activestate_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/language/03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c/perl-5.32.1.tar.gz","scanner_license_expression":"[\" GPL-1.0-or-later\",\"Artistic-1.0-Perl\"]","source_checksum":"03b693901cd8ae807231b1787798cf1f2e0b8a56218d07b7da44f784a7caeb2c","status":"stable","provided_features":[{"feature":"alternative-built-language","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1","0"],"version":"5.32.1"},{"feature":"perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","32","1"],"version":"5.32.1"},{"feature":"Amiga::ARexx","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","50","0"],"version":"0.05"},{"feature":"Amiga::Exec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"App::Cpan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","676","0"],"version":"1.676"},{"feature":"App::Prove","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"App::Prove::State::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Archive::Tar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Archive::Tar::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","380","0"],"version":"2.38"},{"feature":"Attribute::Handlers","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"AutoLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","740","0"],"version":"5.74"},{"feature":"AutoSplit","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"B","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","820","0"],"version":"1.82"},{"feature":"B::Concise","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.004"},{"feature":"B::Deparse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"B::Op_private","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"B::Showlex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"B::Terse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"B::Xref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Benchmark","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"CPAN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"CPAN::Author","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Bundle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","500"],"version":"5.5005"},{"feature":"CPAN::CacheMgr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","200"],"version":"5.5002"},{"feature":"CPAN::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::DeferredCode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::Distribution","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Distroprefs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","0","100"],"version":"6.0001"},{"feature":"CPAN::Distrostatus","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::RecursiveDependency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Exception::blocked_urllist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"CPAN::Exception::yaml_not_installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Exception::yaml_process_error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::FTP::netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"CPAN::FirstTime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","531","500"],"version":"5.5315"},{"feature":"CPAN::HTTP::Client","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HTTP::Credentials","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::HandleConfig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","100"],"version":"5.5011"},{"feature":"CPAN::Index","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","120","0"],"version":"2.12"},{"feature":"CPAN::InfoObj","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Kwalify","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.50"},{"feature":"CPAN::LWP::UserAgent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","960","100"],"version":"1.9601"},{"feature":"CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Converter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::History","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Merge","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Prereqs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Requirements","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","140","0"],"version":"2.140"},{"feature":"CPAN::Meta::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::Validator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"CPAN::Meta::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","18","0"],"version":"0.018"},{"feature":"CPAN::Mirrors","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"CPAN::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Nox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","100"],"version":"5.5001"},{"feature":"CPAN::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","970","0"],"version":"0.97"},{"feature":"CPAN::Plugin::Specfile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"CPAN::Prompt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"CPAN::Shell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","900"],"version":"5.5009"},{"feature":"CPAN::Tarzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","501","300"],"version":"5.5013"},{"feature":"CPAN::URL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","0"],"version":"5.5"},{"feature":"CPAN::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","500","300"],"version":"5.5003"},{"feature":"Carp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Carp::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"Class::Struct","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","660","0"],"version":"0.66"},{"feature":"Compress::Raw::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Raw::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Compress::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","33","6"],"version":"5.033006"},{"feature":"Config::Extensions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"Config::Perl::V","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"Cwd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"DB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"DBM_Filter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"DBM_Filter::compress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::int32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::null","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DBM_Filter::utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"DB_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","855","0"],"version":"1.855"},{"feature":"Data::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","176","0"],"version":"2.176"},{"feature":"Devel::PPPort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","620","0"],"version":"3.62"},{"feature":"Devel::Peek","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Devel::SelfStubber","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Digest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::MD5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","580","0"],"version":"2.58"},{"feature":"Digest::SHA","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","20","0"],"version":"6.02"},{"feature":"Digest::base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Digest::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"DirHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Dumpvalue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"DynaLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"Encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","80","0"],"version":"3.08"},{"feature":"Encode::Alias","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"Encode::Byte","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::CJKConstants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::CN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::CN::HZ","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"Encode::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.05"},{"feature":"Encode::EBCDIC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::Encoder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::GSM0338","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"Encode::Guess","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::JP::H2Z","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::JP::JIS7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","80","0"],"version":"2.08"},{"feature":"Encode::KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::KR::2022_KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Encode::MIME::Header","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","280","0"],"version":"2.28"},{"feature":"Encode::MIME::Header::ISO_2022_JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Encode::MIME::Name","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Encode::Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.02"},{"feature":"Encode::TW","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Encode::Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"Encode::Unicode::UTF7","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.10"},{"feature":"English","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Errno","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"Exporter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"Exporter::Heavy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","760","0"],"version":"5.76"},{"feature":"ExtUtils::CBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::BCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::Windows::MSVC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::aix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::android","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::dec_osf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::CBuilder::Platform::os2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","235"],"version":"0.280235"},{"feature":"ExtUtils::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Command::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","250","0"],"version":"0.25"},{"feature":"ExtUtils::Constant::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","0"],"version":"0.06"},{"feature":"ExtUtils::Constant::ProxySubs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"ExtUtils::Constant::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"ExtUtils::Constant::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"ExtUtils::Embed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","350","0"],"version":"1.35"},{"feature":"ExtUtils::Install","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::Liblist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Liblist::Kid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_AIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Any","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_BeOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_DOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_NW5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_UWIN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MM_Win95","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::MakeMaker::version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Manifest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","730","0"],"version":"1.73"},{"feature":"ExtUtils::Miniperl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"ExtUtils::Mkbootstrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Mksymlists","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"ExtUtils::Packlist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","200","0"],"version":"2.20"},{"feature":"ExtUtils::ParseXS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::CountLines","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Eval","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::ParseXS::Utilities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"ExtUtils::Typemaps","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::InputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::OutputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Type","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","380","0"],"version":"3.38"},{"feature":"ExtUtils::XSSymSet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.4"},{"feature":"ExtUtils::testlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","580","0"],"version":"7.58"},{"feature":"Fatal","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"Fcntl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","140","0"],"version":"1.14"},{"feature":"File::Basename","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","850","0"],"version":"2.85"},{"feature":"File::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","600"],"version":"1.1006"},{"feature":"File::Copy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","350","0"],"version":"2.35"},{"feature":"File::DosGlob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"File::Fetch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.00"},{"feature":"File::Find","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","380","0"],"version":"1.38"},{"feature":"File::Glob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"File::GlobMapper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.001"},{"feature":"File::Path","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","180","0"],"version":"2.18"},{"feature":"File::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::AmigaOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Epoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Spec::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","800","0"],"version":"3.80"},{"feature":"File::Temp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","231","100"],"version":"0.2311"},{"feature":"File::stat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"FileCache","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"FileHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.03"},{"feature":"Filter::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","960","0"],"version":"0.96"},{"feature":"Filter::Util::Call","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","600","0"],"version":"1.60"},{"feature":"FindBin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","520","0"],"version":"1.52"},{"feature":"GDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","190","0"],"version":"1.19"},{"feature":"Getopt::Long","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","520","0"],"version":"2.52"},{"feature":"Getopt::Std","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"HTTP::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","76","0"],"version":"0.076"},{"feature":"Hash::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","240","0"],"version":"0.24"},{"feature":"Hash::Util::FieldHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"I18N::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"I18N::LangTags","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","450","0"],"version":"0.45"},{"feature":"I18N::LangTags::Detect","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","80","0"],"version":"1.08"},{"feature":"I18N::LangTags::List","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","400","0"],"version":"0.40"},{"feature":"I18N::Langinfo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","190","0"],"version":"0.19"},{"feature":"IO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Compress::Adapter::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Base::Common","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Bzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Deflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Gzip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::RawDeflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zip::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Compress::Zlib::Extra","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Dir","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Pipe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Poll","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Seekable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Select","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::INET","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Socket::IP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"IO::Socket::UNIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","450","0"],"version":"1.45"},{"feature":"IO::Uncompress::Adapter::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Identity","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Adapter::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::AnyUncompress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Bunzip2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Gunzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Inflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::RawInflate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Uncompress::Unzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","100","0"],"version":"2.100"},{"feature":"IO::Zlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"IPC::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"IPC::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::Open2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"IPC::Open3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","210","0"],"version":"1.21"},{"feature":"IPC::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SharedMem","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"IPC::SysV","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","90","0"],"version":"2.09"},{"feature":"JSON::PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"JSON::PP::Boolean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","50","0"],"version":"4.05"},{"feature":"List::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"List::Util::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Locale::Maketext","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Locale::Maketext::Guts","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::GutsLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","200","0"],"version":"1.20"},{"feature":"Locale::Maketext::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","210","100"],"version":"0.21_01"},{"feature":"MIME::Base64","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"MIME::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","160","0"],"version":"3.16"},{"feature":"Math::BigFloat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigFloat::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigInt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Calc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::FastCalc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","500","900"],"version":"0.5009"},{"feature":"Math::BigInt::Lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","999","818"],"version":"1.999818"},{"feature":"Math::BigInt::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"Math::BigRat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","261","400"],"version":"0.2614"},{"feature":"Math::Complex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","590","200"],"version":"1.5902"},{"feature":"Math::Trig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","100"],"version":"1.03_01"},{"feature":"Memoize::AnyDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Expire","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireFile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::ExpireTest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Memoize::Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Module::CoreList","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::CoreList::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","101","230"],"version":"5.20210123"},{"feature":"Module::Load","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"Module::Load::Conditional","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","740","0"],"version":"0.74"},{"feature":"Module::Loaded","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","80","0"],"version":"0.08"},{"feature":"Module::Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","37"],"version":"1.000037"},{"feature":"Moped::Msg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10","0"],"version":"0.01"},{"feature":"NDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"NEXT","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","670","100"],"version":"0.67_01"},{"feature":"Net::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Domain","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::A","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::E","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::I","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::L","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::FTP::dataconn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::NNTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::POP3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Ping","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","740","0"],"version":"2.74"},{"feature":"Net::SMTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::Time","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","130","0"],"version":"3.13"},{"feature":"Net::hostent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Net::netent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::protoent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"Net::servent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"O","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"ODBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"OS2::DLL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"OS2::ExtAttr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::PrfDB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"OS2::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"OS2::REXX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Opcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","490","0"],"version":"1.49"},{"feature":"POSIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","970","0"],"version":"1.97"},{"feature":"Params::Check","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","380","0"],"version":"0.38"},{"feature":"Parse::CPAN::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","150","10"],"version":"2.150010"},{"feature":"Perl::OSType","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.010"},{"feature":"PerlIO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"PerlIO::encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","280","0"],"version":"0.28"},{"feature":"PerlIO::mmap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","17","0"],"version":"0.017"},{"feature":"PerlIO::scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","310","0"],"version":"0.31"},{"feature":"PerlIO::via","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"PerlIO::via::QuotedPrint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","90","0"],"version":"0.09"},{"feature":"Pod::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","740","0"],"version":"1.74"},{"feature":"Pod::Escapes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Pod::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Functions::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Pod::Html","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Pod::Man","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::ParseLink","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Perldoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","100"],"version":"3.2801"},{"feature":"Pod::Perldoc::BaseTo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::GetOptsOO","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToANSI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToChecker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToMan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToNroff","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToPod","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToRtf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTerm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTk","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToXml","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","280","0"],"version":"3.28"},{"feature":"Pod::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::BlackBox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Checker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsText","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::DumpAsXML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLBatch","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::HTMLLegacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Pod::Simple::LinkSection","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Methody","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Progress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserEndToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserStartToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserTextToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::PullParserToken","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::RTF","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Search","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::SimpleTree","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TextContent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TiedOutFH","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::Transcode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeDumb","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::TranscodeSmart","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XHTML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Simple::XMLOutStream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","420","0"],"version":"3.42"},{"feature":"Pod::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Overstrike","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Text::Termcap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","140","0"],"version":"4.14"},{"feature":"Pod::Usage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","10","0"],"version":"2.01"},{"feature":"SDBM_File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"Safe","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","430","0"],"version":"2.43"},{"feature":"Scalar::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Search::Dict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"SelectSaver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"SelfLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","260","0"],"version":"1.26"},{"feature":"Socket","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.030"},{"feature":"Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","230","0"],"version":"3.23"},{"feature":"Sub::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","550","0"],"version":"1.55"},{"feature":"Symbol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"Sys::Hostname","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","230","0"],"version":"1.23"},{"feature":"Sys::Syslog","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","360","0"],"version":"0.36"},{"feature":"TAP::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::ParallelSession","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Console::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::File::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Formatter::Session","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Harness::Env","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Object","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Aggregator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Grammar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Process","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Iterator::Stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::IteratorFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Multiplexer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Bailout","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Comment","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Pragma","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Unknown","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Result::YAML","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::ResultFactory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Job","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Scheduler::Spinner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::Source","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Executable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::Perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::SourceHandler::RawTAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Reader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"TAP::Parser::YAMLish::Writer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Term::ANSIColor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","10","0"],"version":"5.01"},{"feature":"Term::Cap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Term::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","403","0"],"version":"1.403"},{"feature":"Term::ReadLine","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","170","0"],"version":"1.17"},{"feature":"Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","310","0"],"version":"1.31"},{"feature":"Test2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Breakage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Instance","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::API::Stack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Bail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Diag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Fail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Note","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Pass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::TAP::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::V2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Event::Waiting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::About","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Amnesty","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Assert","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Control","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Info::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Render","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::EventFacet::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Formatter::TAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Interceptor::Terminator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Hub::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::IPC::Driver::Files","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Tools::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::ExternalMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Facets2Legacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test2::Util::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::IO::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","114","0"],"version":"2.114"},{"feature":"Test::Builder::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::Tester::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Builder::TodoDiag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Harness","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","430","0"],"version":"3.43"},{"feature":"Test::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Capture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::CaptureRunner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::Tester::Delegate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Test::use::ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"Text::Abbrev","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"Text::Balanced","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"Text::ParseWords","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","300","0"],"version":"3.30"},{"feature":"Text::Tabs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Text::Wrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2013","52","300"],"version":"2013.0523"},{"feature":"Thread","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","50","0"],"version":"3.05"},{"feature":"Thread::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","140","0"],"version":"3.14"},{"feature":"Thread::Semaphore","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","130","0"],"version":"2.13"},{"feature":"Tie::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"Tie::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","60","0"],"version":"1.06"},{"feature":"Tie::Handle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","200","0"],"version":"4.2"},{"feature":"Tie::Hash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::Hash::NamedCapture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"Tie::Memoize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.1"},{"feature":"Tie::RefHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","400","0"],"version":"1.40"},{"feature":"Tie::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"Tie::StdHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","600","0"],"version":"4.6"},{"feature":"Tie::SubstrHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Time::HiRes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","976","600"],"version":"1.9766"},{"feature":"Time::Local","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","300","0"],"version":"1.30"},{"feature":"Time::Piece","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::Seconds","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","340","100"],"version":"1.3401"},{"feature":"Time::gmtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"Time::localtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"Time::tm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"UNIVERSAL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","130","0"],"version":"1.13"},{"feature":"Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["13","0","0"],"version":"13.0.0"},{"feature":"Unicode::Collate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Big5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::GB2312","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::JISX0208","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Korean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Pinyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Stroke","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::CJK::Zhuyin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Collate::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","290","0"],"version":"1.29"},{"feature":"Unicode::Normalize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","280","0"],"version":"1.28"},{"feature":"Unicode::UCD","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","750","0"],"version":"0.75"},{"feature":"User::grent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"User::pwent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"VMS::DCLsym","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"VMS::Filespec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"VMS::Stdio","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","450","0"],"version":"2.45"},{"feature":"Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","540","0"],"version":"0.54"},{"feature":"Win32API::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","120","301"],"version":"0.1203_01"},{"feature":"Win32API::File::inc::ExtUtils::Myconst2perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1"},{"feature":"Win32CORE","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"XS::APItest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","150","0"],"version":"1.15"},{"feature":"XS::Typemap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","180","0"],"version":"0.18"},{"feature":"XSLoader","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","300","0"],"version":"0.30"},{"feature":"_charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"attributes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","330","0"],"version":"0.33"},{"feature":"autodie","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::Guard","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Scope::GuardStack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::exception::system","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::hints","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autodie::skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","320","0"],"version":"2.32"},{"feature":"autouse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","110","0"],"version":"1.11"},{"feature":"base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","270","0"],"version":"2.27"},{"feature":"bigint","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bignum","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"bigrat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","510","0"],"version":"0.51"},{"feature":"blib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"bytes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.07"},{"feature":"charnames","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","480","0"],"version":"1.48"},{"feature":"constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"deprecate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.04"},{"feature":"diagnostics","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","370","0"],"version":"1.37"},{"feature":"encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","0","0"],"version":"3.00"},{"feature":"encoding::warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","130","0"],"version":"0.13"},{"feature":"experimental","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","22","0"],"version":"0.022"},{"feature":"feature","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"fields","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","240","0"],"version":"2.24"},{"feature":"filetest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.03"},{"feature":"if","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","60","900"],"version":"0.0609"},{"feature":"integer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.01"},{"feature":"less","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.03"},{"feature":"lib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","650","0"],"version":"0.65"},{"feature":"locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","100","0"],"version":"1.10"},{"feature":"mro","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","250","0"],"version":"1.25"},{"feature":"ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","183"],"version":"1.302183"},{"feature":"open","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"ops","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.02"},{"feature":"overload","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","330","0"],"version":"1.33"},{"feature":"overloading","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","20","0"],"version":"0.02"},{"feature":"parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","238","0"],"version":"0.238"},{"feature":"perlfaq","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","202","11","70"],"version":"5.20201107"},{"feature":"re","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","410","0"],"version":"0.41"},{"feature":"sigtrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","90","0"],"version":"1.09"},{"feature":"sort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.04"},{"feature":"strict","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","120","0"],"version":"1.12"},{"feature":"subs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"threads","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","260","0"],"version":"2.26"},{"feature":"threads::shared","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","620","0"],"version":"1.62"},{"feature":"utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","240","0"],"version":"1.24"},{"feature":"vars","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.05"},{"feature":"version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","992","800"],"version":"0.9928"},{"feature":"vmsish","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"},{"feature":"warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","500","0"],"version":"1.50"},{"feature":"warnings::register","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","40","0"],"version":"1.04"}],"author_platform_user_id":"fe7c9294-51d6-4df6-a5b5-44cf5a924ebc","comment":"Bump again","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"perl","namespace":"language","version_requirements":[{"comparator":"eq","version":"5.32.1"}]}]},{"alternatives":[],"artifact_id":"f56acc9c-dd02-5cf8-97f9-a5cd015f4c7b","build_scripts":null,"dependencies":[{"dependency_types":["build","runtime","test"],"ingredient_version_id":"86005392-bdbf-59bd-a716-70ce7fcd3a66"},{"dependency_types":["build"],"ingredient_version_id":"c4164b54-9b8f-55fc-ae5a-cd47c6389687"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:21.454Z","ingredient_id":"d7097446-572b-5dd9-a9b8-3a3007254971","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d7097446-572b-5dd9-a9b8-3a3007254971"},"name":"JSON","normalized_name":"JSON","primary_namespace":"language/perl","description":"JSON (JavaScript Object Notation) encoder/decoder"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-05-28T17:12:38.349Z","ingredient_id":"d7097446-572b-5dd9-a9b8-3a3007254971","ingredient_version_id":"9c52ef68-d833-59c7-a537-4d20efd2d728","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d7097446-572b-5dd9-a9b8-3a3007254971/versions/9c52ef68-d833-59c7-a537-4d20efd2d728","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d7097446-572b-5dd9-a9b8-3a3007254971"},"revision":4,"revision_timestamp":"2020-10-28T22:29:07.800Z","copyright_text":"TODO","documentation_uri":"https://metacpan.org/release/Kenichi Ishigaki/JSON-4.02","is_binary_only":false,"license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","release_timestamp":"2019-02-23T10:26:27.000Z","source_uri":"https://cpan.metacpan.org/authors/id/I/IS/ISHIGAKI/JSON-4.02.tar.gz","sortable_version":["4","20","0"],"version":"4.02","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"JSON"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/data-acquisition/444a88755a89ffa2a5424ab4ed1d11dca61808ebef57e81243424619a9e8627c/JSON-4.02.tar.gz","scanner_license_expression":"[\"Artistic-1.0-Perl, GPL-1.0-or-later\"]","source_checksum":"444a88755a89ffa2a5424ab4ed1d11dca61808ebef57e81243424619a9e8627c","status":"stable","provided_features":[{"feature":"JSON","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","20","0"],"version":"4.02"},{"feature":"JSON::Backend::PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","20","0"],"version":"4.02"}],"author_platform_user_id":"bdb16658-8b3a-4061-bae9-67e55b0d8355","comment":"Adding alternative builder dependency if Perl version \u003e= 5.30","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"JSON","namespace":"language/perl","version_requirements":[{"comparator":"eq","version":"4.02"}]}]}],"solver_version":1} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/recipes/perl-recipe.json b/pkg/platform/runtime/testhelper/data/recipes/perl-recipe.json new file mode 100644 index 0000000000..fa3b32b605 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/recipes/perl-recipe.json @@ -0,0 +1 @@ +{"camel_flags":[],"from_recipe_store":true,"image":{"image_id":"0fceabb4-ca86-4846-9b0a-c23947770cdb","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/0fceabb4-ca86-4846-9b0a-c23947770cdb"},"name":"activestate/centos-7.6-build","platform_id":"0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a","type":"Docker","sortable_version":["1","0","4","0"],"version":"1.0.4","provided_features":[{"feature":"perl-build-tools","is_activestate_version":true,"is_default_provider":false,"namespace":"image","sortable_version":["0"],"version":"0"},{"feature":"python-build-tools","is_activestate_version":true,"is_default_provider":false,"namespace":"image","sortable_version":["0"],"version":"0"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"conditions":null,"revision":5,"revision_timestamp":"2020-01-30T20:00:03.523Z"},"is_indemnified":false,"platform":{"cpu_architecture":{"cpu_architecture_id":"4cdba18d-0851-4925-9ae5-9c8a2987828a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/cpu-architectures/4cdba18d-0851-4925-9ae5-9c8a2987828a"},"bit_width":"64","name":"x86","provided_features":[{"feature":"x86 64-bit","is_activestate_version":false,"is_default_provider":true,"namespace":"cpu-architecture","sortable_version":["1"],"version":"1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"cpu_extensions":[],"creation_timestamp":"2019-08-06T21:46:35.288Z","display_name":"CentOS 7.6.1810, Linux 4.15.0, glibc 2.17 x86 64-bit","images":[{"image_id":"0fceabb4-ca86-4846-9b0a-c23947770cdb","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/0fceabb4-ca86-4846-9b0a-c23947770cdb"},"name":"activestate/centos-7.6-build","platform_id":"0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a","type":"Docker","sortable_version":["1","0","4","0"],"version":"1.0.4","provided_features":[{"feature":"perl-build-tools","is_activestate_version":true,"is_default_provider":false,"namespace":"image","sortable_version":["0"],"version":"0"},{"feature":"python-build-tools","is_activestate_version":true,"is_default_provider":false,"namespace":"image","sortable_version":["0"],"version":"0"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"conditions":null,"revision":5,"revision_timestamp":"2020-01-30T20:00:03.523Z"}],"is_user_visible":true,"kernel":{"kernel_id":"ef737274-fff9-4164-b72b-88067613f822","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822"},"name":"Linux"},"kernel_version":{"kernel_version_id":"2450c462-66e0-4aca-97d4-9910a19996f6","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822/versions/2450c462-66e0-4aca-97d4-9910a19996f6"},"sortable_version":["4","15","0"],"version":"4.15.0","provided_features":[{"feature":"Linux","is_activestate_version":false,"is_default_provider":true,"namespace":"kernel","sortable_version":["4","15","0"],"version":"4.15.0"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"libc":{"libc_id":"09a2eb42-ad34-4734-a93e-4b97395577df","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df"},"name":"glibc"},"libc_version":{"libc_version_id":"277c8630-948f-449c-9d69-5cf2ce3eb7eb","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df/versions/277c8630-948f-449c-9d69-5cf2ce3eb7eb"},"sortable_version":["2","17"],"version":"2.17","provided_features":[{"feature":"glibc","is_activestate_version":false,"is_default_provider":true,"namespace":"libc","sortable_version":["2","17"],"version":"2.17"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/platforms/0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a"},"operating_system":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99"},"operating_system_id":"7b3a2dbb-d543-48d6-8390-7e7b63751e99","has_libc":true,"name":"CentOS"},"operating_system_version":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99/versions/2cab2f48-fb0b-415f-85f8-ddd045969662"},"operating_system_version_id":"2cab2f48-fb0b-415f-85f8-ddd045969662","sortable_version":["7","6","1810"],"version":"7.6.1810","provided_features":[{"feature":"CentOS","is_activestate_version":false,"is_default_provider":true,"namespace":"operating-system","sortable_version":["7","6","1810"],"version":"7.6.1810"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"platform_id":"0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a"},"recipe_id":"585b3357-14fa-58a8-96db-4f5aa602113e","recipe_store_timestamp":"2020-04-24T17:24:26.585Z","resolved_ingredients":[{"alternatives":["dd369889-16b0-54cd-afba-d728a046a06d","3e6b87ed-9e26-533b-a52c-a4b8fdf63d9d","4b58addf-2b8d-5aaf-82a8-26e1d3254fbf","5ae75a1f-f8fa-53f1-8ae2-dd8178ed0bfa","daaebcd8-5257-5a09-b465-811933dcbf7f","ab417a2b-817a-5e63-a2e8-37a523583f2d","04036655-15dd-51d1-9960-136c9a6362fb","027dc8d1-a3f3-5a84-9fc4-8427e2f8eb26","4b1d3022-e0e4-5712-8465-f079293a106b","27959e22-7e40-5773-94cb-9cb153634ed5","15d1bc46-a098-5605-9567-9c9c4d90c139","3c7b2306-4e8e-50e1-af45-e6a792c18de2","0a1a89f8-f1cd-539b-9d93-78a397554d55","ee9c369c-7cf8-596a-96e7-34657eecb88c","a83ef247-44b4-5b5e-9aa2-387ce6883473","ffad8bea-1902-5a72-88b4-6f65a534e983","dd9f1135-5d66-535e-9879-c5e6de540ab5","5cdb089d-9a96-5f59-8090-dcf27fc087a3","471f73ed-e484-580f-b193-5a0ab37868f6","f14f6343-d75b-575d-be41-b46c2816bc04","442603f4-4df6-5d00-b48b-64c686b12431","46e20268-dd9e-5846-92c1-0249e4027609","6695f243-5c22-5b89-8998-17f5ad116d43","77031f4b-5c5e-57da-a112-fd3fcdbeaada","762f875a-880c-5de4-9dbe-923c3c7d48b7","ed851561-e424-5568-bf97-1010bf2f6ee8","252eb7bc-e95b-591c-b946-b1de81ca9ad8","b5858882-da48-5a39-b763-cef92950137d","fc2cbe4c-e940-5159-a3aa-be38eca43c7b","1c12af61-fde7-596a-8dc5-ca77866dd9a4","cd6bbe3b-41d9-56c6-85a5-4dd835f0e184","67e717fa-97b9-543c-9edf-b9a92abae7d6"],"artifact_id":"29ee664e-709c-5785-a183-c3cdd0abf65b","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2019-10-21T19:16:38.749Z","ingredient_id":"20816534-c073-5d68-9eb7-11c1d6be09f5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/20816534-c073-5d68-9eb7-11c1d6be09f5"},"name":"camel","normalized_name":"camel","primary_namespace":"builder","description":"The camel unified build system","website":"https://platform.activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-04-15T17:51:24.223Z","ingredient_id":"20816534-c073-5d68-9eb7-11c1d6be09f5","ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/20816534-c073-5d68-9eb7-11c1d6be09f5/versions/49530255-f4fa-5363-a4cc-2eb63cf5d6be","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/20816534-c073-5d68-9eb7-11c1d6be09f5"},"revision":1,"revision_timestamp":"2020-04-15T17:51:24.223Z","copyright_text":"Copyright © ActiveState Inc, 2004-2020","documentation_uri":"https://github.com/ActiveState/camel/tree/2a0758c3955df8e765c03c0f123a98435d611473/docs","is_binary_only":false,"license_expression":"UNLICENSED","release_timestamp":"2020-04-15T17:50:31.254Z","source_uri":"https://github.com/ActiveState/camel/tree/2a0758c3955df8e765c03c0f123a98435d611473","sortable_version":["20200415","135030","779230"],"version":"20200415.135030.2a0758c3","activestate_license_expression":"UNLICENSED","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://INVALID","scanner_license_expression":"UNLICENSED","source_checksum":"2a0758c3955df8e765c03c0f123a98435d611473","provided_features":[{"feature":"camel","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["20200415","135030","779230"],"version":"20200415.135030.2a0758c3"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"a5f0e5a0-133d-53b7-9047-683182945840","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:49:18.182Z","ingredient_id":"327b0673-5f5e-5b26-960d-a6fb18acd1c8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/327b0673-5f5e-5b26-960d-a6fb18acd1c8"},"name":"ActiveState-EULAs","normalized_name":"ActiveState-EULAs","primary_namespace":"internal","description":"ActiveState End-User License Agreements"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:49:18.182Z","ingredient_id":"327b0673-5f5e-5b26-960d-a6fb18acd1c8","ingredient_version_id":"e4d5b18c-89a9-561d-b99d-95bdd924735b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/327b0673-5f5e-5b26-960d-a6fb18acd1c8/versions/e4d5b18c-89a9-561d-b99d-95bdd924735b","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/327b0673-5f5e-5b26-960d-a6fb18acd1c8"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2019-06-05T00:00:00.000Z","source_uri":"https://s3.amazonaws.com/camel-sources/src/EULAs/main.tar.gz","sortable_version":["20170627","0"],"version":"20170627","activestate_license_expression":"unknown","camel_extras":{"does_not_install":"yes","dont_build":["yes"],"ppm_pkg":"no"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/internal/9d5b13269bf9b47c8778435d9c79f3cc8686ff667761c6e334e051a01a33053b/main.tar.gz","scanner_license_expression":"unknown","source_checksum":"9d5b13269bf9b47c8778435d9c79f3cc8686ff667761c6e334e051a01a33053b","provided_features":[{"feature":"ActiveState-EULAs","is_activestate_version":false,"is_default_provider":true,"namespace":"internal","sortable_version":["20170627","0"],"version":"20170627"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"ActiveState-EULAs","namespace":"internal","version_requirements":[{"comparator":"gte","version":"0"}]}]},{"alternatives":[],"artifact_id":"3b2088aa-3a85-5a54-8236-a8e285ec2fca","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:56:32.665Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"name":"perl","normalized_name":"perl","primary_namespace":"language","description":"Practical Extraction and Report Language"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:57:41.140Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206/versions/d94f704f-ab76-5db3-a571-b9a019a1cc2a","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"revision":12,"revision_timestamp":"2019-12-18T22:06:31.939Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"1970-01-01T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/S/SH/SHAY/perl-5.28.1.tar.gz","sortable_version":["5","28","1","0"],"version":"5.28.1","activestate_license_expression":"unknown","camel_extras":{"base64_binaries":["win32/perl.ico"],"cold_storage_dirs":{"src":"__SRC__"},"git_base":"63afdf6c0f65af480aa5bb9ccba9f46dae52f6fc v5.28.1","ppm_pkg":"no"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/languages/3ebf85fe65df2ee165b22596540b7d5d42f84d4b72d84834f74e2e0b8956c347/perl-5.28.1.tar.gz","scanner_license_expression":"unknown","source_checksum":"3ebf85fe65df2ee165b22596540b7d5d42f84d4b72d84834f74e2e0b8956c347","provided_features":[{"feature":"perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","28","1","0"],"version":"5.28.1"},{"feature":"Amiga::ARexx","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","4","0"],"version":"0.4"},{"feature":"Amiga::Exec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","0"],"version":"0.2"},{"feature":"AnyDBM_File::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"App::Cpan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","67","0"],"version":"1.67"},{"feature":"App::Prove","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"App::Prove::State","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"App::Prove::State::Result","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"App::Prove::State::Result::Test","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"Archive::Tar","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.30"},{"feature":"Archive::Tar::Constant","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.30"},{"feature":"Archive::Tar::File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.30"},{"feature":"Attribute::Handlers","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"AutoLoader::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["5","74","0"],"version":"5.74"},{"feature":"AutoSplit::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","6","0"],"version":"1.6"},{"feature":"B::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","74","0"],"version":"1.74"},{"feature":"B::Concise","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"B::Debug","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","26","0"],"version":"1.26"},{"feature":"B::Deparse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","48","0"],"version":"1.48"},{"feature":"B::Op_private","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","28001","0"],"version":"5.28001"},{"feature":"B::Showlex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","5","0"],"version":"1.5"},{"feature":"B::Terse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"B::Xref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"Benchmark::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","22","0"],"version":"1.22"},{"feature":"CPAN::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.20"},{"feature":"CPAN::Author","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","2","0"],"version":"5.50.2"},{"feature":"CPAN::Bundle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","3","0"],"version":"5.50.3"},{"feature":"CPAN::CacheMgr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","2","0"],"version":"5.50.2"},{"feature":"CPAN::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","1","0"],"version":"5.50.1"},{"feature":"CPAN::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","1","0"],"version":"5.50.1"},{"feature":"CPAN::DeferredCode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","0"],"version":"5.50"},{"feature":"CPAN::Distribution","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","19","0"],"version":"2.19"},{"feature":"CPAN::Distroprefs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","1","0"],"version":"6.1"},{"feature":"CPAN::Distrostatus","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::Exception::RecursiveDependency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","1","0"],"version":"5.50.1"},{"feature":"CPAN::Exception::blocked_urllist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"CPAN::Exception::yaml_not_installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::Exception::yaml_process_error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","11","0"],"version":"5.50.11"},{"feature":"CPAN::FTP::netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"CPAN::FirstTime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","53","11","0"],"version":"5.53.11"},{"feature":"CPAN::HTTP::Client","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","96","1","0"],"version":"1.96.1"},{"feature":"CPAN::HTTP::Credentials","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","96","1","0"],"version":"1.96.1"},{"feature":"CPAN::HandleConfig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","8","0"],"version":"5.50.8"},{"feature":"CPAN::Index","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","12","0"],"version":"2.12"},{"feature":"CPAN::InfoObj","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::Kwalify","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["5","50","0"],"version":"5.50"},{"feature":"CPAN::LWP::UserAgent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","96","1","0"],"version":"1.96.1"},{"feature":"CPAN::Meta","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Converter","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Feature","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::History","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Merge","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Prereqs","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Requirements","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","140","0"],"version":"2.140"},{"feature":"CPAN::Meta::Spec","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Validator","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::YAML","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","18","0"],"version":"0.18"},{"feature":"CPAN::Mirrors","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","12","0"],"version":"2.12"},{"feature":"CPAN::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","3","0"],"version":"5.50.3"},{"feature":"CPAN::Nox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","1","0"],"version":"5.50.1"},{"feature":"CPAN::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","96","0"],"version":"0.96"},{"feature":"CPAN::Plugin::Specfile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","1","0"],"version":"0.1"},{"feature":"CPAN::Prompt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","2","0"],"version":"5.50.2"},{"feature":"CPAN::Shell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","7","0"],"version":"5.50.7"},{"feature":"CPAN::Tarzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","12","0"],"version":"5.50.12"},{"feature":"CPAN::URL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","3","0"],"version":"5.50.3"},{"feature":"Carp::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.50"},{"feature":"Class::Struct","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","65","0"],"version":"0.65"},{"feature":"Compress::Raw::Bzip2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"Compress::Raw::Zlib","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","76","0"],"version":"2.76"},{"feature":"Compress::Zlib","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"Config::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0"],"version":"1"},{"feature":"Config::Extensions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","0"],"version":"0.2"},{"feature":"Config::Perl::V","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","29","0"],"version":"0.29"},{"feature":"Cwd::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"DB::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"DBM_Filter::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","6","0"],"version":"0.6"},{"feature":"DBM_Filter::compress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"DBM_Filter::encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"DBM_Filter::int32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"DBM_Filter::null","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"DBM_Filter::utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"DB_File::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","840","0"],"version":"1.840"},{"feature":"Data::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","170","0"],"version":"2.170"},{"feature":"Demo::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Descriptions::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Devel::PPPort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","40","0"],"version":"3.40"},{"feature":"Devel::Peek","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","27","0"],"version":"1.27"},{"feature":"Devel::SelfStubber","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","6","0"],"version":"1.6"},{"feature":"Digest::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","17","1","0"],"version":"1.17.1"},{"feature":"Digest::MD5","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","55","0"],"version":"2.55"},{"feature":"Digest::SHA","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["6","1","0"],"version":"6.1"},{"feature":"Digest::base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","16","0"],"version":"1.16"},{"feature":"Digest::file","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","16","0"],"version":"1.16"},{"feature":"DirHandle::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","5","0"],"version":"1.5"},{"feature":"Dumpvalue::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","18","0"],"version":"1.18"},{"feature":"DynaLoader::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","45","0"],"version":"1.45"},{"feature":"Encode::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","97","0"],"version":"2.97"},{"feature":"Encode::Alias","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","24","0"],"version":"2.24"},{"feature":"Encode::Byte","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","4","0"],"version":"2.4"},{"feature":"Encode::CJKConstants","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","2","0"],"version":"2.2"},{"feature":"Encode::CN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Encode::CN::HZ","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","10","0"],"version":"2.10"},{"feature":"Encode::Config","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","5","0"],"version":"2.5"},{"feature":"Encode::EBCDIC","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","2","0"],"version":"2.2"},{"feature":"Encode::Encoder","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Encode::Encoding","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","8","0"],"version":"2.8"},{"feature":"Encode::GSM0338","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"Encode::Guess","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"Encode::JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","4","0"],"version":"2.4"},{"feature":"Encode::JP::H2Z","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","2","0"],"version":"2.2"},{"feature":"Encode::JP::JIS7","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","8","0"],"version":"2.8"},{"feature":"Encode::KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Encode::KR::2022_KR","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","4","0"],"version":"2.4"},{"feature":"Encode::MIME::Header","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","28","0"],"version":"2.28"},{"feature":"Encode::MIME::Header::ISO_2022_JP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","9","0"],"version":"1.9"},{"feature":"Encode::MIME::Name","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Encode::Symbol","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","2","0"],"version":"2.2"},{"feature":"Encode::TW","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Encode::Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","17","0"],"version":"2.17"},{"feature":"Encode::Unicode::UTF7","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","10","0"],"version":"2.10"},{"feature":"English::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.10"},{"feature":"Env::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"Errno::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0"],"version":"1"},{"feature":"Exporter::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["5","73","0"],"version":"5.73"},{"feature":"ExtUtils::CBuilder","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Unix","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::VMS","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::BCC","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::GCC","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::MSVC","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::aix","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::android","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::cygwin","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::darwin","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::dec_osf","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::os2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Command::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","25","0"],"version":"0.25"},{"feature":"ExtUtils::Constant::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","6","0"],"version":"0.6"},{"feature":"ExtUtils::Constant::ProxySubs","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","9","0"],"version":"0.9"},{"feature":"ExtUtils::Constant::Utils","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","4","0"],"version":"0.4"},{"feature":"ExtUtils::Constant::XS","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"ExtUtils::Embed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","35","1","0"],"version":"1.35.1"},{"feature":"ExtUtils::Install","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils::Installed","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils::Liblist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Liblist::Kid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_AIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Any","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_BeOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_DOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_NW5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_UWIN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Win95","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MakeMaker::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MakeMaker::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MakeMaker::version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MakeMaker::version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Manifest","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.70"},{"feature":"ExtUtils::Miniperl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"ExtUtils::Mkbootstrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Mksymlists","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Packlist","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils::ParseXS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","39","0"],"version":"3.39"},{"feature":"ExtUtils::ParseXS::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","39","0"],"version":"3.39"},{"feature":"ExtUtils::ParseXS::CountLines","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","39","0"],"version":"3.39"},{"feature":"ExtUtils::ParseXS::Eval","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","39","0"],"version":"3.39"},{"feature":"ExtUtils::ParseXS::Utilities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","39","0"],"version":"3.39"},{"feature":"ExtUtils::Typemaps","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","38","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","38","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::InputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","38","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::OutputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","38","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Type","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","38","0"],"version":"3.38"},{"feature":"ExtUtils::XSSymSet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"ExtUtils::testlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"Fatal::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"Fcntl::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","13","0"],"version":"1.13"},{"feature":"File::Basename","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","85","0"],"version":"2.85"},{"feature":"File::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","6","0"],"version":"1.10.6"},{"feature":"File::Copy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","33","0"],"version":"2.33"},{"feature":"File::DosGlob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","12","0"],"version":"1.12"},{"feature":"File::Fetch","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","56","0"],"version":"0.56"},{"feature":"File::Find","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","34","0"],"version":"1.34"},{"feature":"File::Glob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","31","0"],"version":"1.31"},{"feature":"File::GlobMapper","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"File::Path","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0"],"version":"2.15"},{"feature":"File::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::AmigaOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Epoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Temp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","23","4","0"],"version":"0.23.4"},{"feature":"File::stat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"FileCache::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.10"},{"feature":"FileHandle::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Filter::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","95","0"],"version":"0.95"},{"feature":"Filter::Util::Call","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","58","0"],"version":"1.58"},{"feature":"FindBin::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","51","0"],"version":"1.51"},{"feature":"GDBM_File::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","17","0"],"version":"1.17"},{"feature":"Getopt::Long","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.50"},{"feature":"Getopt::Std","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","12","0"],"version":"1.12"},{"feature":"HTTP::Tiny","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","70","0"],"version":"0.70"},{"feature":"Hash::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","22","0"],"version":"0.22"},{"feature":"Hash::Util::FieldHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.20"},{"feature":"I18N::Collate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"I18N::LangTags","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","43","0"],"version":"0.43"},{"feature":"I18N::LangTags::Detect","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"I18N::LangTags::List","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.40"},{"feature":"I18N::Langinfo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","17","0"],"version":"0.17"},{"feature":"IO::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Compress::Adapter::Bzip2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Adapter::Deflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Adapter::Identity","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Base::Common","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Bzip2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Deflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Gzip","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Gzip::Constants","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::RawDeflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Zip","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Zip::Constants","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Zlib::Constants","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Zlib::Extra","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Dir","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Handle","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Pipe","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Poll","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Seekable","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Select","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Socket","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Socket::INET","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Socket::IP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","39","0"],"version":"0.39"},{"feature":"IO::Socket::UNIX","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Uncompress::Adapter::Bunzip2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Adapter::Identity","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Adapter::Inflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::AnyInflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::AnyUncompress","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Bunzip2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Gunzip","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Inflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::RawInflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Unzip","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Zlib","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.10"},{"feature":"IPC::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"IPC::Msg","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"IPC::Open2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"IPC::Open3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.20"},{"feature":"IPC::Semaphore","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"IPC::SharedMem","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"IPC::SysV","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"JSON::PP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","97","1","0"],"version":"2.97.1"},{"feature":"JSON::PP::Boolean","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","97001","0"],"version":"2.97001"},{"feature":"List::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.50"},{"feature":"List::Util::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.50"},{"feature":"Locale::Codes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::Country","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::Currency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::LangExt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::LangFam","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::LangVar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::Language","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::Script","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Country","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Currency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Language","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Maketext","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","29","0"],"version":"1.29"},{"feature":"Locale::Maketext::Guts","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.20"},{"feature":"Locale::Maketext::GutsLoader","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.20"},{"feature":"Locale::Maketext::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","21","1","0"],"version":"0.21.1"},{"feature":"Locale::Script","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"MIME::Base64","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","15","0"],"version":"3.15"},{"feature":"MIME::QuotedPrint","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","13","0"],"version":"3.13"},{"feature":"Math::BigFloat","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","99","98","11","0"],"version":"1.99.98.11"},{"feature":"Math::BigFloat::Trace","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","49","0"],"version":"0.49"},{"feature":"Math::BigInt","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","99","98","11","0"],"version":"1.99.98.11"},{"feature":"Math::BigInt::Calc","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","99","98","11","0"],"version":"1.99.98.11"},{"feature":"Math::BigInt::CalcEmu","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","99","98","11","0"],"version":"1.99.98.11"},{"feature":"Math::BigInt::FastCalc","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","50","6","0"],"version":"0.50.6"},{"feature":"Math::BigInt::Lib","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","99","98","11","0"],"version":"1.99.98.11"},{"feature":"Math::BigInt::Trace","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","49","0"],"version":"0.49"},{"feature":"Math::BigRat","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","26","13","0"],"version":"0.26.13"},{"feature":"Math::Complex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","59","1","0"],"version":"1.59.1"},{"feature":"Math::Trig","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","23","0"],"version":"1.23"},{"feature":"Memoize::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","1","0"],"version":"1.3.1"},{"feature":"Memoize::AnyDBM_File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::Expire","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::ExpireFile","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::ExpireTest","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::NDBM_File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::SDBM_File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::Storable","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Module::CoreList","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","20181129","28","0"],"version":"5.20181129.28"},{"feature":"Module::CoreList::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","20181129","28","0"],"version":"5.20181129.28"},{"feature":"Module::Load","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","32","0"],"version":"0.32"},{"feature":"Module::Load::Conditional","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","68","0"],"version":"0.68"},{"feature":"Module::Loaded","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","8","0"],"version":"0.8"},{"feature":"Module::Metadata","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","33","0"],"version":"1.33"},{"feature":"MyClass::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"NDBM_File::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","14","0"],"version":"1.14"},{"feature":"NEXT::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","67","1","0"],"version":"0.67.1"},{"feature":"Net::Cmd","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::Config","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::Domain","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP::A","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP::E","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP::I","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP::L","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP::dataconn","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::NNTP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::Netrc","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::POP3","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::Ping","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","62","0"],"version":"2.62"},{"feature":"Net::SMTP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::Time","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::hostent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"Net::netent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"Net::protoent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"Net::servent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"O::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"ODBM_File::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","15","0"],"version":"1.15"},{"feature":"Opcode::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","43","0"],"version":"1.43"},{"feature":"POSIX::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","84","0"],"version":"1.84"},{"feature":"Params::Check","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","38","0"],"version":"0.38"},{"feature":"Parse::CPAN::Meta","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"Perl::OSType","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.10"},{"feature":"PerlIO::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.10"},{"feature":"PerlIO::encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","26","0"],"version":"0.26"},{"feature":"PerlIO::mmap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","16","0"],"version":"0.16"},{"feature":"PerlIO::scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","29","0"],"version":"0.29"},{"feature":"PerlIO::via","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","17","0"],"version":"0.17"},{"feature":"PerlIO::via::QuotedPrint","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","8","0"],"version":"0.8"},{"feature":"Pod::Checker","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"Pod::Escapes","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"Pod::Find","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","63","0"],"version":"1.63"},{"feature":"Pod::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","13","0"],"version":"1.13"},{"feature":"Pod::Html","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","24","0"],"version":"1.24"},{"feature":"Pod::InputObjects","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","63","0"],"version":"1.63"},{"feature":"Pod::Man","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::ParseLink","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::ParseUtils","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","63","0"],"version":"1.63"},{"feature":"Pod::Parser","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","63","0"],"version":"1.63"},{"feature":"Pod::Perldoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","28","1","0"],"version":"3.28.1"},{"feature":"Pod::Perldoc::BaseTo","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::GetOptsOO","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToANSI","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToChecker","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToMan","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToNroff","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToPod","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToRtf","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTerm","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToText","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTk","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToXml","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::PlainText","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"Pod::Select","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","63","0"],"version":"1.63"},{"feature":"Pod::Simple","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::BlackBox","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Checker","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Debug","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::DumpAsText","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::DumpAsXML","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::HTML","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::HTMLBatch","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::HTMLLegacy","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["5","1","0"],"version":"5.1"},{"feature":"Pod::Simple::LinkSection","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Methody","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Progress","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::PullParser","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::PullParserEndToken","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::PullParserStartToken","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::PullParserTextToken","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::PullParserToken","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::RTF","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Search","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::SimpleTree","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Text","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::TextContent","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::TiedOutFH","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Transcode","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::TranscodeDumb","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::TranscodeSmart","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::XHTML","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::XMLOutStream","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Text","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::Text::Color","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::Text::Overstrike","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::Text::Termcap","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::Usage","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","69","0"],"version":"1.69"},{"feature":"SDBM_File::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","14","0"],"version":"1.14"},{"feature":"Safe::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.40"},{"feature":"Scalar::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.50"},{"feature":"Search::Dict","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"SelectSaver::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"SelfLoader::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Socket::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","27","0"],"version":"2.27"},{"feature":"Storable::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","8","0"],"version":"3.8"},{"feature":"Sub::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.50"},{"feature":"Symbol::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"Sys::Hostname","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","22","1","0"],"version":"1.22.1"},{"feature":"Sys::Syslog","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","35","0"],"version":"0.35"},{"feature":"TAP::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Color","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Console","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Console::ParallelSession","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Console::Session","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::File::Session","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Session","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Harness","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Harness::Env","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Object","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Aggregator","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Grammar","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Iterator","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Iterator::Array","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Iterator::Process","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Iterator::Stream","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::IteratorFactory","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Multiplexer","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Bailout","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Comment","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Plan","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Pragma","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Test","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Unknown","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Version","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::YAML","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::ResultFactory","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Scheduler","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Scheduler::Job","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Scheduler::Spinner","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Source","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler::Executable","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler::File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler::Handle","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler::Perl","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler::RawTAP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::YAMLish::Reader","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::YAMLish::Writer","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"Term::ANSIColor","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","6","0"],"version":"4.6"},{"feature":"Term::Cap","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","17","0"],"version":"1.17"},{"feature":"Term::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","403","0"],"version":"1.403"},{"feature":"Term::ReadLine","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","17","0"],"version":"1.17"},{"feature":"Test2::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::API::Breakage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::API::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::API::Instance","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::API::Stack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Bail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Diag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Fail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Note","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Pass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::TAP::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::V2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Waiting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::About","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Amnesty","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Assert","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Control","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Render","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Formatter::TAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Hub::Interceptor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Hub::Interceptor::Terminator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Hub::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::IPC::Driver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::IPC::Driver::Files","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Tools::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Util::ExternalMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Util::Facets2Legacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Util::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","31","0"],"version":"1.31"},{"feature":"Test::Builder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Builder::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Builder::IO::Scalar","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","114","0"],"version":"2.114"},{"feature":"Test::Builder::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Builder::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Builder::Tester::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Builder::TodoDiag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Harness","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"Test::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Tester::Capture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Tester::CaptureRunner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Tester::Delegate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::use::ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Text::Abbrev","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"Text::Balanced","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Text::ParseWords","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","30","0"],"version":"3.30"},{"feature":"Text::Tabs","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2013","523","0"],"version":"2013.523"},{"feature":"Text::Wrap","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2013","523","0"],"version":"2013.523"},{"feature":"Thread::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","4","0"],"version":"3.4"},{"feature":"Thread::Queue","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","12","0"],"version":"3.12"},{"feature":"Thread::Semaphore","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","13","0"],"version":"2.13"},{"feature":"Tie::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"Tie::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"Tie::Handle","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","2","0"],"version":"4.2"},{"feature":"Tie::Hash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","5","0"],"version":"1.5"},{"feature":"Tie::Hash::NamedCapture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10","0"],"version":"0.10"},{"feature":"Tie::Memoize","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"Tie::RefHash","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"Tie::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"Tie::StdHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","5","0"],"version":"4.5"},{"feature":"Tie::SubstrHash","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Time::HiRes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","97","59","0"],"version":"1.97.59"},{"feature":"Time::Local","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Time::Piece","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","32","4","0"],"version":"1.32.4"},{"feature":"Time::Seconds","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","32","4","0"],"version":"1.32.4"},{"feature":"Time::gmtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"Time::localtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Time::tm","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"UNIVERSAL::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","13","0"],"version":"1.13"},{"feature":"Unicode::Collate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::Big5","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::GB2312","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::JISX0208","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::Korean","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::Pinyin","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::Stroke","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::Zhuyin","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::Locale","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Normalize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","26","0"],"version":"1.26"},{"feature":"Unicode::UCD","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","70","0"],"version":"0.70"},{"feature":"User::grent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"User::pwent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"VMS::DCLsym","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","9","0"],"version":"1.9"},{"feature":"VMS::Filespec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","12","0"],"version":"1.12"},{"feature":"VMS::Stdio","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","44","0"],"version":"2.44"},{"feature":"Win32::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","52","0"],"version":"0.52"},{"feature":"Win32API::File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","12","3","0"],"version":"0.12.3"},{"feature":"Win32CORE::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","4","0"],"version":"0.4"},{"feature":"XS::APItest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","98","0"],"version":"0.98"},{"feature":"XS::Typemap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","16","0"],"version":"0.16"},{"feature":"XSLoader::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.30"},{"feature":"_charnames::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","45","0"],"version":"1.45"},{"feature":"arybase::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.15"},{"feature":"attributes::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","33","0"],"version":"0.33"},{"feature":"autodie::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autodie::Scope::Guard","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autodie::Scope::GuardStack","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autodie::Util","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autodie::exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","29002","0"],"version":"2.29002"},{"feature":"autodie::exception::system","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autodie::hints","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","29001","0"],"version":"2.29001"},{"feature":"autodie::skip","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autouse::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","11","0"],"version":"1.11"},{"feature":"base::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","27","0"],"version":"2.27"},{"feature":"bigint::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","49","0"],"version":"0.49"},{"feature":"bignum::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","49","0"],"version":"0.49"},{"feature":"bigrat::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","49","0"],"version":"0.49"},{"feature":"blib::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"bytes::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","6","0"],"version":"1.6"},{"feature":"charnames::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","45","0"],"version":"1.45"},{"feature":"constant::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","33","0"],"version":"1.33"},{"feature":"deprecate::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"diagnostics::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","36","0"],"version":"1.36"},{"feature":"encoding::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","22","0"],"version":"2.22"},{"feature":"encoding::warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","13","0"],"version":"0.13"},{"feature":"experimental::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","19","0"],"version":"0.19"},{"feature":"feature::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","52","0"],"version":"1.52"},{"feature":"fields::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","24","0"],"version":"2.24"},{"feature":"filetest::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"if::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","608","0"],"version":"0.608"},{"feature":"integer::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"less::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"lib::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","64","0"],"version":"0.64"},{"feature":"locale::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","9","0"],"version":"1.9"},{"feature":"mro::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","22","0"],"version":"1.22"},{"feature":"ok::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"open::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","11","0"],"version":"1.11"},{"feature":"ops::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"overload::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.30"},{"feature":"overloading::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","0"],"version":"0.2"},{"feature":"parent::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","236","0"],"version":"0.236"},{"feature":"perlfaq::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["5","21011","0"],"version":"5.21011"},{"feature":"re::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","36","0"],"version":"0.36"},{"feature":"sigtrap::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"sort::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","4","0"],"version":"2.4"},{"feature":"strict::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","11","0"],"version":"1.11"},{"feature":"subs::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"threads::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","22","0"],"version":"2.22"},{"feature":"threads::shared","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","58","0"],"version":"1.58"},{"feature":"utf8::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","21","0"],"version":"1.21"},{"feature":"vars::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"version::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","99","23","0"],"version":"0.99.23"},{"feature":"version::regex","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","99","23","0"],"version":"0.99.23"},{"feature":"vmsish::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"warnings::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","42","0"],"version":"1.42"},{"feature":"warnings::register","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-12-18T22:06:26.788Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/cb5b6720-82e5-4546-a99a-9d39332c51af"},"patch_id":"cb5b6720-82e5-4546-a99a-9d39332c51af","conditions":null,"content":"s3://platform-sources/patches/d251ddaed91891b7b619b5d89d1bac3cb55b59bb1cda04791cc0da2cfec7c212.patch","description":"ActivePerl ~ ActivePerl 5.28 patch","sequence_number":1}],"resolved_requirements":[{"feature":"perl","namespace":"language","version_requirements":[{"comparator":"eq","version":"5.28.1"}]}]},{"alternatives":[],"artifact_id":"acb500a5-af3d-553c-bf07-4fde842cc44e","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:49:19.077Z","ingredient_id":"4c46f01f-87de-5ae2-bb45-58201d461e51","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c46f01f-87de-5ae2-bb45-58201d461e51"},"name":"ActiveState-RelocateTree","normalized_name":"ActiveState-RelocateTree","primary_namespace":"language/perl","description":"Move perl distribution to new location"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:49:19.077Z","ingredient_id":"4c46f01f-87de-5ae2-bb45-58201d461e51","ingredient_version_id":"d8b90b31-e26a-5e2f-81c7-1225e8a0a8f2","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c46f01f-87de-5ae2-bb45-58201d461e51/versions/d8b90b31-e26a-5e2f-81c7-1225e8a0a8f2","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c46f01f-87de-5ae2-bb45-58201d461e51"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2009-05-06T17:15:51.000Z","source_uri":"https://s3.amazonaws.com/camel-sources/src/as-mod/ActiveState-RelocateTree/main.tar.gz","sortable_version":["1","4","0"],"version":"1.4","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"ActiveState/RelocateTree"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/ab994200dced4d26e41332754e863a902a8689753622229d73bf4b9b42eef1dd/main.tar.gz","scanner_license_expression":"unknown","source_checksum":"ab994200dced4d26e41332754e863a902a8689753622229d73bf4b9b42eef1dd","provided_features":[{"feature":"ActiveState-RelocateTree","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"ActiveState-RelocateTree","namespace":"language/perl","version_requirements":[{"comparator":"gte","version":"0"}]}]},{"alternatives":[],"artifact_id":"ef438bc7-bf38-5537-85f3-9ff07e715128","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"06d43cc3-8f67-575b-b34d-0ec60e9ae67e"},{"dependency_types":["build"],"ingredient_version_id":"1a882ae6-d86f-5431-a5cb-8caa0abeedf5"},{"dependency_types":["build"],"ingredient_version_id":"1cb4ca5e-4e4e-59fb-b2cb-5fdb54856ff0"},{"dependency_types":["build"],"ingredient_version_id":"3e08c8d3-fe88-5c33-82df-ded1e3d15a0b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"5b9149e8-2334-5454-a523-cd9787003344"},{"dependency_types":["build","runtime"],"ingredient_version_id":"84a01b55-1d92-53ae-a7cb-d591b7b54724"},{"dependency_types":["build"],"ingredient_version_id":"91cd893b-5b8c-5391-9c77-643fb85af0af"},{"dependency_types":["build"],"ingredient_version_id":"e4b6a074-ad51-5b69-95ce-7747c95471f8"},{"dependency_types":["runtime"],"ingredient_version_id":"f53173d3-f084-5b6f-927e-6db8c13aac9c"}],"ingredient":{"creation_timestamp":"2019-10-01T16:49:20.357Z","ingredient_id":"70829de1-9690-5b85-8d6f-1c5746a362e7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/70829de1-9690-5b85-8d6f-1c5746a362e7"},"name":"ActiveState-Test","normalized_name":"ActiveState-Test","primary_namespace":"language/perl","description":"ActiveState's Test modules"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:49:20.357Z","ingredient_id":"70829de1-9690-5b85-8d6f-1c5746a362e7","ingredient_version_id":"cf00c298-f30f-5900-8c36-6e9041654afc","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/70829de1-9690-5b85-8d6f-1c5746a362e7/versions/cf00c298-f30f-5900-8c36-6e9041654afc","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/70829de1-9690-5b85-8d6f-1c5746a362e7"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2013-04-28T14:16:37.000Z","source_uri":"https://s3.amazonaws.com/camel-sources/src/as-mod/ActiveState-Test/main.tar.gz","sortable_version":["1","0","0"],"version":"1.0","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"ActiveState/Test"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/565a38e09a10f3ae09afafaf29c01d60620c31c31b936d219e61c78c7aecbc57/main.tar.gz","scanner_license_expression":"unknown","source_checksum":"565a38e09a10f3ae09afafaf29c01d60620c31c31b936d219e61c78c7aecbc57","provided_features":[{"feature":"ActiveState-Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"ActiveState::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"ActiveState::Test::DBI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","1","0"],"version":"0.1"},{"feature":"ActiveState::Test::X11Server","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","1","0"],"version":"0.1"},{"feature":"ActiveState::Test::X11Server::Impl::Managed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","1","0"],"version":"0.1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"ActiveState-Test","namespace":"language/perl","version_requirements":[{"comparator":"gte","version":"0"}]}]},{"alternatives":[],"artifact_id":"84a58839-2df8-5e4d-ab88-f44c991e2539","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"a873d528-56e8-5c19-b5cb-383be3bb9074"},{"dependency_types":["build"],"ingredient_version_id":"cf00c298-f30f-5900-8c36-6e9041654afc"},{"dependency_types":["runtime"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"},{"dependency_types":["build","runtime"],"ingredient_version_id":"f53173d3-f084-5b6f-927e-6db8c13aac9c"}],"ingredient":{"creation_timestamp":"2019-10-01T16:50:32.819Z","ingredient_id":"a65130b8-7a66-5e74-aaad-ed3b2ce8f039","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a65130b8-7a66-5e74-aaad-ed3b2ce8f039"},"name":"DBD-Pg","normalized_name":"DBD-Pg","primary_namespace":"language/perl","description":"DBI PostgreSQL interface"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:50:32.819Z","ingredient_id":"a65130b8-7a66-5e74-aaad-ed3b2ce8f039","ingredient_version_id":"6e9c11f1-db6a-536e-b607-0e1aa95dceb0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a65130b8-7a66-5e74-aaad-ed3b2ce8f039/versions/6e9c11f1-db6a-536e-b607-0e1aa95dceb0","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a65130b8-7a66-5e74-aaad-ed3b2ce8f039"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-Perl OR GPL-1.0-or-later","release_timestamp":"2017-09-24T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-3.7.0.tar.gz","sortable_version":["3","7","0","0"],"version":"3.7.0","activestate_license_expression":"unknown","camel_extras":{"dont_build":["hpux","solaris"],"mm_fullext":"DBD/Pg"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/e36e0459c9cf0f12edafb74f4cef685876d0460dbe6b411e7109070c67e56459/DBD-Pg-3.7.0.tar.gz","scanner_license_expression":"unknown","source_checksum":"e36e0459c9cf0f12edafb74f4cef685876d0460dbe6b411e7109070c67e56459","provided_features":[{"feature":"Bundle::DBD::Pg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","7","0","0"],"version":"3.7.0"},{"feature":"DBD-Pg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","7","0","0"],"version":"3.7.0"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-10-01T16:50:30.233Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/5973ce13-45fb-4d96-a936-99de317bac86"},"patch_id":"5973ce13-45fb-4d96-a936-99de317bac86","conditions":null,"content":"DBD-Pg/3.7.0/0001-Add-a-very-simple-test-of-SSL-connections.patch","description":"[PATCH 1/7] Add a very simple test of SSL connections","sequence_number":1},{"creation_timestamp":"2019-10-01T16:50:30.584Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/37b9955e-9cce-444d-a218-84ea8a474254"},"patch_id":"37b9955e-9cce-444d-a218-84ea8a474254","conditions":null,"content":"DBD-Pg/3.7.0/0002-Add-an-AS-MAKEFILE.PL.patch","description":"[PATCH 2/7] Add an AS-MAKEFILE.PL\n\nThis file figures out what Pg server to connect to. It also sets the\nPOSTGRES_LIB env var to something that works for our build systems.","sequence_number":2},{"creation_timestamp":"2019-10-01T16:50:30.944Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/25720922-dcda-469d-a201-f9febb40e036"},"patch_id":"25720922-dcda-469d-a201-f9febb40e036","conditions":null,"content":"DBD-Pg/3.7.0/0003-Speed-up-test-which-runs-16k-SQL-statements.patch","description":"[PATCH 3/7] Speed up test which runs 16k SQL statements","sequence_number":3},{"creation_timestamp":"2019-10-01T16:50:31.306Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/ae975b82-2282-41b2-9551-5e87f9377604"},"patch_id":"ae975b82-2282-41b2-9551-5e87f9377604","conditions":null,"content":"DBD-Pg/3.7.0/0004-Don-t-quote-POSTGRES_LIB-on-Win32-and-skip-EXTRALIBS.patch","description":"[PATCH 4/7] Don't quote POSTGRES_LIB on Win32 and skip EXTRALIBS\n check","sequence_number":4},{"creation_timestamp":"2019-10-01T16:50:31.667Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/e5b252f2-0818-4397-bddb-20ea3707fb7b"},"patch_id":"e5b252f2-0818-4397-bddb-20ea3707fb7b","conditions":null,"content":"DBD-Pg/3.7.0/0005-Skip-alarm-using-test-on-Windows.patch","description":"[PATCH 5/7] Skip alarm-using test on Windows","sequence_number":5},{"creation_timestamp":"2019-10-01T16:50:32.023Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/0072ac8b-0163-47dd-9df7-ef9dee883b6f"},"patch_id":"0072ac8b-0163-47dd-9df7-ef9dee883b6f","conditions":null,"content":"DBD-Pg/3.7.0/0006-Skip-tests-for-lost-network-connections-that-fail-on.patch","description":"[PATCH 6/7] Skip tests for lost network connections that fail on\n Win32","sequence_number":6},{"creation_timestamp":"2019-10-01T16:50:32.384Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/cf9ab8f0-66cf-4d91-b1eb-7e993961bf92"},"patch_id":"cf9ab8f0-66cf-4d91-b1eb-7e993961bf92","conditions":null,"content":"DBD-Pg/3.7.0/0007-Rollup-patches-only-set-up-test-env-if-we-are-runnin.patch","description":"[PATCH 7/7] Rollup patches, only set up test env if we are running\n tests","sequence_number":7}],"resolved_requirements":[{"feature":"DBD-Pg","namespace":"language/perl","version_requirements":[{"comparator":"eq","version":"3.7.0"}]}]},{"alternatives":["23d7bf13-cc36-57ae-8c6a-779f7db8f7db"],"artifact_id":"4ed1a6b5-2310-5da2-9342-2b99c8ad2651","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:50:47.461Z","ingredient_id":"15f71af1-b236-5bdf-aa8a-057151757c0e","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15f71af1-b236-5bdf-aa8a-057151757c0e"},"name":"DBI","normalized_name":"DBI","primary_namespace":"language/perl","description":"Database independent interface for Perl"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:50:48.296Z","ingredient_id":"15f71af1-b236-5bdf-aa8a-057151757c0e","ingredient_version_id":"f53173d3-f084-5b6f-927e-6db8c13aac9c","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15f71af1-b236-5bdf-aa8a-057151757c0e/versions/f53173d3-f084-5b6f-927e-6db8c13aac9c","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15f71af1-b236-5bdf-aa8a-057151757c0e"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2018-10-29T00:00:00.000Z","source_uri":"https://cpan.metacpan.org/authors/id/T/TI/TIMB/DBI-1.642.tar.gz","sortable_version":["1","642","0"],"version":"1.642","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"DBI"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/3f2025023a56286cebd15cb495e36ccd9b456c3cc229bf2ce1f69e9ebfc27f5d/DBI-1.642.tar.gz","scanner_license_expression":"unknown","source_checksum":"3f2025023a56286cebd15cb495e36ccd9b456c3cc229bf2ce1f69e9ebfc27f5d","provided_features":[{"feature":"Bundle::DBI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["12","8696","0"],"version":"12.8696"},{"feature":"DBD::DBM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","8","0"],"version":"0.8"},{"feature":"DBD::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","44","0"],"version":"0.44"},{"feature":"DBD::Gofer::Policy::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Policy::classic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Policy::pedantic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Policy::rush","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Transport::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","14121","0"],"version":"0.14121"},{"feature":"DBD::Gofer::Transport::null","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Transport::pipeone","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Transport::stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","14599","0"],"version":"0.14599"},{"feature":"DBD::Mem","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","1","0"],"version":"0.1"},{"feature":"DBD::Proxy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2004","0"],"version":"0.2004"},{"feature":"DBI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","642","0"],"version":"1.642"},{"feature":"DBI::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","642","0"],"version":"1.642"},{"feature":"DBI::Const::GetInfo::ANSI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","8697","0"],"version":"2.8697"},{"feature":"DBI::Const::GetInfo::ODBC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","11374","0"],"version":"2.11374"},{"feature":"DBI::Const::GetInfoReturn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","8697","0"],"version":"2.8697"},{"feature":"DBI::Const::GetInfoType","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","8697","0"],"version":"2.8697"},{"feature":"DBI::DBD","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["12","15129","0"],"version":"12.15129"},{"feature":"DBI::DBD::Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14214","0"],"version":"2.14214"},{"feature":"DBI::DBD::SqlEngine","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","6","0"],"version":"0.6"},{"feature":"DBI::Gofer::Execute","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","14283","0"],"version":"0.14283"},{"feature":"DBI::Gofer::Request","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","12537","0"],"version":"0.12537"},{"feature":"DBI::Gofer::Response","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","11566","0"],"version":"0.11566"},{"feature":"DBI::Gofer::Serializer::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","9950","0"],"version":"0.9950"},{"feature":"DBI::Gofer::Serializer::DataDumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","9950","0"],"version":"0.9950"},{"feature":"DBI::Gofer::Serializer::Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15586","0"],"version":"0.15586"},{"feature":"DBI::Gofer::Transport::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","12537","0"],"version":"0.12537"},{"feature":"DBI::Gofer::Transport::pipeone","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","12537","0"],"version":"0.12537"},{"feature":"DBI::Gofer::Transport::stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","12537","0"],"version":"0.12537"},{"feature":"DBI::Profile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","15065","0"],"version":"2.15065"},{"feature":"DBI::ProfileData","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","10008","0"],"version":"2.10008"},{"feature":"DBI::ProfileDumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","15325","0"],"version":"2.15325"},{"feature":"DBI::ProfileDumper::Apache","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14121","0"],"version":"2.14121"},{"feature":"DBI::ProfileSubs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","9396","0"],"version":"0.9396"},{"feature":"DBI::ProxyServer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3005","0"],"version":"0.3005"},{"feature":"DBI::PurePerl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14286","0"],"version":"2.14286"},{"feature":"DBI::SQL::Nano","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","15544","0"],"version":"1.15544"},{"feature":"DBI::Util::CacheMemory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10315","0"],"version":"0.10315"},{"feature":"DBI::Util::_accessor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","9479","0"],"version":"0.9479"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["27d48b7f-6d4c-50df-892f-7f500745dad0","cb035aad-a1f6-59e5-baf4-fbd8666c1f75","d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"68414965-5544-5af9-8d6c-32b9cce4df2b","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:50:51.494Z","ingredient_id":"6d0d1e25-b677-544c-9aab-fc8bf0eab142","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6d0d1e25-b677-544c-9aab-fc8bf0eab142"},"name":"Data-Dumper","normalized_name":"Data-Dumper","primary_namespace":"language/perl","description":"unknown"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-06T18:21:49.330Z","ingredient_id":"6d0d1e25-b677-544c-9aab-fc8bf0eab142","ingredient_version_id":"34a46b65-4429-5882-ba28-f7d09bb8a1d6","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6d0d1e25-b677-544c-9aab-fc8bf0eab142/versions/34a46b65-4429-5882-ba28-f7d09bb8a1d6","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6d0d1e25-b677-544c-9aab-fc8bf0eab142"},"revision":2,"revision_timestamp":"2019-12-06T22:01:07.334Z","copyright_text":"unknown","documentation_uri":"https://metacpan.org/pod/Data::Dumper","is_binary_only":false,"license_expression":"UNKNOWN","release_timestamp":"2018-11-10T10:10:30.000Z","source_uri":"https://cpan.metacpan.org/authors/id/X/XS/XSAWYERX/Data-Dumper-2.173.tar.gz","sortable_version":["2","173","0"],"version":"2.173","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/697608b39330988e519131be667ff47168aaaaf99f06bd2095d5b46ad05d76fa/Data-Dumper-2.173.tar.gz","scanner_license_expression":"unknown","source_checksum":"697608b39330988e519131be667ff47168aaaaf99f06bd2095d5b46ad05d76fa","provided_features":[{"feature":"Data-Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","173","0"],"version":"2.173"},{"feature":"Data::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","173","0"],"version":"2.173"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"44bca841-a181-5b72-bdd4-ab5d37ccb309","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:28.430Z","ingredient_id":"4a73e3d3-370c-55c1-9fec-f5d48fc4be9b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4a73e3d3-370c-55c1-9fec-f5d48fc4be9b"},"name":"ExtUtils-CBuilder","normalized_name":"ExtUtils-CBuilder","primary_namespace":"language/perl","description":"Compile and link C code for Perl modules"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:28.430Z","ingredient_id":"4a73e3d3-370c-55c1-9fec-f5d48fc4be9b","ingredient_version_id":"28f42dcf-0e80-5058-92a5-729ca91955a8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4a73e3d3-370c-55c1-9fec-f5d48fc4be9b/versions/28f42dcf-0e80-5058-92a5-729ca91955a8","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4a73e3d3-370c-55c1-9fec-f5d48fc4be9b"},"revision":4,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-11-22T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"ExtUtils/CBuilder"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/1daae1d7709709a26139984b3c4c36e9ff22912cde6a393ea30ef40058dc9cd5/ExtUtils-CBuilder-0.280230.tar.gz","scanner_license_expression":"unknown","source_checksum":"1daae1d7709709a26139984b3c4c36e9ff22912cde6a393ea30ef40058dc9cd5","provided_features":[{"feature":"ExtUtils::CBuilder::Platform::darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::aix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::dec_osf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::MSVC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::android","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::os2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::BCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils-CBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-10-01T16:51:27.984Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/059a0a2b-9ff8-4354-a993-e04088ffd3de"},"patch_id":"059a0a2b-9ff8-4354-a993-e04088ffd3de","conditions":null,"content":"ExtUtils-CBuilder-base-file.patch","description":"No description","sequence_number":1}],"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"20af464f-bda3-5072-b330-f4392b5e9850","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:32.487Z","ingredient_id":"59937b56-db73-5e9e-8d96-5966ed4593a8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/59937b56-db73-5e9e-8d96-5966ed4593a8"},"name":"ExtUtils-Install","normalized_name":"ExtUtils-Install","primary_namespace":"language/perl","description":"install files from here to there"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:32.487Z","ingredient_id":"59937b56-db73-5e9e-8d96-5966ed4593a8","ingredient_version_id":"9d19c878-dde6-5bc7-a0a1-aee1a15cf1a2","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/59937b56-db73-5e9e-8d96-5966ed4593a8/versions/9d19c878-dde6-5bc7-a0a1-aee1a15cf1a2","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/59937b56-db73-5e9e-8d96-5966ed4593a8"},"revision":4,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-05-28T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/B/BI/BINGOS/ExtUtils-Install-2.14.tar.gz","sortable_version":["2","14","0"],"version":"2.14","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"ExtUtils/Install"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/35412305cbae979aac3b6e2c70cb301ae461979a1d848a8a043f74518eb96aea/ExtUtils-Install-2.14.tar.gz","scanner_license_expression":"unknown","source_checksum":"35412305cbae979aac3b6e2c70cb301ae461979a1d848a8a043f74518eb96aea","provided_features":[{"feature":"ExtUtils::Packlist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils::Installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils::Install","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils-Install","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-10-01T16:51:32.126Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/df7d561f-feaa-4bc7-bde6-2efafc070da8"},"patch_id":"df7d561f-feaa-4bc7-bde6-2efafc070da8","conditions":null,"content":"ExtUtils-Install-2.14-hpux-inuse-rename.patch","description":"Bug 85799, on HP-UX, first try to rename an in-use file\n instead of immediately giving up.","sequence_number":1}],"resolved_requirements":[]},{"alternatives":["5ae0af7e-aef3-5815-977e-ea78d2dfdd95","fd3ebb99-efb0-5fc4-8329-f36866b44290","b3f16eff-d588-5bbe-a33e-b34e1dbdf72e","d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"d2df2faa-b698-5599-b752-825d3e59cb63","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:37.136Z","ingredient_id":"8291f28e-f684-560c-8875-5c834a4740fd","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8291f28e-f684-560c-8875-5c834a4740fd"},"name":"ExtUtils-MakeMaker","normalized_name":"ExtUtils-MakeMaker","primary_namespace":"language/perl","description":"Create a module Makefile"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-10T18:45:23.625Z","ingredient_id":"8291f28e-f684-560c-8875-5c834a4740fd","ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8291f28e-f684-560c-8875-5c834a4740fd/versions/0067cb0b-fe9b-5c73-b853-bdd90d6e240b","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8291f28e-f684-560c-8875-5c834a4740fd"},"revision":1,"revision_timestamp":"2019-12-10T18:45:23.625Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/ExtUtils::MakeMaker","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-09-11T09:16:48.000Z","source_uri":"https://cpan.metacpan.org/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.38.tar.gz","sortable_version":["7","380","0"],"version":"7.38","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/897d64af242331ebb69090f68a2b610091e1996952d02096ce7942072a35e02c/ExtUtils-MakeMaker-7.38.tar.gz","scanner_license_expression":"unknown","source_checksum":"897d64af242331ebb69090f68a2b610091e1996952d02096ce7942072a35e02c","provided_features":[{"feature":"ExtUtils-MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Command::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Liblist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Liblist::Kid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_AIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Any","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_BeOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_DOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_NW5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_UWIN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Win95","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::_version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::charstar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::version::vpp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Mkbootstrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Mksymlists","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::testlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-12-10T15:57:44.636Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/aae9cf84-3381-45be-b044-a557232eca66"},"patch_id":"aae9cf84-3381-45be-b044-a557232eca66","conditions":null,"content":"s3://platform-sources/patches/c533f762465d39aee2a092a89e61a8d69ef51cc7d365f2d0d7a3231e09cd08f0.patch","description":"ExtUtils-MakeMaker ~ ExtUtils-MakeMaker-7.38-01-ldopts\nCarried forward from 7.30\nMake 'perl -MExtUtils::Embed -e ldopts' output a direct reference to libperl.a if using -lperl would pick up libperl.so.\nhttp://bugs.activestate.com/show_bug.cgi?id=39069\np4-change: 152627","sequence_number":1},{"creation_timestamp":"2019-12-10T15:58:48.730Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/7770ef1d-96a1-4f9b-a89c-7e1e51755a36"},"patch_id":"7770ef1d-96a1-4f9b-a89c-7e1e51755a36","conditions":null,"content":"s3://platform-sources/patches/d8467840f146ddd3e53228e2af5f83ac44af7a6f40912b5c096c6999d422e20c.patch","description":"ExtUtils-MakeMaker ~ ExtUtils-MakeMaker-7.38-02-html-pods\nCarried forward from 7.30\nSupport for HTML PODs","sequence_number":2},{"creation_timestamp":"2019-12-10T16:00:02.140Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/e1a5d58f-4c19-4177-a436-501a92b64b35"},"patch_id":"e1a5d58f-4c19-4177-a436-501a92b64b35","conditions":null,"content":"s3://platform-sources/patches/4e327d9c66c8ca64f42e754b46c96f9fbc01539f231d2afab5049711dda62051.patch","description":"ExtUtils-MakeMaker ~ ExtUtils-MakeMaker-7.38-03-htmldir\nCarried forward from 7.30\nMake sure MakeMaker sets up INSTALL.*HTMLDIR when using INSTALL_BASE\nWithout this change the html docs will be written to root level directories /bin, /lib, and /site (if they are writable; otherwise install will fail).\nThe INSTALL_BASE feature is used by local::lib (and cpanminus).","sequence_number":3},{"creation_timestamp":"2019-12-10T16:01:16.305Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/a4ae5e21-ee99-4e23-96eb-90ca47dfcdea"},"patch_id":"a4ae5e21-ee99-4e23-96eb-90ca47dfcdea","conditions":null,"content":"s3://platform-sources/patches/cde1c1d24b5308c81c1febb868c5b26565b032501b9536db83e8fb315d106195.patch","description":"ExtUtils-MakeMaker ~ ExtUtils-MakeMaker-7.38-skip-xs-on-AIX\nCarried forward from 7.30\nSkip EUMM XS tests on AIX.\nhttps://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker/pull/278","sequence_number":4}],"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"6be9481f-1484-5b4e-9407-05ef48c83c40","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:38.304Z","ingredient_id":"de5c5b9c-b323-501e-96bc-c4bdf75fe8b5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/de5c5b9c-b323-501e-96bc-c4bdf75fe8b5"},"name":"ExtUtils-Manifest","normalized_name":"ExtUtils-Manifest","primary_namespace":"language/perl","description":"utilities to write and check a MANIFEST file"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:38.304Z","ingredient_id":"de5c5b9c-b323-501e-96bc-c4bdf75fe8b5","ingredient_version_id":"c509e237-a516-5cf0-aaec-216a4daaeed4","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/de5c5b9c-b323-501e-96bc-c4bdf75fe8b5/versions/c509e237-a516-5cf0-aaec-216a4daaeed4","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/de5c5b9c-b323-501e-96bc-c4bdf75fe8b5"},"revision":6,"revision_timestamp":"2019-11-05T00:50:49.251Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2014-12-31T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/E/ET/ETHER/ExtUtils-Manifest-1.70.tar.gz","sortable_version":["1","70","0"],"version":"1.70","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"ExtUtils/Manifest","required":"1"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/eeff062050b223964cd8f624a90ae75df443612239df34a20ff87644f9f52b95/ExtUtils-Manifest-1.70.tar.gz","scanner_license_expression":"unknown","source_checksum":"eeff062050b223964cd8f624a90ae75df443612239df34a20ff87644f9f52b95","provided_features":[{"feature":"ExtUtils-Manifest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.70"},{"feature":"ExtUtils::Manifest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.70"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"d78ed36e-672c-59e3-81c9-5761074f6c97","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:55.496Z","ingredient_id":"b58e146b-377e-54f5-9424-705f681840f3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/b58e146b-377e-54f5-9424-705f681840f3"},"name":"Getopt-Long","normalized_name":"Getopt-Long","primary_namespace":"language/perl","description":"Module to handle parsing command line options"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:55.496Z","ingredient_id":"b58e146b-377e-54f5-9424-705f681840f3","ingredient_version_id":"f21bbf0a-4665-5fb9-88b8-3eb9a22a7da7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/b58e146b-377e-54f5-9424-705f681840f3/versions/f21bbf0a-4665-5fb9-88b8-3eb9a22a7da7","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/b58e146b-377e-54f5-9424-705f681840f3"},"revision":4,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0 OR GPL-2.0-or-later","release_timestamp":"2017-05-27T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/J/JV/JV/Getopt-Long-2.50.tar.gz","sortable_version":["2","50","0"],"version":"2.50","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Getopt/Long"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/20881adb2b73e83825f9a0a3b141db11b3a555e1d3775b13d81d0481623e4b67/Getopt-Long-2.50.tar.gz","scanner_license_expression":"unknown","source_checksum":"20881adb2b73e83825f9a0a3b141db11b3a555e1d3775b13d81d0481623e4b67","provided_features":[{"feature":"Getopt::Long","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.50"},{"feature":"Getopt-Long","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.50"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"e8b01fb8-3e62-5ac4-8e4b-422945b8cc9d","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"3b05243a-b6da-57ec-8c57-8de5221b8937"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"4b150af7-4abd-5bad-849c-94cde6b59fed"},{"dependency_types":["runtime"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:57.424Z","ingredient_id":"7075b232-08c5-5ad7-bf90-943d1b32dcf0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7075b232-08c5-5ad7-bf90-943d1b32dcf0"},"name":"HTML-Parser","normalized_name":"HTML-Parser","primary_namespace":"language/perl","description":"HTML parser class"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:57.424Z","ingredient_id":"7075b232-08c5-5ad7-bf90-943d1b32dcf0","ingredient_version_id":"1cb4ca5e-4e4e-59fb-b2cb-5fdb54856ff0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7075b232-08c5-5ad7-bf90-943d1b32dcf0/versions/1cb4ca5e-4e4e-59fb-b2cb-5fdb54856ff0","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7075b232-08c5-5ad7-bf90-943d1b32dcf0"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2016-01-19T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/G/GA/GAAS/HTML-Parser-3.72.tar.gz","sortable_version":["3","72","0"],"version":"3.72","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"HTML/Parser"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/ec28c7e1d9e67c45eca197077f7cdc41ead1bb4c538c7f02a3296a4bb92f608b/HTML-Parser-3.72.tar.gz","scanner_license_expression":"unknown","source_checksum":"ec28c7e1d9e67c45eca197077f7cdc41ead1bb4c538c7f02a3296a4bb92f608b","provided_features":[{"feature":"HTML-Parser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","72","0"],"version":"3.72"},{"feature":"HTML::Entities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","69","0"],"version":"3.69"},{"feature":"HTML::Filter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","72","0"],"version":"3.72"},{"feature":"HTML::HeadParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","71","0"],"version":"3.71"},{"feature":"HTML::LinkExtor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","69","0"],"version":"3.69"},{"feature":"HTML::Parser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","72","0"],"version":"3.72"},{"feature":"HTML::PullParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","57","0"],"version":"3.57"},{"feature":"HTML::TokeParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","69","0"],"version":"3.69"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"9a4b00f2-45fd-5480-b790-302bec5db07d","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:58.616Z","ingredient_id":"642ba5a2-5d51-5c4e-87fa-3685665bd030","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/642ba5a2-5d51-5c4e-87fa-3685665bd030"},"name":"HTML-Tagset","normalized_name":"HTML-Tagset","primary_namespace":"language/perl","description":"data tables useful in parsing HTML"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:58.616Z","ingredient_id":"642ba5a2-5d51-5c4e-87fa-3685665bd030","ingredient_version_id":"4b150af7-4abd-5bad-849c-94cde6b59fed","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/642ba5a2-5d51-5c4e-87fa-3685665bd030/versions/4b150af7-4abd-5bad-849c-94cde6b59fed","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/642ba5a2-5d51-5c4e-87fa-3685665bd030"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2008-03-01T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/P/PE/PETDANCE/HTML-Tagset-3.20.tar.gz","sortable_version":["3","20","0"],"version":"3.20","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"HTML/Tagset"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/adb17dac9e36cd011f5243881c9739417fd102fce760f8de4e9be4c7131108e2/HTML-Tagset-3.20.tar.gz","scanner_license_expression":"unknown","source_checksum":"adb17dac9e36cd011f5243881c9739417fd102fce760f8de4e9be4c7131108e2","provided_features":[{"feature":"HTML-Tagset","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","20","0"],"version":"3.20"},{"feature":"HTML::Tagset","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","20","0"],"version":"3.20"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"701c6b1f-2b6c-56c9-ae5d-f3ae17cd3d1e","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:02.127Z","ingredient_id":"9ed3546f-abf3-546f-a532-d4badd1937f7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9ed3546f-abf3-546f-a532-d4badd1937f7"},"name":"HTTP-Date","normalized_name":"HTTP-Date","primary_namespace":"language/perl","description":"date conversion routines"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:02.127Z","ingredient_id":"9ed3546f-abf3-546f-a532-d4badd1937f7","ingredient_version_id":"91cd893b-5b8c-5391-9c77-643fb85af0af","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9ed3546f-abf3-546f-a532-d4badd1937f7/versions/91cd893b-5b8c-5391-9c77-643fb85af0af","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9ed3546f-abf3-546f-a532-d4badd1937f7"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-Perl OR GPL-1.0-or-later","release_timestamp":"2012-03-30T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/G/GA/GAAS/HTTP-Date-6.02.tar.gz","sortable_version":["6","2","0"],"version":"6.2","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"HTTP/Date"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/e8b9941da0f9f0c9c01068401a5e81341f0e3707d1c754f8e11f42a7e629e333/HTTP-Date-6.02.tar.gz","scanner_license_expression":"unknown","source_checksum":"e8b9941da0f9f0c9c01068401a5e81341f0e3707d1c754f8e11f42a7e629e333","provided_features":[{"feature":"HTTP-Date","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","2","0"],"version":"6.2"},{"feature":"HTTP::Date","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","2","0"],"version":"6.2"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"c24ffb45-a21d-561f-ad66-d56556b2bdb4","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"50f0603e-048d-5f9a-ac44-9d32df97809d"},{"dependency_types":["build"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:02.612Z","ingredient_id":"80076996-fc73-50c2-850e-a606a139b302","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/80076996-fc73-50c2-850e-a606a139b302"},"name":"HTTP-Message","normalized_name":"HTTP-Message","primary_namespace":"language/perl","description":"HTTP style message (base class)"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:02.612Z","ingredient_id":"80076996-fc73-50c2-850e-a606a139b302","ingredient_version_id":"3e08c8d3-fe88-5c33-82df-ded1e3d15a0b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/80076996-fc73-50c2-850e-a606a139b302/versions/3e08c8d3-fe88-5c33-82df-ded1e3d15a0b","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/80076996-fc73-50c2-850e-a606a139b302"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-12-20T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/O/OA/OALDERS/HTTP-Message-6.14.tar.gz","sortable_version":["6","14","0"],"version":"6.14","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"HTTP/Message"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/71aab9f10eb4b8ec6e8e3a85fc5acb46ba04db1c93eb99613b184078c5cf2ac9/HTTP-Message-6.14.tar.gz","scanner_license_expression":"unknown","source_checksum":"71aab9f10eb4b8ec6e8e3a85fc5acb46ba04db1c93eb99613b184078c5cf2ac9","provided_features":[{"feature":"HTTP-Message","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Headers","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Headers::Auth","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Headers::ETag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Headers::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Message","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Request","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Request::Common","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Response","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Status","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"7d72ca66-ae36-5e6f-a491-d649bbdb8b8f","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["runtime"],"ingredient_version_id":"3e08c8d3-fe88-5c33-82df-ded1e3d15a0b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:03.039Z","ingredient_id":"2950e101-1150-5ab1-affe-ab6ac3d4b6e7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2950e101-1150-5ab1-affe-ab6ac3d4b6e7"},"name":"HTTP-Negotiate","normalized_name":"HTTP-Negotiate","primary_namespace":"language/perl","description":"choose a variant to serve"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:03.039Z","ingredient_id":"2950e101-1150-5ab1-affe-ab6ac3d4b6e7","ingredient_version_id":"e4b6a074-ad51-5b69-95ce-7747c95471f8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2950e101-1150-5ab1-affe-ab6ac3d4b6e7/versions/e4b6a074-ad51-5b69-95ce-7747c95471f8","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2950e101-1150-5ab1-affe-ab6ac3d4b6e7"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-Perl OR GPL-1.0-or-later","release_timestamp":"2012-02-18T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/G/GA/GAAS/HTTP-Negotiate-6.01.tar.gz","sortable_version":["6","1","0"],"version":"6.1","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"HTTP/Negotiate"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/1c729c1ea63100e878405cda7d66f9adfd3ed4f1d6cacaca0ee9152df728e016/HTTP-Negotiate-6.01.tar.gz","scanner_license_expression":"unknown","source_checksum":"1c729c1ea63100e878405cda7d66f9adfd3ed4f1d6cacaca0ee9152df728e016","provided_features":[{"feature":"HTTP-Negotiate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","1","0"],"version":"6.1"},{"feature":"HTTP::Negotiate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","1","0"],"version":"6.1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["96636fc0-a33a-5825-8f5d-5122b3812a0f"],"artifact_id":"8d011eb1-3d8e-5074-a8b2-d41586e53059","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["runtime"],"ingredient_version_id":"3b05243a-b6da-57ec-8c57-8de5221b8937"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"bebc32d9-b8e0-59dd-97b2-098496e9fd61"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:22.652Z","ingredient_id":"21072e99-9e15-5b56-a8fc-e83864695be8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/21072e99-9e15-5b56-a8fc-e83864695be8"},"name":"JSON-PP","normalized_name":"JSON-PP","primary_namespace":"language/perl","description":"JSON::XS compatible pure-Perl module."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-11-13T15:08:42.291Z","ingredient_id":"21072e99-9e15-5b56-a8fc-e83864695be8","ingredient_version_id":"50f0603e-048d-5f9a-ac44-9d32df97809d","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/21072e99-9e15-5b56-a8fc-e83864695be8/versions/50f0603e-048d-5f9a-ac44-9d32df97809d","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/21072e99-9e15-5b56-a8fc-e83864695be8"},"revision":1,"revision_timestamp":"2019-11-13T15:08:42.291Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/JSON::PP","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-06-29T09:52:40.000Z","source_uri":"https://cpan.metacpan.org/authors/id/I/IS/ISHIGAKI/JSON-PP-4.04.tar.gz","sortable_version":["4","40","0"],"version":"4.04","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/81311c56d7b94bbf8003cf421e87961efba576189198e516fd5426889650b66a/JSON-PP-4.04.tar.gz","scanner_license_expression":"unknown","source_checksum":"81311c56d7b94bbf8003cf421e87961efba576189198e516fd5426889650b66a","provided_features":[{"feature":"JSON-PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","40","0"],"version":"4.04"},{"feature":"JSON::PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","40","0"],"version":"4.04"},{"feature":"JSON::PP::Boolean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","40","0"],"version":"4.04"},{"feature":"JSON::PP::IncrParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","40","0"],"version":"4.04"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["a921e82c-9204-5b32-b7fb-3491c52b4e6b"],"artifact_id":"79b640e2-85c5-5e36-b466-cec860002061","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build","runtime"],"ingredient_version_id":"142400e9-5965-5a41-813a-427106fbf770"},{"dependency_types":["runtime"],"ingredient_version_id":"28f42dcf-0e80-5058-92a5-729ca91955a8"},{"dependency_types":["runtime"],"ingredient_version_id":"34a46b65-4429-5882-ba28-f7d09bb8a1d6"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"9d19c878-dde6-5bc7-a0a1-aee1a15cf1a2"},{"dependency_types":["build","runtime"],"ingredient_version_id":"ad8f2146-84db-5542-b4b7-c188f18784d7"},{"dependency_types":["runtime"],"ingredient_version_id":"b131cae2-42e2-564e-a217-1266ea60ff62"},{"dependency_types":["runtime"],"ingredient_version_id":"c509e237-a516-5cf0-aaec-216a4daaeed4"},{"dependency_types":["build","runtime"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"},{"dependency_types":["runtime"],"ingredient_version_id":"f21bbf0a-4665-5fb9-88b8-3eb9a22a7da7"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:48.137Z","ingredient_id":"c709227b-f464-5cb3-b53f-de99f4244cb1","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c709227b-f464-5cb3-b53f-de99f4244cb1"},"name":"Module-Build","normalized_name":"Module-Build","primary_namespace":"language/perl","description":"Build and install Perl modules"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-12T22:59:25.654Z","ingredient_id":"c709227b-f464-5cb3-b53f-de99f4244cb1","ingredient_version_id":"5b9149e8-2334-5454-a523-cd9787003344","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c709227b-f464-5cb3-b53f-de99f4244cb1/versions/5b9149e8-2334-5454-a523-cd9787003344","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c709227b-f464-5cb3-b53f-de99f4244cb1"},"revision":3,"revision_timestamp":"2020-04-22T15:09:12.488Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/Module::Build","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-04-15T22:52:38.000Z","source_uri":"https://cpan.metacpan.org/authors/id/L/LE/LEONT/Module-Build-0.4229.tar.gz","sortable_version":["0","422","900"],"version":"0.4229","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/1fe491a6cda914b01bc8e592faa2b5404e9f35915ca15322f8f2a8d8f9008c18/Module-Build-0.4229.tar.gz","scanner_license_expression":"unknown","source_checksum":"1fe491a6cda914b01bc8e592faa2b5404e9f35915ca15322f8f2a8d8f9008c18","provided_features":[{"feature":"Module::Build::PodParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::os2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::aix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::Windows","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::Default","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::PPMMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Notes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Cookbook","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Compat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module-Build","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"56135216-8f1d-5289-a8db-fae6e287dcbd","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:51.673Z","ingredient_id":"441965ba-8592-5986-b10d-7e1d959ddfd9","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/441965ba-8592-5986-b10d-7e1d959ddfd9"},"name":"Module-Metadata","normalized_name":"Module-Metadata","primary_namespace":"language/perl","description":"Gather package and POD information from perl module files"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:51.673Z","ingredient_id":"441965ba-8592-5986-b10d-7e1d959ddfd9","ingredient_version_id":"ad8f2146-84db-5542-b4b7-c188f18784d7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/441965ba-8592-5986-b10d-7e1d959ddfd9/versions/ad8f2146-84db-5542-b4b7-c188f18784d7","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/441965ba-8592-5986-b10d-7e1d959ddfd9"},"revision":4,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2016-07-24T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/E/ET/ETHER/Module-Metadata-1.000033.tar.gz","sortable_version":["1","33","0"],"version":"1.33","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Module/Metadata"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/bc96cc7949b52e2dac1595e806102640760917cfcd7497c7a023192156f3ff8e/Module-Metadata-1.000033.tar.gz","scanner_license_expression":"unknown","source_checksum":"bc96cc7949b52e2dac1595e806102640760917cfcd7497c7a023192156f3ff8e","provided_features":[{"feature":"Module::Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","33","0"],"version":"1.33"},{"feature":"Module-Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","33","0"],"version":"1.33"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"c561e3f0-2aba-5277-8315-279a9f06a8ca","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:59.671Z","ingredient_id":"d6b106ec-77df-51da-9864-5a040bf0711a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d6b106ec-77df-51da-9864-5a040bf0711a"},"name":"Net-HTTP","normalized_name":"Net-HTTP","primary_namespace":"language/perl","description":"Low-level HTTP connection (client)"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:59.671Z","ingredient_id":"d6b106ec-77df-51da-9864-5a040bf0711a","ingredient_version_id":"06d43cc3-8f67-575b-b34d-0ec60e9ae67e","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d6b106ec-77df-51da-9864-5a040bf0711a/versions/06d43cc3-8f67-575b-b34d-0ec60e9ae67e","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d6b106ec-77df-51da-9864-5a040bf0711a"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-09-01T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/O/OA/OALDERS/Net-HTTP-6.17.tar.gz","sortable_version":["6","17","0"],"version":"6.17","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Net/HTTP"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/1e8624b1618dc6f7f605f5545643ebb9b833930f4d7485d4124aa2f2f26d1611/Net-HTTP-6.17.tar.gz","scanner_license_expression":"unknown","source_checksum":"1e8624b1618dc6f7f605f5545643ebb9b833930f4d7485d4124aa2f2f26d1611","provided_features":[{"feature":"Net-HTTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","17","0"],"version":"6.17"},{"feature":"Net::HTTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","17","0"],"version":"6.17"},{"feature":"Net::HTTP::Methods","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","17","0"],"version":"6.17"},{"feature":"Net::HTTP::NB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","17","0"],"version":"6.17"},{"feature":"Net::HTTPS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","17","0"],"version":"6.17"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["21a740ba-c54d-5a78-bc42-0fdb7dced2ba","d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"aea53a58-9da4-5c4a-9259-fc533a28cbc6","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:53:18.167Z","ingredient_id":"13dc7a1e-eef1-5153-b1ce-e7632febd346","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/13dc7a1e-eef1-5153-b1ce-e7632febd346"},"name":"PathTools","normalized_name":"PathTools","primary_namespace":"language/perl","description":"unknown"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-06T18:21:43.162Z","ingredient_id":"13dc7a1e-eef1-5153-b1ce-e7632febd346","ingredient_version_id":"142400e9-5965-5a41-813a-427106fbf770","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/13dc7a1e-eef1-5153-b1ce-e7632febd346/versions/142400e9-5965-5a41-813a-427106fbf770","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/13dc7a1e-eef1-5153-b1ce-e7632febd346"},"revision":2,"revision_timestamp":"2019-12-06T21:46:46.530Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/Cwd","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2018-08-29T19:53:19.000Z","source_uri":"https://cpan.metacpan.org/authors/id/X/XS/XSAWYERX/PathTools-3.75.tar.gz","sortable_version":["3","750","0"],"version":"3.75","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/a558503aa6b1f8c727c0073339081a77888606aa701ada1ad62dd9d8c3f945a2/PathTools-3.75.tar.gz","scanner_license_expression":"unknown","source_checksum":"a558503aa6b1f8c727c0073339081a77888606aa701ada1ad62dd9d8c3f945a2","provided_features":[{"feature":"Cwd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::AmigaOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Epoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"PathTools","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a","c287183e-48c8-5bfe-9b9d-0ead376370fe"],"artifact_id":"18f5dfd6-e09c-5bff-9dd8-a182a757b52b","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"9d19c878-dde6-5bc7-a0a1-aee1a15cf1a2"}],"ingredient":{"creation_timestamp":"2019-10-01T16:53:42.402Z","ingredient_id":"9c61e880-bed6-59de-807a-4ace3191d81b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9c61e880-bed6-59de-807a-4ace3191d81b"},"name":"Scalar-List-Utils","normalized_name":"Scalar-List-Utils","primary_namespace":"language/perl","description":"Common Scalar and List utility subroutines"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-06T18:21:56.566Z","ingredient_id":"9c61e880-bed6-59de-807a-4ace3191d81b","ingredient_version_id":"bebc32d9-b8e0-59dd-97b2-098496e9fd61","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9c61e880-bed6-59de-807a-4ace3191d81b/versions/bebc32d9-b8e0-59dd-97b2-098496e9fd61","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9c61e880-bed6-59de-807a-4ace3191d81b"},"revision":2,"revision_timestamp":"2019-12-06T22:22:08.218Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/Sub::Util","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-10-24T09:43:15.000Z","source_uri":"https://cpan.metacpan.org/authors/id/P/PE/PEVANS/Scalar-List-Utils-1.53.tar.gz","sortable_version":["1","530","0"],"version":"1.53","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/bd4086b066fb3b18a0be2e7d9bc100a99aa0f233ad659492340415c7b2bdae99/Scalar-List-Utils-1.53.tar.gz","scanner_license_expression":"unknown","source_checksum":"bd4086b066fb3b18a0be2e7d9bc100a99aa0f233ad659492340415c7b2bdae99","provided_features":[{"feature":"List::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","530","0"],"version":"1.53"},{"feature":"List::Util::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","530","0"],"version":"1.53"},{"feature":"Scalar-List-Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","530","0"],"version":"1.53"},{"feature":"Scalar::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","530","0"],"version":"1.53"},{"feature":"Sub::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","530","0"],"version":"1.53"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a","bbfeffca-adbf-53df-9e84-dcbc83f804bd","19f1be8e-2dc4-58be-a370-00627a6ce003"],"artifact_id":"86d6c830-22f3-5c53-b9cb-74dcfc8a0d03","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:54:16.878Z","ingredient_id":"2df1c8f2-0db1-506c-b339-d36a23aa303a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2df1c8f2-0db1-506c-b339-d36a23aa303a"},"name":"Test-Simple","normalized_name":"Test-Simple","primary_namespace":"language/perl","description":"Basic utilities for writing tests."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-06T18:21:33.143Z","ingredient_id":"2df1c8f2-0db1-506c-b339-d36a23aa303a","ingredient_version_id":"3b05243a-b6da-57ec-8c57-8de5221b8937","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2df1c8f2-0db1-506c-b339-d36a23aa303a/versions/3b05243a-b6da-57ec-8c57-8de5221b8937","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2df1c8f2-0db1-506c-b339-d36a23aa303a"},"revision":2,"revision_timestamp":"2019-12-06T21:38:18.262Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/Test::Simple","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-12-02T21:27:53.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test-Simple-1.302170.tar.gz","sortable_version":["1","302","170"],"version":"1.302170","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/50dc374f93316ed1c251433e1f91050e82a56711ff47a7b333602e017e3bfe3a/Test-Simple-1.302170.tar.gz","scanner_license_expression":"unknown","source_checksum":"50dc374f93316ed1c251433e1f91050e82a56711ff47a7b333602e017e3bfe3a","provided_features":[{"feature":"Test-Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::API::Breakage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::API::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::API::Instance","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::API::Stack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Bail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Diag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Fail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Note","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Pass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::TAP::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::V2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Waiting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::About","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Amnesty","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Assert","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Control","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Info::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Render","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Formatter::TAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Hub::Interceptor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Hub::Interceptor::Terminator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Hub::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::IPC::Driver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::IPC::Driver::Files","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Tools::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Util::ExternalMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Util::Facets2Legacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Util::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::IO::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::Tester::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::Tester::Tie","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::TodoDiag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Tester::Capture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Tester::CaptureRunner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Tester::Delegate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::use::ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"b3dd6720-f5bc-5c4d-8690-ee764aaf89ca","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:54:49.138Z","ingredient_id":"e10d6669-f1c9-57ef-a77e-3bb8fa3df884","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/e10d6669-f1c9-57ef-a77e-3bb8fa3df884"},"name":"URI","normalized_name":"URI","primary_namespace":"language/perl","description":"Uniform Resource Identifiers (absolute and relative)"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:54:49.138Z","ingredient_id":"e10d6669-f1c9-57ef-a77e-3bb8fa3df884","ingredient_version_id":"1a882ae6-d86f-5431-a5cb-8caa0abeedf5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/e10d6669-f1c9-57ef-a77e-3bb8fa3df884/versions/1a882ae6-d86f-5431-a5cb-8caa0abeedf5","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/e10d6669-f1c9-57ef-a77e-3bb8fa3df884"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2018-01-09T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/E/ET/ETHER/URI-1.73.tar.gz","sortable_version":["1","73","0"],"version":"1.73","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"URI"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/cca7ab4a6f63f3ccaacae0f2e1337e8edf84137e73f18548ec7d659f23efe413/URI-1.73.tar.gz","scanner_license_expression":"unknown","source_checksum":"cca7ab4a6f63f3ccaacae0f2e1337e8edf84137e73f18548ec7d659f23efe413","provided_features":[{"feature":"URI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::Escape","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","31","0"],"version":"3.31"},{"feature":"URI::Heuristic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","20","0"],"version":"4.20"},{"feature":"URI::IRI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::QueryParam","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::Split","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::URL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","4","0"],"version":"5.4"},{"feature":"URI::WithBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.20"},{"feature":"URI::_foreign","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_idna","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_ldap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_login","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_punycode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_query","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_segment","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_server","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_userpass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::data","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","21","0"],"version":"4.21"},{"feature":"URI::file::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::FAT","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::ftp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::gopher","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::http","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::https","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::ldap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::ldapi","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::ldaps","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::mailto","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::mms","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::news","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::nntp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::pop","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::rlogin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::rsync","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::rtsp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::rtspu","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::sftp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::sip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::sips","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::snews","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::ssh","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::telnet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::tn3270","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::urn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::urn::isbn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::urn::oid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"f54623d0-376f-5024-b237-c1e78a926ff8","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:55:07.132Z","ingredient_id":"6184d401-d399-5634-9a36-49b77e680ee4","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6184d401-d399-5634-9a36-49b77e680ee4"},"name":"Win32-ShellQuote","normalized_name":"Win32-ShellQuote","primary_namespace":"language/perl","description":"Quote argument lists for Win32"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:55:07.132Z","ingredient_id":"6184d401-d399-5634-9a36-49b77e680ee4","ingredient_version_id":"3d2abb3d-07d3-5fac-ba8b-897484c7d98c","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6184d401-d399-5634-9a36-49b77e680ee4/versions/3d2abb3d-07d3-5fac-ba8b-897484c7d98c","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6184d401-d399-5634-9a36-49b77e680ee4"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2016-09-27T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/H/HA/HAARG/Win32-ShellQuote-0.003001.tar.gz","sortable_version":["0","3","1","0"],"version":"0.3.1","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Win32/ShellQuote","require_os":["MSWin32","MSWin32"]},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/aa74b0e3dc2d41cd63f62f853e521ffd76b8d823479a2619e22edb4049b4c0dc/Win32-ShellQuote-0.003001.tar.gz","scanner_license_expression":"unknown","source_checksum":"aa74b0e3dc2d41cd63f62f853e521ffd76b8d823479a2619e22edb4049b4c0dc","provided_features":[{"feature":"Win32-ShellQuote","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","1","0"],"version":"0.3.1"},{"feature":"Win32::ShellQuote","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","1","0"],"version":"0.30.1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"Win32-ShellQuote","namespace":"language/perl","version_requirements":[{"comparator":"eq","version":"0.3.1"}]}]},{"alternatives":[],"artifact_id":"0df374fb-9686-5e09-80ee-93e1943dd1eb","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:55:57.867Z","ingredient_id":"438c3d67-b979-579d-942a-cd6a47976113","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/438c3d67-b979-579d-942a-cd6a47976113"},"name":"libwww-perl","normalized_name":"libwww-perl","primary_namespace":"language/perl","description":"The World-Wide Web library for Perl"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:55:57.867Z","ingredient_id":"438c3d67-b979-579d-942a-cd6a47976113","ingredient_version_id":"84a01b55-1d92-53ae-a7cb-d591b7b54724","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/438c3d67-b979-579d-942a-cd6a47976113/versions/84a01b55-1d92-53ae-a7cb-d591b7b54724","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/438c3d67-b979-579d-942a-cd6a47976113"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-12-11T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/E/ET/ETHER/libwww-perl-6.31.tar.gz","sortable_version":["6","31","0"],"version":"6.31","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"libwww/perl"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/525d5386d39d1c1d7da8a0e9dd0cbab95cba2a4bfcfd9b83b257f49be4eecae3/libwww-perl-6.31.tar.gz","scanner_license_expression":"unknown","source_checksum":"525d5386d39d1c1d7da8a0e9dd0cbab95cba2a4bfcfd9b83b257f49be4eecae3","provided_features":[{"feature":"LWP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Authen::Basic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Authen::Digest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Authen::Ntlm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::ConnCache","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Debug::TraceHTTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::DebugFile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::MemberMixin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::cpan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::data","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::ftp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::gopher","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::http","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::loopback","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::mailto","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::nntp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::nogo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::RobotUA","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::UserAgent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"libwww-perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"libwww-perl","namespace":"language/perl","version_requirements":[{"comparator":"gte","version":"0"}]}]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a","a156d3e3-3f38-55ee-a5c0-af32af5e8e7c"],"artifact_id":"84393ca8-9ac8-5e3c-a820-fa55b91bda42","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:58:19.876Z","ingredient_id":"ce716f45-743d-56e6-9d06-102a58dc9c24","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ce716f45-743d-56e6-9d06-102a58dc9c24"},"name":"podlators","normalized_name":"podlators","primary_namespace":"language/perl","description":"Convert POD data to various other formats"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-06T18:21:48.703Z","ingredient_id":"ce716f45-743d-56e6-9d06-102a58dc9c24","ingredient_version_id":"b131cae2-42e2-564e-a217-1266ea60ff62","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ce716f45-743d-56e6-9d06-102a58dc9c24/versions/b131cae2-42e2-564e-a217-1266ea60ff62","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ce716f45-743d-56e6-9d06-102a58dc9c24"},"revision":2,"revision_timestamp":"2019-12-06T22:02:12.393Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/Pod::Man","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-06-01T04:04:13.000Z","source_uri":"https://cpan.metacpan.org/authors/id/R/RR/RRA/podlators-4.12.tar.gz","sortable_version":["4","120","0"],"version":"4.12","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/948717da19630a5f003da4406da90fe1cbdec9ae493671c90dfb6d8b3d63b7eb/podlators-4.12.tar.gz","scanner_license_expression":"unknown","source_checksum":"948717da19630a5f003da4406da90fe1cbdec9ae493671c90dfb6d8b3d63b7eb","provided_features":[{"feature":"Pod::Man","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"Pod::ParseLink","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"Pod::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"Pod::Text::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"Pod::Text::Overstrike","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"Pod::Text::Termcap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"podlators","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["51d0cb50-cb63-5d61-9312-03343731a5c7","189665e3-7ac1-52ab-8211-8ba1ca7815f7","801206d7-a69c-53fd-9f44-a39851413669","77fc8d23-fc48-5db5-b606-f5276c1bceff","8329dae3-9920-56ae-a768-6a4c64e52436","ac073035-67b4-5786-9aa3-0cb043936036"],"artifact_id":"50d60c15-ab99-5f25-bca9-e8db079f49d3","build_scripts":[{"build_script_id":"606265a1-ac03-48e0-a708-115cc5004e9a","creation_timestamp":"2019-10-01T16:56:10.414Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/606265a1-ac03-48e0-a708-115cc5004e9a"},"conditions":null,"language":"perl","script":"openssl-1.1.0-AS-Makefile.PL"}],"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:56:17.721Z","ingredient_id":"c1256669-2a2d-5cf2-8860-804bf43ceb5f","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c1256669-2a2d-5cf2-8860-804bf43ceb5f"},"name":"openssl","normalized_name":"openssl","primary_namespace":"shared","description":"Open Secure Sockets Layer general cryptography library."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:56:17.721Z","ingredient_id":"c1256669-2a2d-5cf2-8860-804bf43ceb5f","ingredient_version_id":"865b7af2-2892-5cb4-8a61-100a21332b5c","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c1256669-2a2d-5cf2-8860-804bf43ceb5f/versions/865b7af2-2892-5cb4-8a61-100a21332b5c","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c1256669-2a2d-5cf2-8860-804bf43ceb5f"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2019-05-28T00:00:00.000Z","source_uri":"https://www.openssl.org/source/openssl-1.1.0k.tar.gz","sortable_version":["1","10","0","11","0"],"version":"1.10.0.11","activestate_license_expression":"unknown","camel_extras":{"ppm_pkg":"no"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/shared/efa4965f4f773574d6cbda1cf874dbbe455ab1c0d4f906115f867d30444470b1/openssl-1.1.0k.tar.gz","scanner_license_expression":"unknown","source_checksum":"efa4965f4f773574d6cbda1cf874dbbe455ab1c0d4f906115f867d30444470b1","provided_features":[{"feature":"openssl","is_activestate_version":false,"is_default_provider":true,"namespace":"shared","sortable_version":["1","10","0","11","0"],"version":"1.10.0.11"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-10-01T16:56:13.279Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/402b7749-a78a-4913-8cf3-65f7457f0631"},"patch_id":"402b7749-a78a-4913-8cf3-65f7457f0631","conditions":null,"content":"/src/Libraries/patches/openssl/1.10.0.11/0001-Port-1.1.0h-patch-forward-to-1.1.0k.patch","description":"[PATCH 1/3] Port 1.1.0h patch forward to 1.1.0k","sequence_number":1},{"creation_timestamp":"2019-10-01T16:56:13.634Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/f44ea593-761b-44e0-8d29-509f1dd45e6a"},"patch_id":"f44ea593-761b-44e0-8d29-509f1dd45e6a","conditions":null,"content":"/src/Libraries/patches/openssl/1.10.0.11/0002-Disable-test_err.patch","description":"[PATCH 2/3] Disable test_err","sequence_number":2},{"creation_timestamp":"2019-10-01T16:56:13.998Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/d4e5c7df-8444-4a25-a4db-ffe0b86fa0d6"},"patch_id":"d4e5c7df-8444-4a25-a4db-ffe0b86fa0d6","conditions":null,"content":"/src/Libraries/patches/openssl/1.10.0.11/0003-Add-quotes-for-windows.patch","description":"[PATCH 3/3] Add quotes for windows\n\nOn windows the command for apps/openssl\nrequires quotes to work in runtime.","sequence_number":3}],"resolved_requirements":[{"feature":"openssl","namespace":"shared","version_requirements":[{"comparator":"gte","version":"0"},{"comparator":"lt","version":"1.11.0.0"}]}]},{"alternatives":[],"artifact_id":"6938f428-a31c-5347-8f0b-e1a9650addef","build_scripts":[{"build_script_id":"677467f0-5e38-4e3b-b623-9e8464a49f91","creation_timestamp":"2019-10-01T16:58:22.954Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/677467f0-5e38-4e3b-b623-9e8464a49f91"},"conditions":null,"language":"perl","script":"postgresql-9.5.4-AS-Makefile.PL"}],"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"865b7af2-2892-5cb4-8a61-100a21332b5c"}],"ingredient":{"creation_timestamp":"2019-10-01T16:58:24.412Z","ingredient_id":"d89530be-8d94-5e35-b606-d7849f073e74","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d89530be-8d94-5e35-b606-d7849f073e74"},"name":"postgresql","normalized_name":"postgresql","primary_namespace":"shared","description":"An object-relational database system"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:58:24.412Z","ingredient_id":"d89530be-8d94-5e35-b606-d7849f073e74","ingredient_version_id":"a873d528-56e8-5c19-b5cb-383be3bb9074","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d89530be-8d94-5e35-b606-d7849f073e74/versions/a873d528-56e8-5c19-b5cb-383be3bb9074","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d89530be-8d94-5e35-b606-d7849f073e74"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2017-05-08T00:00:00.000Z","source_uri":"https://s3.amazonaws.com/camel-sources/src/Libraries/vendor/postgresql-9.6.3.tar.gz","sortable_version":["9","6","3","0"],"version":"9.6.3","activestate_license_expression":"unknown","camel_extras":{"dont_build":["hpux","solaris"],"ppm_pkg":"no","skip_test":"yes"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/shared/df088372230b1dd21d87bb81686471508f4c42094d4f4f32b5d8e686fea69fa6/postgresql-9.6.3.tar.gz","scanner_license_expression":"unknown","source_checksum":"df088372230b1dd21d87bb81686471508f4c42094d4f4f32b5d8e686fea69fa6","provided_features":[{"feature":"postgresql","is_activestate_version":false,"is_default_provider":true,"namespace":"shared","sortable_version":["9","6","3","0"],"version":"9.6.3"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-10-01T16:58:23.305Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/4aafe925-353a-45d3-813a-2f32265e2eb4"},"patch_id":"4aafe925-353a-45d3-813a-2f32265e2eb4","conditions":null,"content":"/src/Libraries/patches/postgresql-9.5.4-win32.patch","description":"[PATCH 2/2] ActiveState patches for building under MinGW and MSVC","sequence_number":1},{"creation_timestamp":"2019-10-01T16:58:23.666Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/172db555-6bc9-4aeb-afec-ca22308daa4d"},"patch_id":"172db555-6bc9-4aeb-afec-ca22308daa4d","conditions":null,"content":"/src/Libraries/patches/postgresql-9.5.4-fix-old-sun-compiler.patch","description":"Don't use __attribute__ for versions of Sun C that don't\n support it","sequence_number":2},{"creation_timestamp":"2019-10-01T16:58:24.018Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/0de4632f-8673-49d4-a504-a94ccb9ea441"},"patch_id":"0de4632f-8673-49d4-a504-a94ccb9ea441","conditions":null,"content":"/src/Libraries/patches/postgresql-9.5.4-disable-shared.patch","description":"[PATCH 3/3] Patch back in support for --disable-shared, which was\n removed from Postgres starting in 9.3. This is basically just the reverse of\n 381a9ed.","sequence_number":3}],"resolved_requirements":[]}],"solver_version":0} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/data/recipes/perl.json b/pkg/platform/runtime/testhelper/data/recipes/perl.json new file mode 100644 index 0000000000..fa3b32b605 --- /dev/null +++ b/pkg/platform/runtime/testhelper/data/recipes/perl.json @@ -0,0 +1 @@ +{"camel_flags":[],"from_recipe_store":true,"image":{"image_id":"0fceabb4-ca86-4846-9b0a-c23947770cdb","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/0fceabb4-ca86-4846-9b0a-c23947770cdb"},"name":"activestate/centos-7.6-build","platform_id":"0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a","type":"Docker","sortable_version":["1","0","4","0"],"version":"1.0.4","provided_features":[{"feature":"perl-build-tools","is_activestate_version":true,"is_default_provider":false,"namespace":"image","sortable_version":["0"],"version":"0"},{"feature":"python-build-tools","is_activestate_version":true,"is_default_provider":false,"namespace":"image","sortable_version":["0"],"version":"0"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"conditions":null,"revision":5,"revision_timestamp":"2020-01-30T20:00:03.523Z"},"is_indemnified":false,"platform":{"cpu_architecture":{"cpu_architecture_id":"4cdba18d-0851-4925-9ae5-9c8a2987828a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/cpu-architectures/4cdba18d-0851-4925-9ae5-9c8a2987828a"},"bit_width":"64","name":"x86","provided_features":[{"feature":"x86 64-bit","is_activestate_version":false,"is_default_provider":true,"namespace":"cpu-architecture","sortable_version":["1"],"version":"1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"cpu_extensions":[],"creation_timestamp":"2019-08-06T21:46:35.288Z","display_name":"CentOS 7.6.1810, Linux 4.15.0, glibc 2.17 x86 64-bit","images":[{"image_id":"0fceabb4-ca86-4846-9b0a-c23947770cdb","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/images/0fceabb4-ca86-4846-9b0a-c23947770cdb"},"name":"activestate/centos-7.6-build","platform_id":"0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a","type":"Docker","sortable_version":["1","0","4","0"],"version":"1.0.4","provided_features":[{"feature":"perl-build-tools","is_activestate_version":true,"is_default_provider":false,"namespace":"image","sortable_version":["0"],"version":"0"},{"feature":"python-build-tools","is_activestate_version":true,"is_default_provider":false,"namespace":"image","sortable_version":["0"],"version":"0"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"conditions":null,"revision":5,"revision_timestamp":"2020-01-30T20:00:03.523Z"}],"is_user_visible":true,"kernel":{"kernel_id":"ef737274-fff9-4164-b72b-88067613f822","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822"},"name":"Linux"},"kernel_version":{"kernel_version_id":"2450c462-66e0-4aca-97d4-9910a19996f6","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/kernels/ef737274-fff9-4164-b72b-88067613f822/versions/2450c462-66e0-4aca-97d4-9910a19996f6"},"sortable_version":["4","15","0"],"version":"4.15.0","provided_features":[{"feature":"Linux","is_activestate_version":false,"is_default_provider":true,"namespace":"kernel","sortable_version":["4","15","0"],"version":"4.15.0"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"libc":{"libc_id":"09a2eb42-ad34-4734-a93e-4b97395577df","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df"},"name":"glibc"},"libc_version":{"libc_version_id":"277c8630-948f-449c-9d69-5cf2ce3eb7eb","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/libcs/09a2eb42-ad34-4734-a93e-4b97395577df/versions/277c8630-948f-449c-9d69-5cf2ce3eb7eb"},"sortable_version":["2","17"],"version":"2.17","provided_features":[{"feature":"glibc","is_activestate_version":false,"is_default_provider":true,"namespace":"libc","sortable_version":["2","17"],"version":"2.17"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/platforms/0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a"},"operating_system":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99"},"operating_system_id":"7b3a2dbb-d543-48d6-8390-7e7b63751e99","has_libc":true,"name":"CentOS"},"operating_system_version":{"links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/operating-systems/7b3a2dbb-d543-48d6-8390-7e7b63751e99/versions/2cab2f48-fb0b-415f-85f8-ddd045969662"},"operating_system_version_id":"2cab2f48-fb0b-415f-85f8-ddd045969662","sortable_version":["7","6","1810"],"version":"7.6.1810","provided_features":[{"feature":"CentOS","is_activestate_version":false,"is_default_provider":true,"namespace":"operating-system","sortable_version":["7","6","1810"],"version":"7.6.1810"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true,"revision":1,"revision_timestamp":"2019-08-06T21:46:35.288Z"},"platform_id":"0fa42e8c-ac7b-5dd7-9407-8aa15f9b993a"},"recipe_id":"585b3357-14fa-58a8-96db-4f5aa602113e","recipe_store_timestamp":"2020-04-24T17:24:26.585Z","resolved_ingredients":[{"alternatives":["dd369889-16b0-54cd-afba-d728a046a06d","3e6b87ed-9e26-533b-a52c-a4b8fdf63d9d","4b58addf-2b8d-5aaf-82a8-26e1d3254fbf","5ae75a1f-f8fa-53f1-8ae2-dd8178ed0bfa","daaebcd8-5257-5a09-b465-811933dcbf7f","ab417a2b-817a-5e63-a2e8-37a523583f2d","04036655-15dd-51d1-9960-136c9a6362fb","027dc8d1-a3f3-5a84-9fc4-8427e2f8eb26","4b1d3022-e0e4-5712-8465-f079293a106b","27959e22-7e40-5773-94cb-9cb153634ed5","15d1bc46-a098-5605-9567-9c9c4d90c139","3c7b2306-4e8e-50e1-af45-e6a792c18de2","0a1a89f8-f1cd-539b-9d93-78a397554d55","ee9c369c-7cf8-596a-96e7-34657eecb88c","a83ef247-44b4-5b5e-9aa2-387ce6883473","ffad8bea-1902-5a72-88b4-6f65a534e983","dd9f1135-5d66-535e-9879-c5e6de540ab5","5cdb089d-9a96-5f59-8090-dcf27fc087a3","471f73ed-e484-580f-b193-5a0ab37868f6","f14f6343-d75b-575d-be41-b46c2816bc04","442603f4-4df6-5d00-b48b-64c686b12431","46e20268-dd9e-5846-92c1-0249e4027609","6695f243-5c22-5b89-8998-17f5ad116d43","77031f4b-5c5e-57da-a112-fd3fcdbeaada","762f875a-880c-5de4-9dbe-923c3c7d48b7","ed851561-e424-5568-bf97-1010bf2f6ee8","252eb7bc-e95b-591c-b946-b1de81ca9ad8","b5858882-da48-5a39-b763-cef92950137d","fc2cbe4c-e940-5159-a3aa-be38eca43c7b","1c12af61-fde7-596a-8dc5-ca77866dd9a4","cd6bbe3b-41d9-56c6-85a5-4dd835f0e184","67e717fa-97b9-543c-9edf-b9a92abae7d6"],"artifact_id":"29ee664e-709c-5785-a183-c3cdd0abf65b","build_scripts":null,"dependencies":[],"ingredient":{"creation_timestamp":"2019-10-21T19:16:38.749Z","ingredient_id":"20816534-c073-5d68-9eb7-11c1d6be09f5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/20816534-c073-5d68-9eb7-11c1d6be09f5"},"name":"camel","normalized_name":"camel","primary_namespace":"builder","description":"The camel unified build system","website":"https://platform.activestate.com"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2020-04-15T17:51:24.223Z","ingredient_id":"20816534-c073-5d68-9eb7-11c1d6be09f5","ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/20816534-c073-5d68-9eb7-11c1d6be09f5/versions/49530255-f4fa-5363-a4cc-2eb63cf5d6be","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/20816534-c073-5d68-9eb7-11c1d6be09f5"},"revision":1,"revision_timestamp":"2020-04-15T17:51:24.223Z","copyright_text":"Copyright © ActiveState Inc, 2004-2020","documentation_uri":"https://github.com/ActiveState/camel/tree/2a0758c3955df8e765c03c0f123a98435d611473/docs","is_binary_only":false,"license_expression":"UNLICENSED","release_timestamp":"2020-04-15T17:50:31.254Z","source_uri":"https://github.com/ActiveState/camel/tree/2a0758c3955df8e765c03c0f123a98435d611473","sortable_version":["20200415","135030","779230"],"version":"20200415.135030.2a0758c3","activestate_license_expression":"UNLICENSED","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://INVALID","scanner_license_expression":"UNLICENSED","source_checksum":"2a0758c3955df8e765c03c0f123a98435d611473","provided_features":[{"feature":"camel","is_activestate_version":false,"is_default_provider":true,"namespace":"builder","sortable_version":["20200415","135030","779230"],"version":"20200415.135030.2a0758c3"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"a5f0e5a0-133d-53b7-9047-683182945840","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:49:18.182Z","ingredient_id":"327b0673-5f5e-5b26-960d-a6fb18acd1c8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/327b0673-5f5e-5b26-960d-a6fb18acd1c8"},"name":"ActiveState-EULAs","normalized_name":"ActiveState-EULAs","primary_namespace":"internal","description":"ActiveState End-User License Agreements"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:49:18.182Z","ingredient_id":"327b0673-5f5e-5b26-960d-a6fb18acd1c8","ingredient_version_id":"e4d5b18c-89a9-561d-b99d-95bdd924735b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/327b0673-5f5e-5b26-960d-a6fb18acd1c8/versions/e4d5b18c-89a9-561d-b99d-95bdd924735b","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/327b0673-5f5e-5b26-960d-a6fb18acd1c8"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2019-06-05T00:00:00.000Z","source_uri":"https://s3.amazonaws.com/camel-sources/src/EULAs/main.tar.gz","sortable_version":["20170627","0"],"version":"20170627","activestate_license_expression":"unknown","camel_extras":{"does_not_install":"yes","dont_build":["yes"],"ppm_pkg":"no"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/internal/9d5b13269bf9b47c8778435d9c79f3cc8686ff667761c6e334e051a01a33053b/main.tar.gz","scanner_license_expression":"unknown","source_checksum":"9d5b13269bf9b47c8778435d9c79f3cc8686ff667761c6e334e051a01a33053b","provided_features":[{"feature":"ActiveState-EULAs","is_activestate_version":false,"is_default_provider":true,"namespace":"internal","sortable_version":["20170627","0"],"version":"20170627"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"ActiveState-EULAs","namespace":"internal","version_requirements":[{"comparator":"gte","version":"0"}]}]},{"alternatives":[],"artifact_id":"3b2088aa-3a85-5a54-8236-a8e285ec2fca","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:56:32.665Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"name":"perl","normalized_name":"perl","primary_namespace":"language","description":"Practical Extraction and Report Language"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:57:41.140Z","ingredient_id":"ed4b2154-eaee-5fba-88bb-d1eca86b1206","ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206/versions/d94f704f-ab76-5db3-a571-b9a019a1cc2a","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ed4b2154-eaee-5fba-88bb-d1eca86b1206"},"revision":12,"revision_timestamp":"2019-12-18T22:06:31.939Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"1970-01-01T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/S/SH/SHAY/perl-5.28.1.tar.gz","sortable_version":["5","28","1","0"],"version":"5.28.1","activestate_license_expression":"unknown","camel_extras":{"base64_binaries":["win32/perl.ico"],"cold_storage_dirs":{"src":"__SRC__"},"git_base":"63afdf6c0f65af480aa5bb9ccba9f46dae52f6fc v5.28.1","ppm_pkg":"no"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/languages/3ebf85fe65df2ee165b22596540b7d5d42f84d4b72d84834f74e2e0b8956c347/perl-5.28.1.tar.gz","scanner_license_expression":"unknown","source_checksum":"3ebf85fe65df2ee165b22596540b7d5d42f84d4b72d84834f74e2e0b8956c347","provided_features":[{"feature":"perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language","sortable_version":["5","28","1","0"],"version":"5.28.1"},{"feature":"Amiga::ARexx","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","4","0"],"version":"0.4"},{"feature":"Amiga::Exec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","0"],"version":"0.2"},{"feature":"AnyDBM_File::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"App::Cpan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","67","0"],"version":"1.67"},{"feature":"App::Prove","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"App::Prove::State","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"App::Prove::State::Result","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"App::Prove::State::Result::Test","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"Archive::Tar","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.30"},{"feature":"Archive::Tar::Constant","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.30"},{"feature":"Archive::Tar::File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","30","0"],"version":"2.30"},{"feature":"Attribute::Handlers","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"AutoLoader::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["5","74","0"],"version":"5.74"},{"feature":"AutoSplit::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","6","0"],"version":"1.6"},{"feature":"B::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","74","0"],"version":"1.74"},{"feature":"B::Concise","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"B::Debug","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","26","0"],"version":"1.26"},{"feature":"B::Deparse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","48","0"],"version":"1.48"},{"feature":"B::Op_private","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","28001","0"],"version":"5.28001"},{"feature":"B::Showlex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","5","0"],"version":"1.5"},{"feature":"B::Terse","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"B::Xref","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"Benchmark::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","22","0"],"version":"1.22"},{"feature":"CPAN::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.20"},{"feature":"CPAN::Author","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","2","0"],"version":"5.50.2"},{"feature":"CPAN::Bundle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","3","0"],"version":"5.50.3"},{"feature":"CPAN::CacheMgr","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","2","0"],"version":"5.50.2"},{"feature":"CPAN::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","1","0"],"version":"5.50.1"},{"feature":"CPAN::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","1","0"],"version":"5.50.1"},{"feature":"CPAN::DeferredCode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","0"],"version":"5.50"},{"feature":"CPAN::Distribution","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","19","0"],"version":"2.19"},{"feature":"CPAN::Distroprefs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","1","0"],"version":"6.1"},{"feature":"CPAN::Distrostatus","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::Exception::RecursiveDependency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","1","0"],"version":"5.50.1"},{"feature":"CPAN::Exception::blocked_urllist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"CPAN::Exception::yaml_not_installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::Exception::yaml_process_error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::FTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","11","0"],"version":"5.50.11"},{"feature":"CPAN::FTP::netrc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"CPAN::FirstTime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","53","11","0"],"version":"5.53.11"},{"feature":"CPAN::HTTP::Client","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","96","1","0"],"version":"1.96.1"},{"feature":"CPAN::HTTP::Credentials","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","96","1","0"],"version":"1.96.1"},{"feature":"CPAN::HandleConfig","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","8","0"],"version":"5.50.8"},{"feature":"CPAN::Index","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","12","0"],"version":"2.12"},{"feature":"CPAN::InfoObj","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::Kwalify","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["5","50","0"],"version":"5.50"},{"feature":"CPAN::LWP::UserAgent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","96","1","0"],"version":"1.96.1"},{"feature":"CPAN::Meta","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Converter","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Feature","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::History","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Merge","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Prereqs","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Requirements","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","140","0"],"version":"2.140"},{"feature":"CPAN::Meta::Spec","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::Validator","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"CPAN::Meta::YAML","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","18","0"],"version":"0.18"},{"feature":"CPAN::Mirrors","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","12","0"],"version":"2.12"},{"feature":"CPAN::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","3","0"],"version":"5.50.3"},{"feature":"CPAN::Nox","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","1","0"],"version":"5.50.1"},{"feature":"CPAN::Plugin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","96","0"],"version":"0.96"},{"feature":"CPAN::Plugin::Specfile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","1","0"],"version":"0.1"},{"feature":"CPAN::Prompt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::Queue","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","2","0"],"version":"5.50.2"},{"feature":"CPAN::Shell","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","7","0"],"version":"5.50.7"},{"feature":"CPAN::Tarzip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","12","0"],"version":"5.50.12"},{"feature":"CPAN::URL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","5","0"],"version":"5.5"},{"feature":"CPAN::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","50","3","0"],"version":"5.50.3"},{"feature":"Carp::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.50"},{"feature":"Class::Struct","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","65","0"],"version":"0.65"},{"feature":"Compress::Raw::Bzip2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"Compress::Raw::Zlib","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","76","0"],"version":"2.76"},{"feature":"Compress::Zlib","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"Config::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0"],"version":"1"},{"feature":"Config::Extensions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","0"],"version":"0.2"},{"feature":"Config::Perl::V","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","29","0"],"version":"0.29"},{"feature":"Cwd::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"DB::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"DBM_Filter::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","6","0"],"version":"0.6"},{"feature":"DBM_Filter::compress","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"DBM_Filter::encode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"DBM_Filter::int32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"DBM_Filter::null","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"DBM_Filter::utf8","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"DB_File::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","840","0"],"version":"1.840"},{"feature":"Data::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","170","0"],"version":"2.170"},{"feature":"Demo::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Descriptions::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Devel::PPPort","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","40","0"],"version":"3.40"},{"feature":"Devel::Peek","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","27","0"],"version":"1.27"},{"feature":"Devel::SelfStubber","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","6","0"],"version":"1.6"},{"feature":"Digest::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","17","1","0"],"version":"1.17.1"},{"feature":"Digest::MD5","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","55","0"],"version":"2.55"},{"feature":"Digest::SHA","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["6","1","0"],"version":"6.1"},{"feature":"Digest::base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","16","0"],"version":"1.16"},{"feature":"Digest::file","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","16","0"],"version":"1.16"},{"feature":"DirHandle::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","5","0"],"version":"1.5"},{"feature":"Dumpvalue::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","18","0"],"version":"1.18"},{"feature":"DynaLoader::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","45","0"],"version":"1.45"},{"feature":"Encode::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","97","0"],"version":"2.97"},{"feature":"Encode::Alias","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","24","0"],"version":"2.24"},{"feature":"Encode::Byte","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","4","0"],"version":"2.4"},{"feature":"Encode::CJKConstants","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","2","0"],"version":"2.2"},{"feature":"Encode::CN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Encode::CN::HZ","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","10","0"],"version":"2.10"},{"feature":"Encode::Config","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","5","0"],"version":"2.5"},{"feature":"Encode::EBCDIC","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","2","0"],"version":"2.2"},{"feature":"Encode::Encoder","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Encode::Encoding","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","8","0"],"version":"2.8"},{"feature":"Encode::GSM0338","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"Encode::Guess","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"Encode::JP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","4","0"],"version":"2.4"},{"feature":"Encode::JP::H2Z","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","2","0"],"version":"2.2"},{"feature":"Encode::JP::JIS7","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","8","0"],"version":"2.8"},{"feature":"Encode::KR","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Encode::KR::2022_KR","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","4","0"],"version":"2.4"},{"feature":"Encode::MIME::Header","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","28","0"],"version":"2.28"},{"feature":"Encode::MIME::Header::ISO_2022_JP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","9","0"],"version":"1.9"},{"feature":"Encode::MIME::Name","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Encode::Symbol","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","2","0"],"version":"2.2"},{"feature":"Encode::TW","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Encode::Unicode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","17","0"],"version":"2.17"},{"feature":"Encode::Unicode::UTF7","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","10","0"],"version":"2.10"},{"feature":"English::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.10"},{"feature":"Env::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"Errno::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0"],"version":"1"},{"feature":"Exporter::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["5","73","0"],"version":"5.73"},{"feature":"ExtUtils::CBuilder","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Unix","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::VMS","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::BCC","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::GCC","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::MSVC","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::aix","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::android","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::cygwin","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::darwin","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::dec_osf","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::os2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Command::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Constant","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","25","0"],"version":"0.25"},{"feature":"ExtUtils::Constant::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","6","0"],"version":"0.6"},{"feature":"ExtUtils::Constant::ProxySubs","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","9","0"],"version":"0.9"},{"feature":"ExtUtils::Constant::Utils","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","4","0"],"version":"0.4"},{"feature":"ExtUtils::Constant::XS","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"ExtUtils::Embed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","35","1","0"],"version":"1.35.1"},{"feature":"ExtUtils::Install","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils::Installed","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils::Liblist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Liblist::Kid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_AIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Any","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_BeOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_DOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_NW5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_UWIN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MM_Win95","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MakeMaker::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MakeMaker::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MakeMaker::version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::MakeMaker::version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Manifest","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.70"},{"feature":"ExtUtils::Miniperl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"ExtUtils::Mkbootstrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Mksymlists","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"ExtUtils::Packlist","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils::ParseXS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","39","0"],"version":"3.39"},{"feature":"ExtUtils::ParseXS::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","39","0"],"version":"3.39"},{"feature":"ExtUtils::ParseXS::CountLines","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","39","0"],"version":"3.39"},{"feature":"ExtUtils::ParseXS::Eval","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","39","0"],"version":"3.39"},{"feature":"ExtUtils::ParseXS::Utilities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","39","0"],"version":"3.39"},{"feature":"ExtUtils::Typemaps","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","38","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","38","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::InputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","38","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::OutputMap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","38","0"],"version":"3.38"},{"feature":"ExtUtils::Typemaps::Type","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","38","0"],"version":"3.38"},{"feature":"ExtUtils::XSSymSet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"ExtUtils::testlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","34","0"],"version":"7.34"},{"feature":"Fatal::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"Fcntl::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","13","0"],"version":"1.13"},{"feature":"File::Basename","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","85","0"],"version":"2.85"},{"feature":"File::Compare","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","6","0"],"version":"1.10.6"},{"feature":"File::Copy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","33","0"],"version":"2.33"},{"feature":"File::DosGlob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","12","0"],"version":"1.12"},{"feature":"File::Fetch","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","56","0"],"version":"0.56"},{"feature":"File::Find","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","34","0"],"version":"1.34"},{"feature":"File::Glob","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","31","0"],"version":"1.31"},{"feature":"File::GlobMapper","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"File::Path","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0"],"version":"2.15"},{"feature":"File::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::AmigaOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Epoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Spec::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","74","0"],"version":"3.74"},{"feature":"File::Temp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","23","4","0"],"version":"0.23.4"},{"feature":"File::stat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"FileCache::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.10"},{"feature":"FileHandle::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Filter::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","95","0"],"version":"0.95"},{"feature":"Filter::Util::Call","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","58","0"],"version":"1.58"},{"feature":"FindBin::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","51","0"],"version":"1.51"},{"feature":"GDBM_File::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","17","0"],"version":"1.17"},{"feature":"Getopt::Long","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.50"},{"feature":"Getopt::Std","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","12","0"],"version":"1.12"},{"feature":"HTTP::Tiny","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","70","0"],"version":"0.70"},{"feature":"Hash::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","22","0"],"version":"0.22"},{"feature":"Hash::Util::FieldHash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.20"},{"feature":"I18N::Collate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"I18N::LangTags","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","43","0"],"version":"0.43"},{"feature":"I18N::LangTags::Detect","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"I18N::LangTags::List","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","40","0"],"version":"0.40"},{"feature":"I18N::Langinfo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","17","0"],"version":"0.17"},{"feature":"IO::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Compress::Adapter::Bzip2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Adapter::Deflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Adapter::Identity","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Base::Common","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Bzip2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Deflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Gzip","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Gzip::Constants","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::RawDeflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Zip","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Zip::Constants","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Zlib::Constants","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Compress::Zlib::Extra","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Dir","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Handle","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Pipe","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Poll","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Seekable","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Select","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Socket","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Socket::INET","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Socket::IP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","39","0"],"version":"0.39"},{"feature":"IO::Socket::UNIX","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"IO::Uncompress::Adapter::Bunzip2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Adapter::Identity","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Adapter::Inflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::AnyInflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::AnyUncompress","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Bunzip2","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Gunzip","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Inflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::RawInflate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Uncompress::Unzip","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","74","0"],"version":"2.74"},{"feature":"IO::Zlib","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.10"},{"feature":"IPC::Cmd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"IPC::Msg","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"IPC::Open2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"IPC::Open3","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.20"},{"feature":"IPC::Semaphore","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"IPC::SharedMem","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"IPC::SysV","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"JSON::PP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","97","1","0"],"version":"2.97.1"},{"feature":"JSON::PP::Boolean","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","97001","0"],"version":"2.97001"},{"feature":"List::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.50"},{"feature":"List::Util::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.50"},{"feature":"Locale::Codes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::Constants","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::Country","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::Currency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::LangExt","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::LangFam","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::LangVar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::Language","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Codes::Script","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Country","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Currency","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Language","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"Locale::Maketext","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","29","0"],"version":"1.29"},{"feature":"Locale::Maketext::Guts","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.20"},{"feature":"Locale::Maketext::GutsLoader","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","20","0"],"version":"1.20"},{"feature":"Locale::Maketext::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","21","1","0"],"version":"0.21.1"},{"feature":"Locale::Script","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","56","0"],"version":"3.56"},{"feature":"MIME::Base64","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","15","0"],"version":"3.15"},{"feature":"MIME::QuotedPrint","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","13","0"],"version":"3.13"},{"feature":"Math::BigFloat","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","99","98","11","0"],"version":"1.99.98.11"},{"feature":"Math::BigFloat::Trace","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","49","0"],"version":"0.49"},{"feature":"Math::BigInt","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","99","98","11","0"],"version":"1.99.98.11"},{"feature":"Math::BigInt::Calc","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","99","98","11","0"],"version":"1.99.98.11"},{"feature":"Math::BigInt::CalcEmu","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","99","98","11","0"],"version":"1.99.98.11"},{"feature":"Math::BigInt::FastCalc","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","50","6","0"],"version":"0.50.6"},{"feature":"Math::BigInt::Lib","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","99","98","11","0"],"version":"1.99.98.11"},{"feature":"Math::BigInt::Trace","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","49","0"],"version":"0.49"},{"feature":"Math::BigRat","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","26","13","0"],"version":"0.26.13"},{"feature":"Math::Complex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","59","1","0"],"version":"1.59.1"},{"feature":"Math::Trig","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","23","0"],"version":"1.23"},{"feature":"Memoize::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","1","0"],"version":"1.3.1"},{"feature":"Memoize::AnyDBM_File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::Expire","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::ExpireFile","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::ExpireTest","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::NDBM_File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::SDBM_File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Memoize::Storable","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Module::CoreList","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","20181129","28","0"],"version":"5.20181129.28"},{"feature":"Module::CoreList::Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","20181129","28","0"],"version":"5.20181129.28"},{"feature":"Module::Load","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","32","0"],"version":"0.32"},{"feature":"Module::Load::Conditional","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","68","0"],"version":"0.68"},{"feature":"Module::Loaded","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","8","0"],"version":"0.8"},{"feature":"Module::Metadata","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","33","0"],"version":"1.33"},{"feature":"MyClass::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"NDBM_File::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","14","0"],"version":"1.14"},{"feature":"NEXT::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","67","1","0"],"version":"0.67.1"},{"feature":"Net::Cmd","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::Config","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::Domain","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP::A","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP::E","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP::I","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP::L","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::FTP::dataconn","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::NNTP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::Netrc","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::POP3","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::Ping","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","62","0"],"version":"2.62"},{"feature":"Net::SMTP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::Time","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","11","0"],"version":"3.11"},{"feature":"Net::hostent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"Net::netent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"Net::protoent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"Net::servent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"O::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"ODBM_File::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","15","0"],"version":"1.15"},{"feature":"Opcode::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","43","0"],"version":"1.43"},{"feature":"POSIX::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","84","0"],"version":"1.84"},{"feature":"Params::Check","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","38","0"],"version":"0.38"},{"feature":"Parse::CPAN::Meta","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","15","0","10","0"],"version":"2.15.0.10"},{"feature":"Perl::OSType","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.10"},{"feature":"PerlIO::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","10","0"],"version":"1.10"},{"feature":"PerlIO::encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","26","0"],"version":"0.26"},{"feature":"PerlIO::mmap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","16","0"],"version":"0.16"},{"feature":"PerlIO::scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","29","0"],"version":"0.29"},{"feature":"PerlIO::via","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","17","0"],"version":"0.17"},{"feature":"PerlIO::via::QuotedPrint","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","8","0"],"version":"0.8"},{"feature":"Pod::Checker","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"Pod::Escapes","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"Pod::Find","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","63","0"],"version":"1.63"},{"feature":"Pod::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","13","0"],"version":"1.13"},{"feature":"Pod::Html","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","24","0"],"version":"1.24"},{"feature":"Pod::InputObjects","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","63","0"],"version":"1.63"},{"feature":"Pod::Man","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::ParseLink","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::ParseUtils","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","63","0"],"version":"1.63"},{"feature":"Pod::Parser","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","63","0"],"version":"1.63"},{"feature":"Pod::Perldoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","28","1","0"],"version":"3.28.1"},{"feature":"Pod::Perldoc::BaseTo","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::GetOptsOO","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToANSI","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToChecker","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToMan","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToNroff","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToPod","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToRtf","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTerm","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToText","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToTk","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::Perldoc::ToXml","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","28","0"],"version":"3.28"},{"feature":"Pod::PlainText","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","7","0"],"version":"2.7"},{"feature":"Pod::Select","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","63","0"],"version":"1.63"},{"feature":"Pod::Simple","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::BlackBox","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Checker","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Debug","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::DumpAsText","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::DumpAsXML","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::HTML","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::HTMLBatch","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::HTMLLegacy","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["5","1","0"],"version":"5.1"},{"feature":"Pod::Simple::LinkSection","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Methody","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Progress","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::PullParser","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::PullParserEndToken","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::PullParserStartToken","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::PullParserTextToken","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::PullParserToken","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::RTF","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Search","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::SimpleTree","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Text","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::TextContent","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::TiedOutFH","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::Transcode","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::TranscodeDumb","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::TranscodeSmart","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::XHTML","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Simple::XMLOutStream","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","35","0"],"version":"3.35"},{"feature":"Pod::Text","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::Text::Color","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::Text::Overstrike","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::Text::Termcap","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","10","0"],"version":"4.10"},{"feature":"Pod::Usage","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","69","0"],"version":"1.69"},{"feature":"SDBM_File::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","14","0"],"version":"1.14"},{"feature":"Safe::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","40","0"],"version":"2.40"},{"feature":"Scalar::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.50"},{"feature":"Search::Dict","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"SelectSaver::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"SelfLoader::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Socket::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","27","0"],"version":"2.27"},{"feature":"Storable::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","8","0"],"version":"3.8"},{"feature":"Sub::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","50","0"],"version":"1.50"},{"feature":"Symbol::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"Sys::Hostname","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","22","1","0"],"version":"1.22.1"},{"feature":"Sys::Syslog","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","35","0"],"version":"0.35"},{"feature":"TAP::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Base","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Color","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Console","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Console::ParallelSession","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Console::Session","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::File::Session","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Formatter::Session","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Harness","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Harness::Env","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Object","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Aggregator","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Grammar","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Iterator","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Iterator::Array","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Iterator::Process","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Iterator::Stream","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::IteratorFactory","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Multiplexer","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Bailout","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Comment","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Plan","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Pragma","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Test","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Unknown","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::Version","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Result::YAML","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::ResultFactory","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Scheduler","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Scheduler::Job","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Scheduler::Spinner","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::Source","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler::Executable","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler::File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler::Handle","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler::Perl","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::SourceHandler::RawTAP","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::YAMLish::Reader","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"TAP::Parser::YAMLish::Writer","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"Term::ANSIColor","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","6","0"],"version":"4.6"},{"feature":"Term::Cap","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","17","0"],"version":"1.17"},{"feature":"Term::Complete","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","403","0"],"version":"1.403"},{"feature":"Term::ReadLine","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","17","0"],"version":"1.17"},{"feature":"Test2::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::API::Breakage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::API::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::API::Instance","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::API::Stack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Bail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Diag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Fail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Note","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Pass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::TAP::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::V2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Event::Waiting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::About","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Amnesty","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Assert","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Control","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Render","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::EventFacet::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Formatter::TAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Hub::Interceptor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Hub::Interceptor::Terminator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Hub::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::IPC::Driver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::IPC::Driver::Files","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Tools::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Util::ExternalMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Util::Facets2Legacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test2::Util::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","31","0"],"version":"1.31"},{"feature":"Test::Builder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Builder::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Builder::IO::Scalar","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","114","0"],"version":"2.114"},{"feature":"Test::Builder::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Builder::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Builder::Tester::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Builder::TodoDiag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Harness","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","42","0"],"version":"3.42"},{"feature":"Test::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Tester::Capture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Tester::CaptureRunner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::Tester::Delegate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Test::use::ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"Text::Abbrev","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"Text::Balanced","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","3","0"],"version":"2.3"},{"feature":"Text::ParseWords","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","30","0"],"version":"3.30"},{"feature":"Text::Tabs","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2013","523","0"],"version":"2013.523"},{"feature":"Text::Wrap","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2013","523","0"],"version":"2013.523"},{"feature":"Thread::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","4","0"],"version":"3.4"},{"feature":"Thread::Queue","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["3","12","0"],"version":"3.12"},{"feature":"Thread::Semaphore","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","13","0"],"version":"2.13"},{"feature":"Tie::Array","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"Tie::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"Tie::Handle","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["4","2","0"],"version":"4.2"},{"feature":"Tie::Hash","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","5","0"],"version":"1.5"},{"feature":"Tie::Hash::NamedCapture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10","0"],"version":"0.10"},{"feature":"Tie::Memoize","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"Tie::RefHash","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","39","0"],"version":"1.39"},{"feature":"Tie::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"Tie::StdHandle","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","5","0"],"version":"4.5"},{"feature":"Tie::SubstrHash","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"Time::HiRes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","97","59","0"],"version":"1.97.59"},{"feature":"Time::Local","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Time::Piece","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","32","4","0"],"version":"1.32.4"},{"feature":"Time::Seconds","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","32","4","0"],"version":"1.32.4"},{"feature":"Time::gmtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"Time::localtime","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"Time::tm","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"UNIVERSAL::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","13","0"],"version":"1.13"},{"feature":"Unicode::Collate","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::Big5","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::GB2312","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::JISX0208","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::Korean","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::Pinyin","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::Stroke","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::CJK::Zhuyin","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Collate::Locale","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","25","0"],"version":"1.25"},{"feature":"Unicode::Normalize","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","26","0"],"version":"1.26"},{"feature":"Unicode::UCD","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","70","0"],"version":"0.70"},{"feature":"User::grent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"User::pwent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"VMS::DCLsym","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","9","0"],"version":"1.9"},{"feature":"VMS::Filespec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","12","0"],"version":"1.12"},{"feature":"VMS::Stdio","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","44","0"],"version":"2.44"},{"feature":"Win32::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","52","0"],"version":"0.52"},{"feature":"Win32API::File","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","12","3","0"],"version":"0.12.3"},{"feature":"Win32CORE::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","4","0"],"version":"0.4"},{"feature":"XS::APItest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","98","0"],"version":"0.98"},{"feature":"XS::Typemap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","16","0"],"version":"0.16"},{"feature":"XSLoader::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","0"],"version":"0.30"},{"feature":"_charnames::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","45","0"],"version":"1.45"},{"feature":"arybase::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15","0"],"version":"0.15"},{"feature":"attributes::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","33","0"],"version":"0.33"},{"feature":"autodie::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autodie::Scope::Guard","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autodie::Scope::GuardStack","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autodie::Util","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autodie::exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","29002","0"],"version":"2.29002"},{"feature":"autodie::exception::system","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autodie::hints","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","29001","0"],"version":"2.29001"},{"feature":"autodie::skip","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["2","29","0"],"version":"2.29"},{"feature":"autouse::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","11","0"],"version":"1.11"},{"feature":"base::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","27","0"],"version":"2.27"},{"feature":"bigint::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","49","0"],"version":"0.49"},{"feature":"bignum::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","49","0"],"version":"0.49"},{"feature":"bigrat::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","49","0"],"version":"0.49"},{"feature":"blib::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","7","0"],"version":"1.7"},{"feature":"bytes::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","6","0"],"version":"1.6"},{"feature":"charnames::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","45","0"],"version":"1.45"},{"feature":"constant::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","33","0"],"version":"1.33"},{"feature":"deprecate::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"diagnostics::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","36","0"],"version":"1.36"},{"feature":"encoding::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","22","0"],"version":"2.22"},{"feature":"encoding::warnings","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","13","0"],"version":"0.13"},{"feature":"experimental::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","19","0"],"version":"0.19"},{"feature":"feature::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","52","0"],"version":"1.52"},{"feature":"fields::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","24","0"],"version":"2.24"},{"feature":"filetest::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"if::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","608","0"],"version":"0.608"},{"feature":"integer::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","1","0"],"version":"1.1"},{"feature":"less::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","0"],"version":"0.3"},{"feature":"lib::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","64","0"],"version":"0.64"},{"feature":"locale::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","9","0"],"version":"1.9"},{"feature":"mro::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","22","0"],"version":"1.22"},{"feature":"ok::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","21","33","0"],"version":"1.30.21.33"},{"feature":"open::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","11","0"],"version":"1.11"},{"feature":"ops::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","2","0"],"version":"1.2"},{"feature":"overload::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","30","0"],"version":"1.30"},{"feature":"overloading::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2","0"],"version":"0.2"},{"feature":"parent::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","236","0"],"version":"0.236"},{"feature":"perlfaq::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["5","21011","0"],"version":"5.21011"},{"feature":"re::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","36","0"],"version":"0.36"},{"feature":"sigtrap::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","8","0"],"version":"1.8"},{"feature":"sort::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","4","0"],"version":"2.4"},{"feature":"strict::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","11","0"],"version":"1.11"},{"feature":"subs::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","3","0"],"version":"1.3"},{"feature":"threads::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","22","0"],"version":"2.22"},{"feature":"threads::shared","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["1","58","0"],"version":"1.58"},{"feature":"utf8::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","21","0"],"version":"1.21"},{"feature":"vars::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"version::","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","99","23","0"],"version":"0.99.23"},{"feature":"version::regex","is_activestate_version":false,"is_default_provider":false,"namespace":"language/perl","sortable_version":["0","99","23","0"],"version":"0.99.23"},{"feature":"vmsish::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"},{"feature":"warnings::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","42","0"],"version":"1.42"},{"feature":"warnings::register","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-12-18T22:06:26.788Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/cb5b6720-82e5-4546-a99a-9d39332c51af"},"patch_id":"cb5b6720-82e5-4546-a99a-9d39332c51af","conditions":null,"content":"s3://platform-sources/patches/d251ddaed91891b7b619b5d89d1bac3cb55b59bb1cda04791cc0da2cfec7c212.patch","description":"ActivePerl ~ ActivePerl 5.28 patch","sequence_number":1}],"resolved_requirements":[{"feature":"perl","namespace":"language","version_requirements":[{"comparator":"eq","version":"5.28.1"}]}]},{"alternatives":[],"artifact_id":"acb500a5-af3d-553c-bf07-4fde842cc44e","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:49:19.077Z","ingredient_id":"4c46f01f-87de-5ae2-bb45-58201d461e51","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c46f01f-87de-5ae2-bb45-58201d461e51"},"name":"ActiveState-RelocateTree","normalized_name":"ActiveState-RelocateTree","primary_namespace":"language/perl","description":"Move perl distribution to new location"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:49:19.077Z","ingredient_id":"4c46f01f-87de-5ae2-bb45-58201d461e51","ingredient_version_id":"d8b90b31-e26a-5e2f-81c7-1225e8a0a8f2","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c46f01f-87de-5ae2-bb45-58201d461e51/versions/d8b90b31-e26a-5e2f-81c7-1225e8a0a8f2","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4c46f01f-87de-5ae2-bb45-58201d461e51"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2009-05-06T17:15:51.000Z","source_uri":"https://s3.amazonaws.com/camel-sources/src/as-mod/ActiveState-RelocateTree/main.tar.gz","sortable_version":["1","4","0"],"version":"1.4","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"ActiveState/RelocateTree"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/ab994200dced4d26e41332754e863a902a8689753622229d73bf4b9b42eef1dd/main.tar.gz","scanner_license_expression":"unknown","source_checksum":"ab994200dced4d26e41332754e863a902a8689753622229d73bf4b9b42eef1dd","provided_features":[{"feature":"ActiveState-RelocateTree","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","4","0"],"version":"1.4"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"ActiveState-RelocateTree","namespace":"language/perl","version_requirements":[{"comparator":"gte","version":"0"}]}]},{"alternatives":[],"artifact_id":"ef438bc7-bf38-5537-85f3-9ff07e715128","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"06d43cc3-8f67-575b-b34d-0ec60e9ae67e"},{"dependency_types":["build"],"ingredient_version_id":"1a882ae6-d86f-5431-a5cb-8caa0abeedf5"},{"dependency_types":["build"],"ingredient_version_id":"1cb4ca5e-4e4e-59fb-b2cb-5fdb54856ff0"},{"dependency_types":["build"],"ingredient_version_id":"3e08c8d3-fe88-5c33-82df-ded1e3d15a0b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"5b9149e8-2334-5454-a523-cd9787003344"},{"dependency_types":["build","runtime"],"ingredient_version_id":"84a01b55-1d92-53ae-a7cb-d591b7b54724"},{"dependency_types":["build"],"ingredient_version_id":"91cd893b-5b8c-5391-9c77-643fb85af0af"},{"dependency_types":["build"],"ingredient_version_id":"e4b6a074-ad51-5b69-95ce-7747c95471f8"},{"dependency_types":["runtime"],"ingredient_version_id":"f53173d3-f084-5b6f-927e-6db8c13aac9c"}],"ingredient":{"creation_timestamp":"2019-10-01T16:49:20.357Z","ingredient_id":"70829de1-9690-5b85-8d6f-1c5746a362e7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/70829de1-9690-5b85-8d6f-1c5746a362e7"},"name":"ActiveState-Test","normalized_name":"ActiveState-Test","primary_namespace":"language/perl","description":"ActiveState's Test modules"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:49:20.357Z","ingredient_id":"70829de1-9690-5b85-8d6f-1c5746a362e7","ingredient_version_id":"cf00c298-f30f-5900-8c36-6e9041654afc","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/70829de1-9690-5b85-8d6f-1c5746a362e7/versions/cf00c298-f30f-5900-8c36-6e9041654afc","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/70829de1-9690-5b85-8d6f-1c5746a362e7"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2013-04-28T14:16:37.000Z","source_uri":"https://s3.amazonaws.com/camel-sources/src/as-mod/ActiveState-Test/main.tar.gz","sortable_version":["1","0","0"],"version":"1.0","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"ActiveState/Test"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/565a38e09a10f3ae09afafaf29c01d60620c31c31b936d219e61c78c7aecbc57/main.tar.gz","scanner_license_expression":"unknown","source_checksum":"565a38e09a10f3ae09afafaf29c01d60620c31c31b936d219e61c78c7aecbc57","provided_features":[{"feature":"ActiveState-Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"ActiveState::Test","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","0","0"],"version":"1.0"},{"feature":"ActiveState::Test::DBI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","1","0"],"version":"0.1"},{"feature":"ActiveState::Test::X11Server","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","1","0"],"version":"0.1"},{"feature":"ActiveState::Test::X11Server::Impl::Managed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","1","0"],"version":"0.1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"ActiveState-Test","namespace":"language/perl","version_requirements":[{"comparator":"gte","version":"0"}]}]},{"alternatives":[],"artifact_id":"84a58839-2df8-5e4d-ab88-f44c991e2539","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"a873d528-56e8-5c19-b5cb-383be3bb9074"},{"dependency_types":["build"],"ingredient_version_id":"cf00c298-f30f-5900-8c36-6e9041654afc"},{"dependency_types":["runtime"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"},{"dependency_types":["build","runtime"],"ingredient_version_id":"f53173d3-f084-5b6f-927e-6db8c13aac9c"}],"ingredient":{"creation_timestamp":"2019-10-01T16:50:32.819Z","ingredient_id":"a65130b8-7a66-5e74-aaad-ed3b2ce8f039","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a65130b8-7a66-5e74-aaad-ed3b2ce8f039"},"name":"DBD-Pg","normalized_name":"DBD-Pg","primary_namespace":"language/perl","description":"DBI PostgreSQL interface"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:50:32.819Z","ingredient_id":"a65130b8-7a66-5e74-aaad-ed3b2ce8f039","ingredient_version_id":"6e9c11f1-db6a-536e-b607-0e1aa95dceb0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a65130b8-7a66-5e74-aaad-ed3b2ce8f039/versions/6e9c11f1-db6a-536e-b607-0e1aa95dceb0","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/a65130b8-7a66-5e74-aaad-ed3b2ce8f039"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-Perl OR GPL-1.0-or-later","release_timestamp":"2017-09-24T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/T/TU/TURNSTEP/DBD-Pg-3.7.0.tar.gz","sortable_version":["3","7","0","0"],"version":"3.7.0","activestate_license_expression":"unknown","camel_extras":{"dont_build":["hpux","solaris"],"mm_fullext":"DBD/Pg"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/e36e0459c9cf0f12edafb74f4cef685876d0460dbe6b411e7109070c67e56459/DBD-Pg-3.7.0.tar.gz","scanner_license_expression":"unknown","source_checksum":"e36e0459c9cf0f12edafb74f4cef685876d0460dbe6b411e7109070c67e56459","provided_features":[{"feature":"Bundle::DBD::Pg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","7","0","0"],"version":"3.7.0"},{"feature":"DBD-Pg","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","7","0","0"],"version":"3.7.0"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-10-01T16:50:30.233Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/5973ce13-45fb-4d96-a936-99de317bac86"},"patch_id":"5973ce13-45fb-4d96-a936-99de317bac86","conditions":null,"content":"DBD-Pg/3.7.0/0001-Add-a-very-simple-test-of-SSL-connections.patch","description":"[PATCH 1/7] Add a very simple test of SSL connections","sequence_number":1},{"creation_timestamp":"2019-10-01T16:50:30.584Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/37b9955e-9cce-444d-a218-84ea8a474254"},"patch_id":"37b9955e-9cce-444d-a218-84ea8a474254","conditions":null,"content":"DBD-Pg/3.7.0/0002-Add-an-AS-MAKEFILE.PL.patch","description":"[PATCH 2/7] Add an AS-MAKEFILE.PL\n\nThis file figures out what Pg server to connect to. It also sets the\nPOSTGRES_LIB env var to something that works for our build systems.","sequence_number":2},{"creation_timestamp":"2019-10-01T16:50:30.944Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/25720922-dcda-469d-a201-f9febb40e036"},"patch_id":"25720922-dcda-469d-a201-f9febb40e036","conditions":null,"content":"DBD-Pg/3.7.0/0003-Speed-up-test-which-runs-16k-SQL-statements.patch","description":"[PATCH 3/7] Speed up test which runs 16k SQL statements","sequence_number":3},{"creation_timestamp":"2019-10-01T16:50:31.306Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/ae975b82-2282-41b2-9551-5e87f9377604"},"patch_id":"ae975b82-2282-41b2-9551-5e87f9377604","conditions":null,"content":"DBD-Pg/3.7.0/0004-Don-t-quote-POSTGRES_LIB-on-Win32-and-skip-EXTRALIBS.patch","description":"[PATCH 4/7] Don't quote POSTGRES_LIB on Win32 and skip EXTRALIBS\n check","sequence_number":4},{"creation_timestamp":"2019-10-01T16:50:31.667Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/e5b252f2-0818-4397-bddb-20ea3707fb7b"},"patch_id":"e5b252f2-0818-4397-bddb-20ea3707fb7b","conditions":null,"content":"DBD-Pg/3.7.0/0005-Skip-alarm-using-test-on-Windows.patch","description":"[PATCH 5/7] Skip alarm-using test on Windows","sequence_number":5},{"creation_timestamp":"2019-10-01T16:50:32.023Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/0072ac8b-0163-47dd-9df7-ef9dee883b6f"},"patch_id":"0072ac8b-0163-47dd-9df7-ef9dee883b6f","conditions":null,"content":"DBD-Pg/3.7.0/0006-Skip-tests-for-lost-network-connections-that-fail-on.patch","description":"[PATCH 6/7] Skip tests for lost network connections that fail on\n Win32","sequence_number":6},{"creation_timestamp":"2019-10-01T16:50:32.384Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/cf9ab8f0-66cf-4d91-b1eb-7e993961bf92"},"patch_id":"cf9ab8f0-66cf-4d91-b1eb-7e993961bf92","conditions":null,"content":"DBD-Pg/3.7.0/0007-Rollup-patches-only-set-up-test-env-if-we-are-runnin.patch","description":"[PATCH 7/7] Rollup patches, only set up test env if we are running\n tests","sequence_number":7}],"resolved_requirements":[{"feature":"DBD-Pg","namespace":"language/perl","version_requirements":[{"comparator":"eq","version":"3.7.0"}]}]},{"alternatives":["23d7bf13-cc36-57ae-8c6a-779f7db8f7db"],"artifact_id":"4ed1a6b5-2310-5da2-9342-2b99c8ad2651","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:50:47.461Z","ingredient_id":"15f71af1-b236-5bdf-aa8a-057151757c0e","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15f71af1-b236-5bdf-aa8a-057151757c0e"},"name":"DBI","normalized_name":"DBI","primary_namespace":"language/perl","description":"Database independent interface for Perl"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:50:48.296Z","ingredient_id":"15f71af1-b236-5bdf-aa8a-057151757c0e","ingredient_version_id":"f53173d3-f084-5b6f-927e-6db8c13aac9c","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15f71af1-b236-5bdf-aa8a-057151757c0e/versions/f53173d3-f084-5b6f-927e-6db8c13aac9c","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/15f71af1-b236-5bdf-aa8a-057151757c0e"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2018-10-29T00:00:00.000Z","source_uri":"https://cpan.metacpan.org/authors/id/T/TI/TIMB/DBI-1.642.tar.gz","sortable_version":["1","642","0"],"version":"1.642","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"DBI"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/3f2025023a56286cebd15cb495e36ccd9b456c3cc229bf2ce1f69e9ebfc27f5d/DBI-1.642.tar.gz","scanner_license_expression":"unknown","source_checksum":"3f2025023a56286cebd15cb495e36ccd9b456c3cc229bf2ce1f69e9ebfc27f5d","provided_features":[{"feature":"Bundle::DBI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["12","8696","0"],"version":"12.8696"},{"feature":"DBD::DBM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","8","0"],"version":"0.8"},{"feature":"DBD::File","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","44","0"],"version":"0.44"},{"feature":"DBD::Gofer::Policy::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Policy::classic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Policy::pedantic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Policy::rush","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Transport::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","14121","0"],"version":"0.14121"},{"feature":"DBD::Gofer::Transport::null","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Transport::pipeone","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10088","0"],"version":"0.10088"},{"feature":"DBD::Gofer::Transport::stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","14599","0"],"version":"0.14599"},{"feature":"DBD::Mem","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","1","0"],"version":"0.1"},{"feature":"DBD::Proxy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","2004","0"],"version":"0.2004"},{"feature":"DBI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","642","0"],"version":"1.642"},{"feature":"DBI::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","642","0"],"version":"1.642"},{"feature":"DBI::Const::GetInfo::ANSI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","8697","0"],"version":"2.8697"},{"feature":"DBI::Const::GetInfo::ODBC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","11374","0"],"version":"2.11374"},{"feature":"DBI::Const::GetInfoReturn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","8697","0"],"version":"2.8697"},{"feature":"DBI::Const::GetInfoType","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","8697","0"],"version":"2.8697"},{"feature":"DBI::DBD","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["12","15129","0"],"version":"12.15129"},{"feature":"DBI::DBD::Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14214","0"],"version":"2.14214"},{"feature":"DBI::DBD::SqlEngine","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","6","0"],"version":"0.6"},{"feature":"DBI::Gofer::Execute","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","14283","0"],"version":"0.14283"},{"feature":"DBI::Gofer::Request","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","12537","0"],"version":"0.12537"},{"feature":"DBI::Gofer::Response","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","11566","0"],"version":"0.11566"},{"feature":"DBI::Gofer::Serializer::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","9950","0"],"version":"0.9950"},{"feature":"DBI::Gofer::Serializer::DataDumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","9950","0"],"version":"0.9950"},{"feature":"DBI::Gofer::Serializer::Storable","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","15586","0"],"version":"0.15586"},{"feature":"DBI::Gofer::Transport::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","12537","0"],"version":"0.12537"},{"feature":"DBI::Gofer::Transport::pipeone","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","12537","0"],"version":"0.12537"},{"feature":"DBI::Gofer::Transport::stream","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","12537","0"],"version":"0.12537"},{"feature":"DBI::Profile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","15065","0"],"version":"2.15065"},{"feature":"DBI::ProfileData","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","10008","0"],"version":"2.10008"},{"feature":"DBI::ProfileDumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","15325","0"],"version":"2.15325"},{"feature":"DBI::ProfileDumper::Apache","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14121","0"],"version":"2.14121"},{"feature":"DBI::ProfileSubs","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","9396","0"],"version":"0.9396"},{"feature":"DBI::ProxyServer","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3005","0"],"version":"0.3005"},{"feature":"DBI::PurePerl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14286","0"],"version":"2.14286"},{"feature":"DBI::SQL::Nano","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","15544","0"],"version":"1.15544"},{"feature":"DBI::Util::CacheMemory","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","10315","0"],"version":"0.10315"},{"feature":"DBI::Util::_accessor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","9479","0"],"version":"0.9479"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["27d48b7f-6d4c-50df-892f-7f500745dad0","cb035aad-a1f6-59e5-baf4-fbd8666c1f75","d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"68414965-5544-5af9-8d6c-32b9cce4df2b","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:50:51.494Z","ingredient_id":"6d0d1e25-b677-544c-9aab-fc8bf0eab142","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6d0d1e25-b677-544c-9aab-fc8bf0eab142"},"name":"Data-Dumper","normalized_name":"Data-Dumper","primary_namespace":"language/perl","description":"unknown"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-06T18:21:49.330Z","ingredient_id":"6d0d1e25-b677-544c-9aab-fc8bf0eab142","ingredient_version_id":"34a46b65-4429-5882-ba28-f7d09bb8a1d6","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6d0d1e25-b677-544c-9aab-fc8bf0eab142/versions/34a46b65-4429-5882-ba28-f7d09bb8a1d6","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6d0d1e25-b677-544c-9aab-fc8bf0eab142"},"revision":2,"revision_timestamp":"2019-12-06T22:01:07.334Z","copyright_text":"unknown","documentation_uri":"https://metacpan.org/pod/Data::Dumper","is_binary_only":false,"license_expression":"UNKNOWN","release_timestamp":"2018-11-10T10:10:30.000Z","source_uri":"https://cpan.metacpan.org/authors/id/X/XS/XSAWYERX/Data-Dumper-2.173.tar.gz","sortable_version":["2","173","0"],"version":"2.173","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/697608b39330988e519131be667ff47168aaaaf99f06bd2095d5b46ad05d76fa/Data-Dumper-2.173.tar.gz","scanner_license_expression":"unknown","source_checksum":"697608b39330988e519131be667ff47168aaaaf99f06bd2095d5b46ad05d76fa","provided_features":[{"feature":"Data-Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","173","0"],"version":"2.173"},{"feature":"Data::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","173","0"],"version":"2.173"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"44bca841-a181-5b72-bdd4-ab5d37ccb309","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:28.430Z","ingredient_id":"4a73e3d3-370c-55c1-9fec-f5d48fc4be9b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4a73e3d3-370c-55c1-9fec-f5d48fc4be9b"},"name":"ExtUtils-CBuilder","normalized_name":"ExtUtils-CBuilder","primary_namespace":"language/perl","description":"Compile and link C code for Perl modules"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:28.430Z","ingredient_id":"4a73e3d3-370c-55c1-9fec-f5d48fc4be9b","ingredient_version_id":"28f42dcf-0e80-5058-92a5-729ca91955a8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4a73e3d3-370c-55c1-9fec-f5d48fc4be9b/versions/28f42dcf-0e80-5058-92a5-729ca91955a8","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/4a73e3d3-370c-55c1-9fec-f5d48fc4be9b"},"revision":4,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-11-22T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/A/AM/AMBS/ExtUtils-CBuilder-0.280230.tar.gz","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"ExtUtils/CBuilder"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/1daae1d7709709a26139984b3c4c36e9ff22912cde6a393ea30ef40058dc9cd5/ExtUtils-CBuilder-0.280230.tar.gz","scanner_license_expression":"unknown","source_checksum":"1daae1d7709709a26139984b3c4c36e9ff22912cde6a393ea30ef40058dc9cd5","provided_features":[{"feature":"ExtUtils::CBuilder::Platform::darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::aix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::dec_osf","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::GCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::MSVC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::android","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::os2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder::Platform::Windows::BCC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils::CBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"},{"feature":"ExtUtils-CBuilder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","28","2","30","0"],"version":"0.28.2.30"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-10-01T16:51:27.984Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/059a0a2b-9ff8-4354-a993-e04088ffd3de"},"patch_id":"059a0a2b-9ff8-4354-a993-e04088ffd3de","conditions":null,"content":"ExtUtils-CBuilder-base-file.patch","description":"No description","sequence_number":1}],"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"20af464f-bda3-5072-b330-f4392b5e9850","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:32.487Z","ingredient_id":"59937b56-db73-5e9e-8d96-5966ed4593a8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/59937b56-db73-5e9e-8d96-5966ed4593a8"},"name":"ExtUtils-Install","normalized_name":"ExtUtils-Install","primary_namespace":"language/perl","description":"install files from here to there"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:32.487Z","ingredient_id":"59937b56-db73-5e9e-8d96-5966ed4593a8","ingredient_version_id":"9d19c878-dde6-5bc7-a0a1-aee1a15cf1a2","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/59937b56-db73-5e9e-8d96-5966ed4593a8/versions/9d19c878-dde6-5bc7-a0a1-aee1a15cf1a2","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/59937b56-db73-5e9e-8d96-5966ed4593a8"},"revision":4,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-05-28T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/B/BI/BINGOS/ExtUtils-Install-2.14.tar.gz","sortable_version":["2","14","0"],"version":"2.14","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"ExtUtils/Install"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/35412305cbae979aac3b6e2c70cb301ae461979a1d848a8a043f74518eb96aea/ExtUtils-Install-2.14.tar.gz","scanner_license_expression":"unknown","source_checksum":"35412305cbae979aac3b6e2c70cb301ae461979a1d848a8a043f74518eb96aea","provided_features":[{"feature":"ExtUtils::Packlist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils::Installed","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils::Install","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"},{"feature":"ExtUtils-Install","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","14","0"],"version":"2.14"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-10-01T16:51:32.126Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/df7d561f-feaa-4bc7-bde6-2efafc070da8"},"patch_id":"df7d561f-feaa-4bc7-bde6-2efafc070da8","conditions":null,"content":"ExtUtils-Install-2.14-hpux-inuse-rename.patch","description":"Bug 85799, on HP-UX, first try to rename an in-use file\n instead of immediately giving up.","sequence_number":1}],"resolved_requirements":[]},{"alternatives":["5ae0af7e-aef3-5815-977e-ea78d2dfdd95","fd3ebb99-efb0-5fc4-8329-f36866b44290","b3f16eff-d588-5bbe-a33e-b34e1dbdf72e","d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"d2df2faa-b698-5599-b752-825d3e59cb63","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:37.136Z","ingredient_id":"8291f28e-f684-560c-8875-5c834a4740fd","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8291f28e-f684-560c-8875-5c834a4740fd"},"name":"ExtUtils-MakeMaker","normalized_name":"ExtUtils-MakeMaker","primary_namespace":"language/perl","description":"Create a module Makefile"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-10T18:45:23.625Z","ingredient_id":"8291f28e-f684-560c-8875-5c834a4740fd","ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8291f28e-f684-560c-8875-5c834a4740fd/versions/0067cb0b-fe9b-5c73-b853-bdd90d6e240b","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/8291f28e-f684-560c-8875-5c834a4740fd"},"revision":1,"revision_timestamp":"2019-12-10T18:45:23.625Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/ExtUtils::MakeMaker","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-09-11T09:16:48.000Z","source_uri":"https://cpan.metacpan.org/authors/id/B/BI/BINGOS/ExtUtils-MakeMaker-7.38.tar.gz","sortable_version":["7","380","0"],"version":"7.38","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/897d64af242331ebb69090f68a2b610091e1996952d02096ce7942072a35e02c/ExtUtils-MakeMaker-7.38.tar.gz","scanner_license_expression":"unknown","source_checksum":"897d64af242331ebb69090f68a2b610091e1996952d02096ce7942072a35e02c","provided_features":[{"feature":"ExtUtils-MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Command","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Command::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Liblist","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Liblist::Kid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_AIX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Any","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_BeOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_DOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_NW5","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_UWIN","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MM_Win95","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::Locale","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::_version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::charstar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::version::regex","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::MakeMaker::version::vpp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Mkbootstrap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::Mksymlists","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"ExtUtils::testlib","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"MM","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"},{"feature":"MY","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["7","380","0"],"version":"7.38"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-12-10T15:57:44.636Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/aae9cf84-3381-45be-b044-a557232eca66"},"patch_id":"aae9cf84-3381-45be-b044-a557232eca66","conditions":null,"content":"s3://platform-sources/patches/c533f762465d39aee2a092a89e61a8d69ef51cc7d365f2d0d7a3231e09cd08f0.patch","description":"ExtUtils-MakeMaker ~ ExtUtils-MakeMaker-7.38-01-ldopts\nCarried forward from 7.30\nMake 'perl -MExtUtils::Embed -e ldopts' output a direct reference to libperl.a if using -lperl would pick up libperl.so.\nhttp://bugs.activestate.com/show_bug.cgi?id=39069\np4-change: 152627","sequence_number":1},{"creation_timestamp":"2019-12-10T15:58:48.730Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/7770ef1d-96a1-4f9b-a89c-7e1e51755a36"},"patch_id":"7770ef1d-96a1-4f9b-a89c-7e1e51755a36","conditions":null,"content":"s3://platform-sources/patches/d8467840f146ddd3e53228e2af5f83ac44af7a6f40912b5c096c6999d422e20c.patch","description":"ExtUtils-MakeMaker ~ ExtUtils-MakeMaker-7.38-02-html-pods\nCarried forward from 7.30\nSupport for HTML PODs","sequence_number":2},{"creation_timestamp":"2019-12-10T16:00:02.140Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/e1a5d58f-4c19-4177-a436-501a92b64b35"},"patch_id":"e1a5d58f-4c19-4177-a436-501a92b64b35","conditions":null,"content":"s3://platform-sources/patches/4e327d9c66c8ca64f42e754b46c96f9fbc01539f231d2afab5049711dda62051.patch","description":"ExtUtils-MakeMaker ~ ExtUtils-MakeMaker-7.38-03-htmldir\nCarried forward from 7.30\nMake sure MakeMaker sets up INSTALL.*HTMLDIR when using INSTALL_BASE\nWithout this change the html docs will be written to root level directories /bin, /lib, and /site (if they are writable; otherwise install will fail).\nThe INSTALL_BASE feature is used by local::lib (and cpanminus).","sequence_number":3},{"creation_timestamp":"2019-12-10T16:01:16.305Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/a4ae5e21-ee99-4e23-96eb-90ca47dfcdea"},"patch_id":"a4ae5e21-ee99-4e23-96eb-90ca47dfcdea","conditions":null,"content":"s3://platform-sources/patches/cde1c1d24b5308c81c1febb868c5b26565b032501b9536db83e8fb315d106195.patch","description":"ExtUtils-MakeMaker ~ ExtUtils-MakeMaker-7.38-skip-xs-on-AIX\nCarried forward from 7.30\nSkip EUMM XS tests on AIX.\nhttps://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker/pull/278","sequence_number":4}],"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"6be9481f-1484-5b4e-9407-05ef48c83c40","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:38.304Z","ingredient_id":"de5c5b9c-b323-501e-96bc-c4bdf75fe8b5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/de5c5b9c-b323-501e-96bc-c4bdf75fe8b5"},"name":"ExtUtils-Manifest","normalized_name":"ExtUtils-Manifest","primary_namespace":"language/perl","description":"utilities to write and check a MANIFEST file"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:38.304Z","ingredient_id":"de5c5b9c-b323-501e-96bc-c4bdf75fe8b5","ingredient_version_id":"c509e237-a516-5cf0-aaec-216a4daaeed4","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/de5c5b9c-b323-501e-96bc-c4bdf75fe8b5/versions/c509e237-a516-5cf0-aaec-216a4daaeed4","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/de5c5b9c-b323-501e-96bc-c4bdf75fe8b5"},"revision":6,"revision_timestamp":"2019-11-05T00:50:49.251Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2014-12-31T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/E/ET/ETHER/ExtUtils-Manifest-1.70.tar.gz","sortable_version":["1","70","0"],"version":"1.70","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"ExtUtils/Manifest","required":"1"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/eeff062050b223964cd8f624a90ae75df443612239df34a20ff87644f9f52b95/ExtUtils-Manifest-1.70.tar.gz","scanner_license_expression":"unknown","source_checksum":"eeff062050b223964cd8f624a90ae75df443612239df34a20ff87644f9f52b95","provided_features":[{"feature":"ExtUtils-Manifest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.70"},{"feature":"ExtUtils::Manifest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","70","0"],"version":"1.70"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"d78ed36e-672c-59e3-81c9-5761074f6c97","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:55.496Z","ingredient_id":"b58e146b-377e-54f5-9424-705f681840f3","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/b58e146b-377e-54f5-9424-705f681840f3"},"name":"Getopt-Long","normalized_name":"Getopt-Long","primary_namespace":"language/perl","description":"Module to handle parsing command line options"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:55.496Z","ingredient_id":"b58e146b-377e-54f5-9424-705f681840f3","ingredient_version_id":"f21bbf0a-4665-5fb9-88b8-3eb9a22a7da7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/b58e146b-377e-54f5-9424-705f681840f3/versions/f21bbf0a-4665-5fb9-88b8-3eb9a22a7da7","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/b58e146b-377e-54f5-9424-705f681840f3"},"revision":4,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0 OR GPL-2.0-or-later","release_timestamp":"2017-05-27T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/J/JV/JV/Getopt-Long-2.50.tar.gz","sortable_version":["2","50","0"],"version":"2.50","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Getopt/Long"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/20881adb2b73e83825f9a0a3b141db11b3a555e1d3775b13d81d0481623e4b67/Getopt-Long-2.50.tar.gz","scanner_license_expression":"unknown","source_checksum":"20881adb2b73e83825f9a0a3b141db11b3a555e1d3775b13d81d0481623e4b67","provided_features":[{"feature":"Getopt::Long","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.50"},{"feature":"Getopt-Long","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","50","0"],"version":"2.50"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"e8b01fb8-3e62-5ac4-8e4b-422945b8cc9d","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"3b05243a-b6da-57ec-8c57-8de5221b8937"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"4b150af7-4abd-5bad-849c-94cde6b59fed"},{"dependency_types":["runtime"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:57.424Z","ingredient_id":"7075b232-08c5-5ad7-bf90-943d1b32dcf0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7075b232-08c5-5ad7-bf90-943d1b32dcf0"},"name":"HTML-Parser","normalized_name":"HTML-Parser","primary_namespace":"language/perl","description":"HTML parser class"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:57.424Z","ingredient_id":"7075b232-08c5-5ad7-bf90-943d1b32dcf0","ingredient_version_id":"1cb4ca5e-4e4e-59fb-b2cb-5fdb54856ff0","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7075b232-08c5-5ad7-bf90-943d1b32dcf0/versions/1cb4ca5e-4e4e-59fb-b2cb-5fdb54856ff0","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/7075b232-08c5-5ad7-bf90-943d1b32dcf0"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2016-01-19T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/G/GA/GAAS/HTML-Parser-3.72.tar.gz","sortable_version":["3","72","0"],"version":"3.72","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"HTML/Parser"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/ec28c7e1d9e67c45eca197077f7cdc41ead1bb4c538c7f02a3296a4bb92f608b/HTML-Parser-3.72.tar.gz","scanner_license_expression":"unknown","source_checksum":"ec28c7e1d9e67c45eca197077f7cdc41ead1bb4c538c7f02a3296a4bb92f608b","provided_features":[{"feature":"HTML-Parser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","72","0"],"version":"3.72"},{"feature":"HTML::Entities","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","69","0"],"version":"3.69"},{"feature":"HTML::Filter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","72","0"],"version":"3.72"},{"feature":"HTML::HeadParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","71","0"],"version":"3.71"},{"feature":"HTML::LinkExtor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","69","0"],"version":"3.69"},{"feature":"HTML::Parser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","72","0"],"version":"3.72"},{"feature":"HTML::PullParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","57","0"],"version":"3.57"},{"feature":"HTML::TokeParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","69","0"],"version":"3.69"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"9a4b00f2-45fd-5480-b790-302bec5db07d","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:51:58.616Z","ingredient_id":"642ba5a2-5d51-5c4e-87fa-3685665bd030","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/642ba5a2-5d51-5c4e-87fa-3685665bd030"},"name":"HTML-Tagset","normalized_name":"HTML-Tagset","primary_namespace":"language/perl","description":"data tables useful in parsing HTML"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:51:58.616Z","ingredient_id":"642ba5a2-5d51-5c4e-87fa-3685665bd030","ingredient_version_id":"4b150af7-4abd-5bad-849c-94cde6b59fed","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/642ba5a2-5d51-5c4e-87fa-3685665bd030/versions/4b150af7-4abd-5bad-849c-94cde6b59fed","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/642ba5a2-5d51-5c4e-87fa-3685665bd030"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2008-03-01T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/P/PE/PETDANCE/HTML-Tagset-3.20.tar.gz","sortable_version":["3","20","0"],"version":"3.20","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"HTML/Tagset"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/adb17dac9e36cd011f5243881c9739417fd102fce760f8de4e9be4c7131108e2/HTML-Tagset-3.20.tar.gz","scanner_license_expression":"unknown","source_checksum":"adb17dac9e36cd011f5243881c9739417fd102fce760f8de4e9be4c7131108e2","provided_features":[{"feature":"HTML-Tagset","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","20","0"],"version":"3.20"},{"feature":"HTML::Tagset","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","20","0"],"version":"3.20"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"701c6b1f-2b6c-56c9-ae5d-f3ae17cd3d1e","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:02.127Z","ingredient_id":"9ed3546f-abf3-546f-a532-d4badd1937f7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9ed3546f-abf3-546f-a532-d4badd1937f7"},"name":"HTTP-Date","normalized_name":"HTTP-Date","primary_namespace":"language/perl","description":"date conversion routines"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:02.127Z","ingredient_id":"9ed3546f-abf3-546f-a532-d4badd1937f7","ingredient_version_id":"91cd893b-5b8c-5391-9c77-643fb85af0af","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9ed3546f-abf3-546f-a532-d4badd1937f7/versions/91cd893b-5b8c-5391-9c77-643fb85af0af","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9ed3546f-abf3-546f-a532-d4badd1937f7"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-Perl OR GPL-1.0-or-later","release_timestamp":"2012-03-30T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/G/GA/GAAS/HTTP-Date-6.02.tar.gz","sortable_version":["6","2","0"],"version":"6.2","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"HTTP/Date"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/e8b9941da0f9f0c9c01068401a5e81341f0e3707d1c754f8e11f42a7e629e333/HTTP-Date-6.02.tar.gz","scanner_license_expression":"unknown","source_checksum":"e8b9941da0f9f0c9c01068401a5e81341f0e3707d1c754f8e11f42a7e629e333","provided_features":[{"feature":"HTTP-Date","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","2","0"],"version":"6.2"},{"feature":"HTTP::Date","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","2","0"],"version":"6.2"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"c24ffb45-a21d-561f-ad66-d56556b2bdb4","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"50f0603e-048d-5f9a-ac44-9d32df97809d"},{"dependency_types":["build"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:02.612Z","ingredient_id":"80076996-fc73-50c2-850e-a606a139b302","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/80076996-fc73-50c2-850e-a606a139b302"},"name":"HTTP-Message","normalized_name":"HTTP-Message","primary_namespace":"language/perl","description":"HTTP style message (base class)"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:02.612Z","ingredient_id":"80076996-fc73-50c2-850e-a606a139b302","ingredient_version_id":"3e08c8d3-fe88-5c33-82df-ded1e3d15a0b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/80076996-fc73-50c2-850e-a606a139b302/versions/3e08c8d3-fe88-5c33-82df-ded1e3d15a0b","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/80076996-fc73-50c2-850e-a606a139b302"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-12-20T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/O/OA/OALDERS/HTTP-Message-6.14.tar.gz","sortable_version":["6","14","0"],"version":"6.14","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"HTTP/Message"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/71aab9f10eb4b8ec6e8e3a85fc5acb46ba04db1c93eb99613b184078c5cf2ac9/HTTP-Message-6.14.tar.gz","scanner_license_expression":"unknown","source_checksum":"71aab9f10eb4b8ec6e8e3a85fc5acb46ba04db1c93eb99613b184078c5cf2ac9","provided_features":[{"feature":"HTTP-Message","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Headers","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Headers::Auth","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Headers::ETag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Headers::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Message","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Request","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Request::Common","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Response","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"},{"feature":"HTTP::Status","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","14","0"],"version":"6.14"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"7d72ca66-ae36-5e6f-a491-d649bbdb8b8f","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["runtime"],"ingredient_version_id":"3e08c8d3-fe88-5c33-82df-ded1e3d15a0b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:03.039Z","ingredient_id":"2950e101-1150-5ab1-affe-ab6ac3d4b6e7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2950e101-1150-5ab1-affe-ab6ac3d4b6e7"},"name":"HTTP-Negotiate","normalized_name":"HTTP-Negotiate","primary_namespace":"language/perl","description":"choose a variant to serve"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:03.039Z","ingredient_id":"2950e101-1150-5ab1-affe-ab6ac3d4b6e7","ingredient_version_id":"e4b6a074-ad51-5b69-95ce-7747c95471f8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2950e101-1150-5ab1-affe-ab6ac3d4b6e7/versions/e4b6a074-ad51-5b69-95ce-7747c95471f8","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2950e101-1150-5ab1-affe-ab6ac3d4b6e7"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-Perl OR GPL-1.0-or-later","release_timestamp":"2012-02-18T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/G/GA/GAAS/HTTP-Negotiate-6.01.tar.gz","sortable_version":["6","1","0"],"version":"6.1","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"HTTP/Negotiate"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/1c729c1ea63100e878405cda7d66f9adfd3ed4f1d6cacaca0ee9152df728e016/HTTP-Negotiate-6.01.tar.gz","scanner_license_expression":"unknown","source_checksum":"1c729c1ea63100e878405cda7d66f9adfd3ed4f1d6cacaca0ee9152df728e016","provided_features":[{"feature":"HTTP-Negotiate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","1","0"],"version":"6.1"},{"feature":"HTTP::Negotiate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","1","0"],"version":"6.1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["96636fc0-a33a-5825-8f5d-5122b3812a0f"],"artifact_id":"8d011eb1-3d8e-5074-a8b2-d41586e53059","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["runtime"],"ingredient_version_id":"3b05243a-b6da-57ec-8c57-8de5221b8937"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"bebc32d9-b8e0-59dd-97b2-098496e9fd61"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:22.652Z","ingredient_id":"21072e99-9e15-5b56-a8fc-e83864695be8","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/21072e99-9e15-5b56-a8fc-e83864695be8"},"name":"JSON-PP","normalized_name":"JSON-PP","primary_namespace":"language/perl","description":"JSON::XS compatible pure-Perl module."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-11-13T15:08:42.291Z","ingredient_id":"21072e99-9e15-5b56-a8fc-e83864695be8","ingredient_version_id":"50f0603e-048d-5f9a-ac44-9d32df97809d","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/21072e99-9e15-5b56-a8fc-e83864695be8/versions/50f0603e-048d-5f9a-ac44-9d32df97809d","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/21072e99-9e15-5b56-a8fc-e83864695be8"},"revision":1,"revision_timestamp":"2019-11-13T15:08:42.291Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/JSON::PP","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-06-29T09:52:40.000Z","source_uri":"https://cpan.metacpan.org/authors/id/I/IS/ISHIGAKI/JSON-PP-4.04.tar.gz","sortable_version":["4","40","0"],"version":"4.04","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/81311c56d7b94bbf8003cf421e87961efba576189198e516fd5426889650b66a/JSON-PP-4.04.tar.gz","scanner_license_expression":"unknown","source_checksum":"81311c56d7b94bbf8003cf421e87961efba576189198e516fd5426889650b66a","provided_features":[{"feature":"JSON-PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","40","0"],"version":"4.04"},{"feature":"JSON::PP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","40","0"],"version":"4.04"},{"feature":"JSON::PP::Boolean","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","40","0"],"version":"4.04"},{"feature":"JSON::PP::IncrParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","40","0"],"version":"4.04"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["a921e82c-9204-5b32-b7fb-3491c52b4e6b"],"artifact_id":"79b640e2-85c5-5e36-b466-cec860002061","build_scripts":null,"dependencies":[{"dependency_types":["runtime"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build","runtime"],"ingredient_version_id":"142400e9-5965-5a41-813a-427106fbf770"},{"dependency_types":["runtime"],"ingredient_version_id":"28f42dcf-0e80-5058-92a5-729ca91955a8"},{"dependency_types":["runtime"],"ingredient_version_id":"34a46b65-4429-5882-ba28-f7d09bb8a1d6"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["runtime"],"ingredient_version_id":"9d19c878-dde6-5bc7-a0a1-aee1a15cf1a2"},{"dependency_types":["build","runtime"],"ingredient_version_id":"ad8f2146-84db-5542-b4b7-c188f18784d7"},{"dependency_types":["runtime"],"ingredient_version_id":"b131cae2-42e2-564e-a217-1266ea60ff62"},{"dependency_types":["runtime"],"ingredient_version_id":"c509e237-a516-5cf0-aaec-216a4daaeed4"},{"dependency_types":["build","runtime"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"},{"dependency_types":["runtime"],"ingredient_version_id":"f21bbf0a-4665-5fb9-88b8-3eb9a22a7da7"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:48.137Z","ingredient_id":"c709227b-f464-5cb3-b53f-de99f4244cb1","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c709227b-f464-5cb3-b53f-de99f4244cb1"},"name":"Module-Build","normalized_name":"Module-Build","primary_namespace":"language/perl","description":"Build and install Perl modules"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-12T22:59:25.654Z","ingredient_id":"c709227b-f464-5cb3-b53f-de99f4244cb1","ingredient_version_id":"5b9149e8-2334-5454-a523-cd9787003344","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c709227b-f464-5cb3-b53f-de99f4244cb1/versions/5b9149e8-2334-5454-a523-cd9787003344","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c709227b-f464-5cb3-b53f-de99f4244cb1"},"revision":3,"revision_timestamp":"2020-04-22T15:09:12.488Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/Module::Build","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-04-15T22:52:38.000Z","source_uri":"https://cpan.metacpan.org/authors/id/L/LE/LEONT/Module-Build-0.4229.tar.gz","sortable_version":["0","422","900"],"version":"0.4229","activestate_license_expression":"unknown","camel_extras":{},"dependency_sets":null,"ingredient_options":null,"is_indemnified":false,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/1fe491a6cda914b01bc8e592faa2b5404e9f35915ca15322f8f2a8d8f9008c18/Module-Build-0.4229.tar.gz","scanner_license_expression":"unknown","source_checksum":"1fe491a6cda914b01bc8e592faa2b5404e9f35915ca15322f8f2a8d8f9008c18","provided_features":[{"feature":"Module::Build::PodParser","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::os2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::darwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::aix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::Windows","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::VOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::MacOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Platform::Default","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::PPMMaker","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Notes","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Dumper","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Cookbook","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Config","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Compat","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module::Build","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"},{"feature":"Module-Build","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","422","900"],"version":"0.4229"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"56135216-8f1d-5289-a8db-fae6e287dcbd","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"d94f704f-ab76-5db3-a571-b9a019a1cc2a"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:51.673Z","ingredient_id":"441965ba-8592-5986-b10d-7e1d959ddfd9","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/441965ba-8592-5986-b10d-7e1d959ddfd9"},"name":"Module-Metadata","normalized_name":"Module-Metadata","primary_namespace":"language/perl","description":"Gather package and POD information from perl module files"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:51.673Z","ingredient_id":"441965ba-8592-5986-b10d-7e1d959ddfd9","ingredient_version_id":"ad8f2146-84db-5542-b4b7-c188f18784d7","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/441965ba-8592-5986-b10d-7e1d959ddfd9/versions/ad8f2146-84db-5542-b4b7-c188f18784d7","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/441965ba-8592-5986-b10d-7e1d959ddfd9"},"revision":4,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2016-07-24T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/E/ET/ETHER/Module-Metadata-1.000033.tar.gz","sortable_version":["1","33","0"],"version":"1.33","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Module/Metadata"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/bc96cc7949b52e2dac1595e806102640760917cfcd7497c7a023192156f3ff8e/Module-Metadata-1.000033.tar.gz","scanner_license_expression":"unknown","source_checksum":"bc96cc7949b52e2dac1595e806102640760917cfcd7497c7a023192156f3ff8e","provided_features":[{"feature":"Module::Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","33","0"],"version":"1.33"},{"feature":"Module-Metadata","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","33","0"],"version":"1.33"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"c561e3f0-2aba-5277-8315-279a9f06a8ca","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:52:59.671Z","ingredient_id":"d6b106ec-77df-51da-9864-5a040bf0711a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d6b106ec-77df-51da-9864-5a040bf0711a"},"name":"Net-HTTP","normalized_name":"Net-HTTP","primary_namespace":"language/perl","description":"Low-level HTTP connection (client)"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:52:59.671Z","ingredient_id":"d6b106ec-77df-51da-9864-5a040bf0711a","ingredient_version_id":"06d43cc3-8f67-575b-b34d-0ec60e9ae67e","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d6b106ec-77df-51da-9864-5a040bf0711a/versions/06d43cc3-8f67-575b-b34d-0ec60e9ae67e","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d6b106ec-77df-51da-9864-5a040bf0711a"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-09-01T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/O/OA/OALDERS/Net-HTTP-6.17.tar.gz","sortable_version":["6","17","0"],"version":"6.17","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Net/HTTP"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/1e8624b1618dc6f7f605f5545643ebb9b833930f4d7485d4124aa2f2f26d1611/Net-HTTP-6.17.tar.gz","scanner_license_expression":"unknown","source_checksum":"1e8624b1618dc6f7f605f5545643ebb9b833930f4d7485d4124aa2f2f26d1611","provided_features":[{"feature":"Net-HTTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","17","0"],"version":"6.17"},{"feature":"Net::HTTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","17","0"],"version":"6.17"},{"feature":"Net::HTTP::Methods","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","17","0"],"version":"6.17"},{"feature":"Net::HTTP::NB","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","17","0"],"version":"6.17"},{"feature":"Net::HTTPS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","17","0"],"version":"6.17"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["21a740ba-c54d-5a78-bc42-0fdb7dced2ba","d94f704f-ab76-5db3-a571-b9a019a1cc2a"],"artifact_id":"aea53a58-9da4-5c4a-9259-fc533a28cbc6","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:53:18.167Z","ingredient_id":"13dc7a1e-eef1-5153-b1ce-e7632febd346","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/13dc7a1e-eef1-5153-b1ce-e7632febd346"},"name":"PathTools","normalized_name":"PathTools","primary_namespace":"language/perl","description":"unknown"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-06T18:21:43.162Z","ingredient_id":"13dc7a1e-eef1-5153-b1ce-e7632febd346","ingredient_version_id":"142400e9-5965-5a41-813a-427106fbf770","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/13dc7a1e-eef1-5153-b1ce-e7632febd346/versions/142400e9-5965-5a41-813a-427106fbf770","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/13dc7a1e-eef1-5153-b1ce-e7632febd346"},"revision":2,"revision_timestamp":"2019-12-06T21:46:46.530Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/Cwd","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2018-08-29T19:53:19.000Z","source_uri":"https://cpan.metacpan.org/authors/id/X/XS/XSAWYERX/PathTools-3.75.tar.gz","sortable_version":["3","750","0"],"version":"3.75","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/a558503aa6b1f8c727c0073339081a77888606aa701ada1ad62dd9d8c3f945a2/PathTools-3.75.tar.gz","scanner_license_expression":"unknown","source_checksum":"a558503aa6b1f8c727c0073339081a77888606aa701ada1ad62dd9d8c3f945a2","provided_features":[{"feature":"Cwd","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::AmigaOS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Cygwin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Epoc","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Functions","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::VMS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"File::Spec::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"},{"feature":"PathTools","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","750","0"],"version":"3.75"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a","c287183e-48c8-5bfe-9b9d-0ead376370fe"],"artifact_id":"18f5dfd6-e09c-5bff-9dd8-a182a757b52b","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"9d19c878-dde6-5bc7-a0a1-aee1a15cf1a2"}],"ingredient":{"creation_timestamp":"2019-10-01T16:53:42.402Z","ingredient_id":"9c61e880-bed6-59de-807a-4ace3191d81b","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9c61e880-bed6-59de-807a-4ace3191d81b"},"name":"Scalar-List-Utils","normalized_name":"Scalar-List-Utils","primary_namespace":"language/perl","description":"Common Scalar and List utility subroutines"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-06T18:21:56.566Z","ingredient_id":"9c61e880-bed6-59de-807a-4ace3191d81b","ingredient_version_id":"bebc32d9-b8e0-59dd-97b2-098496e9fd61","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9c61e880-bed6-59de-807a-4ace3191d81b/versions/bebc32d9-b8e0-59dd-97b2-098496e9fd61","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/9c61e880-bed6-59de-807a-4ace3191d81b"},"revision":2,"revision_timestamp":"2019-12-06T22:22:08.218Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/Sub::Util","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-10-24T09:43:15.000Z","source_uri":"https://cpan.metacpan.org/authors/id/P/PE/PEVANS/Scalar-List-Utils-1.53.tar.gz","sortable_version":["1","530","0"],"version":"1.53","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/bd4086b066fb3b18a0be2e7d9bc100a99aa0f233ad659492340415c7b2bdae99/Scalar-List-Utils-1.53.tar.gz","scanner_license_expression":"unknown","source_checksum":"bd4086b066fb3b18a0be2e7d9bc100a99aa0f233ad659492340415c7b2bdae99","provided_features":[{"feature":"List::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","530","0"],"version":"1.53"},{"feature":"List::Util::XS","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","530","0"],"version":"1.53"},{"feature":"Scalar-List-Utils","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","530","0"],"version":"1.53"},{"feature":"Scalar::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","530","0"],"version":"1.53"},{"feature":"Sub::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","530","0"],"version":"1.53"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a","bbfeffca-adbf-53df-9e84-dcbc83f804bd","19f1be8e-2dc4-58be-a370-00627a6ce003"],"artifact_id":"86d6c830-22f3-5c53-b9cb-74dcfc8a0d03","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:54:16.878Z","ingredient_id":"2df1c8f2-0db1-506c-b339-d36a23aa303a","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2df1c8f2-0db1-506c-b339-d36a23aa303a"},"name":"Test-Simple","normalized_name":"Test-Simple","primary_namespace":"language/perl","description":"Basic utilities for writing tests."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-06T18:21:33.143Z","ingredient_id":"2df1c8f2-0db1-506c-b339-d36a23aa303a","ingredient_version_id":"3b05243a-b6da-57ec-8c57-8de5221b8937","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2df1c8f2-0db1-506c-b339-d36a23aa303a/versions/3b05243a-b6da-57ec-8c57-8de5221b8937","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/2df1c8f2-0db1-506c-b339-d36a23aa303a"},"revision":2,"revision_timestamp":"2019-12-06T21:38:18.262Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/Test::Simple","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-12-02T21:27:53.000Z","source_uri":"https://cpan.metacpan.org/authors/id/E/EX/EXODIST/Test-Simple-1.302170.tar.gz","sortable_version":["1","302","170"],"version":"1.302170","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/50dc374f93316ed1c251433e1f91050e82a56711ff47a7b333602e017e3bfe3a/Test-Simple-1.302170.tar.gz","scanner_license_expression":"unknown","source_checksum":"50dc374f93316ed1c251433e1f91050e82a56711ff47a7b333602e017e3bfe3a","provided_features":[{"feature":"Test-Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::API","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::API::Breakage","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::API::Context","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::API::Instance","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::API::Stack","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Bail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Diag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Encoding","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Exception","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Fail","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Note","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Pass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Skip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::TAP::Version","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::V2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Event::Waiting","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::About","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Amnesty","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Assert","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Control","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Error","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Info","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Info::Table","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Meta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Parent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Plan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Render","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::EventFacet::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Formatter::TAP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Hub","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Hub::Interceptor","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Hub::Interceptor::Terminator","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Hub::Subtest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::IPC","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::IPC::Driver","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::IPC::Driver::Files","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Tools::Tiny","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Util","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Util::ExternalMeta","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Util::Facets2Legacy","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Util::HashBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test2::Util::Trace","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::Formatter","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::IO::Scalar","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::Module","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::Tester::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::Tester::Tie","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Builder::TodoDiag","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::More","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Tester","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Tester::Capture","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Tester::CaptureRunner","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::Tester::Delegate","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"Test::use::ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"},{"feature":"ok","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","302","170"],"version":"1.302170"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"b3dd6720-f5bc-5c4d-8690-ee764aaf89ca","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:54:49.138Z","ingredient_id":"e10d6669-f1c9-57ef-a77e-3bb8fa3df884","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/e10d6669-f1c9-57ef-a77e-3bb8fa3df884"},"name":"URI","normalized_name":"URI","primary_namespace":"language/perl","description":"Uniform Resource Identifiers (absolute and relative)"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:54:49.138Z","ingredient_id":"e10d6669-f1c9-57ef-a77e-3bb8fa3df884","ingredient_version_id":"1a882ae6-d86f-5431-a5cb-8caa0abeedf5","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/e10d6669-f1c9-57ef-a77e-3bb8fa3df884/versions/1a882ae6-d86f-5431-a5cb-8caa0abeedf5","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/e10d6669-f1c9-57ef-a77e-3bb8fa3df884"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2018-01-09T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/E/ET/ETHER/URI-1.73.tar.gz","sortable_version":["1","73","0"],"version":"1.73","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"URI"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/cca7ab4a6f63f3ccaacae0f2e1337e8edf84137e73f18548ec7d659f23efe413/URI-1.73.tar.gz","scanner_license_expression":"unknown","source_checksum":"cca7ab4a6f63f3ccaacae0f2e1337e8edf84137e73f18548ec7d659f23efe413","provided_features":[{"feature":"URI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::Escape","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["3","31","0"],"version":"3.31"},{"feature":"URI::Heuristic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","20","0"],"version":"4.20"},{"feature":"URI::IRI","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::QueryParam","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::Split","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::URL","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["5","4","0"],"version":"5.4"},{"feature":"URI::WithBase","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["2","20","0"],"version":"2.20"},{"feature":"URI::_foreign","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_generic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_idna","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_ldap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_login","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_punycode","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_query","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_segment","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_server","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::_userpass","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::data","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","21","0"],"version":"4.21"},{"feature":"URI::file::Base","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::FAT","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::Mac","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::OS2","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::QNX","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::Unix","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::file::Win32","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::ftp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::gopher","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::http","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::https","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::ldap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::ldapi","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::ldaps","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::mailto","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::mms","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::news","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::nntp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::pop","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::rlogin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::rsync","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::rtsp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::rtspu","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::sftp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::sip","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::sips","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::snews","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::ssh","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::telnet","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::tn3270","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::urn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::urn::isbn","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"},{"feature":"URI::urn::oid","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["1","73","0"],"version":"1.73"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":[],"artifact_id":"f54623d0-376f-5024-b237-c1e78a926ff8","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:55:07.132Z","ingredient_id":"6184d401-d399-5634-9a36-49b77e680ee4","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6184d401-d399-5634-9a36-49b77e680ee4"},"name":"Win32-ShellQuote","normalized_name":"Win32-ShellQuote","primary_namespace":"language/perl","description":"Quote argument lists for Win32"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:55:07.132Z","ingredient_id":"6184d401-d399-5634-9a36-49b77e680ee4","ingredient_version_id":"3d2abb3d-07d3-5fac-ba8b-897484c7d98c","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6184d401-d399-5634-9a36-49b77e680ee4/versions/3d2abb3d-07d3-5fac-ba8b-897484c7d98c","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/6184d401-d399-5634-9a36-49b77e680ee4"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2016-09-27T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/H/HA/HAARG/Win32-ShellQuote-0.003001.tar.gz","sortable_version":["0","3","1","0"],"version":"0.3.1","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"Win32/ShellQuote","require_os":["MSWin32","MSWin32"]},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/aa74b0e3dc2d41cd63f62f853e521ffd76b8d823479a2619e22edb4049b4c0dc/Win32-ShellQuote-0.003001.tar.gz","scanner_license_expression":"unknown","source_checksum":"aa74b0e3dc2d41cd63f62f853e521ffd76b8d823479a2619e22edb4049b4c0dc","provided_features":[{"feature":"Win32-ShellQuote","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","3","1","0"],"version":"0.3.1"},{"feature":"Win32::ShellQuote","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["0","30","1","0"],"version":"0.30.1"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"Win32-ShellQuote","namespace":"language/perl","version_requirements":[{"comparator":"eq","version":"0.3.1"}]}]},{"alternatives":[],"artifact_id":"0df374fb-9686-5e09-80ee-93e1943dd1eb","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:55:57.867Z","ingredient_id":"438c3d67-b979-579d-942a-cd6a47976113","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/438c3d67-b979-579d-942a-cd6a47976113"},"name":"libwww-perl","normalized_name":"libwww-perl","primary_namespace":"language/perl","description":"The World-Wide Web library for Perl"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:55:57.867Z","ingredient_id":"438c3d67-b979-579d-942a-cd6a47976113","ingredient_version_id":"84a01b55-1d92-53ae-a7cb-d591b7b54724","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/438c3d67-b979-579d-942a-cd6a47976113/versions/84a01b55-1d92-53ae-a7cb-d591b7b54724","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/438c3d67-b979-579d-942a-cd6a47976113"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Artistic-1.0-perl OR GPL-1.0-or-later","release_timestamp":"2017-12-11T00:00:00.000Z","source_uri":"https://www.cpan.org/authors/id/E/ET/ETHER/libwww-perl-6.31.tar.gz","sortable_version":["6","31","0"],"version":"6.31","activestate_license_expression":"unknown","camel_extras":{"mm_fullext":"libwww/perl"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/525d5386d39d1c1d7da8a0e9dd0cbab95cba2a4bfcfd9b83b257f49be4eecae3/libwww-perl-6.31.tar.gz","scanner_license_expression":"unknown","source_checksum":"525d5386d39d1c1d7da8a0e9dd0cbab95cba2a4bfcfd9b83b257f49be4eecae3","provided_features":[{"feature":"LWP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Authen::Basic","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Authen::Digest","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Authen::Ntlm","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::ConnCache","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Debug","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Debug::TraceHTTP","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::DebugFile","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::MemberMixin","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::cpan","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::data","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::file","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::ftp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::gopher","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::http","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::loopback","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::mailto","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::nntp","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Protocol::nogo","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::RobotUA","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::Simple","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"LWP::UserAgent","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"},{"feature":"libwww-perl","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["6","31","0"],"version":"6.31"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[{"feature":"libwww-perl","namespace":"language/perl","version_requirements":[{"comparator":"gte","version":"0"}]}]},{"alternatives":["d94f704f-ab76-5db3-a571-b9a019a1cc2a","a156d3e3-3f38-55ee-a5c0-af32af5e8e7c"],"artifact_id":"84393ca8-9ac8-5e3c-a820-fa55b91bda42","build_scripts":null,"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"0067cb0b-fe9b-5c73-b853-bdd90d6e240b"},{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:58:19.876Z","ingredient_id":"ce716f45-743d-56e6-9d06-102a58dc9c24","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ce716f45-743d-56e6-9d06-102a58dc9c24"},"name":"podlators","normalized_name":"podlators","primary_namespace":"language/perl","description":"Convert POD data to various other formats"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-12-06T18:21:48.703Z","ingredient_id":"ce716f45-743d-56e6-9d06-102a58dc9c24","ingredient_version_id":"b131cae2-42e2-564e-a217-1266ea60ff62","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ce716f45-743d-56e6-9d06-102a58dc9c24/versions/b131cae2-42e2-564e-a217-1266ea60ff62","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/ce716f45-743d-56e6-9d06-102a58dc9c24"},"revision":2,"revision_timestamp":"2019-12-06T22:02:12.393Z","copyright_text":"perl_5","documentation_uri":"https://metacpan.org/pod/Pod::Man","is_binary_only":false,"license_expression":"(Artistic-1.0-Perl OR GPL-1.0-or-later)","release_timestamp":"2019-06-01T04:04:13.000Z","source_uri":"https://cpan.metacpan.org/authors/id/R/RR/RRA/podlators-4.12.tar.gz","sortable_version":["4","120","0"],"version":"4.12","activestate_license_expression":"unknown","dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/perl/948717da19630a5f003da4406da90fe1cbdec9ae493671c90dfb6d8b3d63b7eb/podlators-4.12.tar.gz","scanner_license_expression":"unknown","source_checksum":"948717da19630a5f003da4406da90fe1cbdec9ae493671c90dfb6d8b3d63b7eb","provided_features":[{"feature":"Pod::Man","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"Pod::ParseLink","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"Pod::Text","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"Pod::Text::Color","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"Pod::Text::Overstrike","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"Pod::Text::Termcap","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"},{"feature":"podlators","is_activestate_version":false,"is_default_provider":true,"namespace":"language/perl","sortable_version":["4","120","0"],"version":"4.12"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":null,"resolved_requirements":[]},{"alternatives":["51d0cb50-cb63-5d61-9312-03343731a5c7","189665e3-7ac1-52ab-8211-8ba1ca7815f7","801206d7-a69c-53fd-9f44-a39851413669","77fc8d23-fc48-5db5-b606-f5276c1bceff","8329dae3-9920-56ae-a768-6a4c64e52436","ac073035-67b4-5786-9aa3-0cb043936036"],"artifact_id":"50d60c15-ab99-5f25-bca9-e8db079f49d3","build_scripts":[{"build_script_id":"606265a1-ac03-48e0-a708-115cc5004e9a","creation_timestamp":"2019-10-01T16:56:10.414Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/606265a1-ac03-48e0-a708-115cc5004e9a"},"conditions":null,"language":"perl","script":"openssl-1.1.0-AS-Makefile.PL"}],"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"}],"ingredient":{"creation_timestamp":"2019-10-01T16:56:17.721Z","ingredient_id":"c1256669-2a2d-5cf2-8860-804bf43ceb5f","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c1256669-2a2d-5cf2-8860-804bf43ceb5f"},"name":"openssl","normalized_name":"openssl","primary_namespace":"shared","description":"Open Secure Sockets Layer general cryptography library."},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:56:17.721Z","ingredient_id":"c1256669-2a2d-5cf2-8860-804bf43ceb5f","ingredient_version_id":"865b7af2-2892-5cb4-8a61-100a21332b5c","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c1256669-2a2d-5cf2-8860-804bf43ceb5f/versions/865b7af2-2892-5cb4-8a61-100a21332b5c","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/c1256669-2a2d-5cf2-8860-804bf43ceb5f"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2019-05-28T00:00:00.000Z","source_uri":"https://www.openssl.org/source/openssl-1.1.0k.tar.gz","sortable_version":["1","10","0","11","0"],"version":"1.10.0.11","activestate_license_expression":"unknown","camel_extras":{"ppm_pkg":"no"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/shared/efa4965f4f773574d6cbda1cf874dbbe455ab1c0d4f906115f867d30444470b1/openssl-1.1.0k.tar.gz","scanner_license_expression":"unknown","source_checksum":"efa4965f4f773574d6cbda1cf874dbbe455ab1c0d4f906115f867d30444470b1","provided_features":[{"feature":"openssl","is_activestate_version":false,"is_default_provider":true,"namespace":"shared","sortable_version":["1","10","0","11","0"],"version":"1.10.0.11"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-10-01T16:56:13.279Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/402b7749-a78a-4913-8cf3-65f7457f0631"},"patch_id":"402b7749-a78a-4913-8cf3-65f7457f0631","conditions":null,"content":"/src/Libraries/patches/openssl/1.10.0.11/0001-Port-1.1.0h-patch-forward-to-1.1.0k.patch","description":"[PATCH 1/3] Port 1.1.0h patch forward to 1.1.0k","sequence_number":1},{"creation_timestamp":"2019-10-01T16:56:13.634Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/f44ea593-761b-44e0-8d29-509f1dd45e6a"},"patch_id":"f44ea593-761b-44e0-8d29-509f1dd45e6a","conditions":null,"content":"/src/Libraries/patches/openssl/1.10.0.11/0002-Disable-test_err.patch","description":"[PATCH 2/3] Disable test_err","sequence_number":2},{"creation_timestamp":"2019-10-01T16:56:13.998Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/d4e5c7df-8444-4a25-a4db-ffe0b86fa0d6"},"patch_id":"d4e5c7df-8444-4a25-a4db-ffe0b86fa0d6","conditions":null,"content":"/src/Libraries/patches/openssl/1.10.0.11/0003-Add-quotes-for-windows.patch","description":"[PATCH 3/3] Add quotes for windows\n\nOn windows the command for apps/openssl\nrequires quotes to work in runtime.","sequence_number":3}],"resolved_requirements":[{"feature":"openssl","namespace":"shared","version_requirements":[{"comparator":"gte","version":"0"},{"comparator":"lt","version":"1.11.0.0"}]}]},{"alternatives":[],"artifact_id":"6938f428-a31c-5347-8f0b-e1a9650addef","build_scripts":[{"build_script_id":"677467f0-5e38-4e3b-b623-9e8464a49f91","creation_timestamp":"2019-10-01T16:58:22.954Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/build-scripts/677467f0-5e38-4e3b-b623-9e8464a49f91"},"conditions":null,"language":"perl","script":"postgresql-9.5.4-AS-Makefile.PL"}],"dependencies":[{"dependency_types":["build"],"ingredient_version_id":"49530255-f4fa-5363-a4cc-2eb63cf5d6be"},{"dependency_types":["build"],"ingredient_version_id":"865b7af2-2892-5cb4-8a61-100a21332b5c"}],"ingredient":{"creation_timestamp":"2019-10-01T16:58:24.412Z","ingredient_id":"d89530be-8d94-5e35-b606-d7849f073e74","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d89530be-8d94-5e35-b606-d7849f073e74"},"name":"postgresql","normalized_name":"postgresql","primary_namespace":"shared","description":"An object-relational database system"},"ingredient_options":null,"ingredient_version":{"creation_timestamp":"2019-10-01T16:58:24.412Z","ingredient_id":"d89530be-8d94-5e35-b606-d7849f073e74","ingredient_version_id":"a873d528-56e8-5c19-b5cb-383be3bb9074","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d89530be-8d94-5e35-b606-d7849f073e74/versions/a873d528-56e8-5c19-b5cb-383be3bb9074","ingredient":"https://platform.activestate.com/sv/inventory-api-v1/v1/ingredients/d89530be-8d94-5e35-b606-d7849f073e74"},"revision":2,"revision_timestamp":"2019-10-24T21:51:00.179Z","copyright_text":"To be added.","is_binary_only":false,"license_expression":"Unknown","release_timestamp":"2017-05-08T00:00:00.000Z","source_uri":"https://s3.amazonaws.com/camel-sources/src/Libraries/vendor/postgresql-9.6.3.tar.gz","sortable_version":["9","6","3","0"],"version":"9.6.3","activestate_license_expression":"unknown","camel_extras":{"dont_build":["hpux","solaris"],"ppm_pkg":"no","skip_test":"yes"},"dependency_sets":null,"ingredient_options":null,"is_indemnified":true,"is_stable_release":true,"platform_source_uri":"s3://platform-sources/shared/df088372230b1dd21d87bb81686471508f4c42094d4f4f32b5d8e686fea69fa6/postgresql-9.6.3.tar.gz","scanner_license_expression":"unknown","source_checksum":"df088372230b1dd21d87bb81686471508f4c42094d4f4f32b5d8e686fea69fa6","provided_features":[{"feature":"postgresql","is_activestate_version":false,"is_default_provider":true,"namespace":"shared","sortable_version":["9","6","3","0"],"version":"9.6.3"}],"author_platform_user_id":"7f320133-2c9a-476e-9c09-8970ac525a8f","comment":"Created prior to addition of revision comments.","is_stable_revision":true},"patches":[{"creation_timestamp":"2019-10-01T16:58:23.305Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/4aafe925-353a-45d3-813a-2f32265e2eb4"},"patch_id":"4aafe925-353a-45d3-813a-2f32265e2eb4","conditions":null,"content":"/src/Libraries/patches/postgresql-9.5.4-win32.patch","description":"[PATCH 2/2] ActiveState patches for building under MinGW and MSVC","sequence_number":1},{"creation_timestamp":"2019-10-01T16:58:23.666Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/172db555-6bc9-4aeb-afec-ca22308daa4d"},"patch_id":"172db555-6bc9-4aeb-afec-ca22308daa4d","conditions":null,"content":"/src/Libraries/patches/postgresql-9.5.4-fix-old-sun-compiler.patch","description":"Don't use __attribute__ for versions of Sun C that don't\n support it","sequence_number":2},{"creation_timestamp":"2019-10-01T16:58:24.018Z","links":{"self":"https://platform.activestate.com/sv/inventory-api-v1/v1/patches/0de4632f-8673-49d4-a504-a94ccb9ea441"},"patch_id":"0de4632f-8673-49d4-a504-a94ccb9ea441","conditions":null,"content":"/src/Libraries/patches/postgresql-9.5.4-disable-shared.patch","description":"[PATCH 3/3] Patch back in support for --disable-shared, which was\n removed from Postgres starting in 9.3. This is basically just the reverse of\n 381a9ed.","sequence_number":3}],"resolved_requirements":[]}],"solver_version":0} \ No newline at end of file diff --git a/pkg/platform/runtime/testhelper/testhelper.go b/pkg/platform/runtime/testhelper/testhelper.go new file mode 100644 index 0000000000..5b3c0ff7f6 --- /dev/null +++ b/pkg/platform/runtime/testhelper/testhelper.go @@ -0,0 +1,73 @@ +package testhelper + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "path/filepath" + "testing" + + "github.com/ActiveState/cli/internal/environment" + "github.com/ActiveState/cli/pkg/platform/api/headchef/headchef_models" + "github.com/ActiveState/cli/pkg/platform/api/inventory/inventory_models" + "github.com/stretchr/testify/require" +) + +func dataPathErr() (string, error) { + root, err := environment.GetRootPath() + if err != nil { + return "", err + } + return filepath.Join(root, "pkg", "platform", "runtime", "testhelper", "data"), nil +} + +func dataPath(t *testing.T) string { + fp, err := dataPathErr() + require.NoError(t, err) + return fp +} + +func LoadRecipe(t *testing.T, name string) *inventory_models.Recipe { + d, err := ioutil.ReadFile(filepath.Join(dataPath(t), "recipes", fmt.Sprintf("%s.json", name))) + require.NoError(t, err) + + var recipe inventory_models.Recipe + err = json.Unmarshal(d, &recipe) + require.NoError(t, err) + + return &recipe +} + +func SaveRecipe(name string, m *inventory_models.Recipe) error { + return save("recipes", name, m) +} + +func save(dir, name string, m interface{}) error { + dp, err := dataPathErr() + if err != nil { + return err + } + fn := filepath.Join(dp, dir, fmt.Sprintf("%s.json", name)) + + d, err := json.Marshal(m) + if err != nil { + return err + } + + return ioutil.WriteFile(fn, d, 0666) +} + +func LoadBuildResponse(t *testing.T, name string) *headchef_models.BuildStatusResponse { + d, err := ioutil.ReadFile(filepath.Join(dataPath(t), "builds", fmt.Sprintf("%s.json", name))) + require.NoError(t, err) + + var status headchef_models.BuildStatusResponse + err = json.Unmarshal(d, &status) + require.NoError(t, err) + + return &status +} + +func SaveBuildResponse(name string, m *headchef_models.BuildStatusResponse) error { + return save("builds", name, m) +} diff --git a/pkg/platform/runtime/utils.go b/pkg/platform/runtime/utils.go deleted file mode 100644 index 7c066009ae..0000000000 --- a/pkg/platform/runtime/utils.go +++ /dev/null @@ -1,23 +0,0 @@ -package runtime - -import ( - "github.com/go-openapi/strfmt" -) - -func artifactsToUuids(artifacts []*HeadChefArtifact) []strfmt.UUID { - result := []strfmt.UUID{} - for _, v := range artifacts { - if v.ArtifactID != nil { - result = append(result, *v.ArtifactID) - } - } - return result -} - -func artifactCacheToUuids(artifacts []artifactCacheMeta) []strfmt.UUID { - result := []strfmt.UUID{} - for _, v := range artifacts { - result = append(result, v.ArtifactID) - } - return result -} diff --git a/scripts/progress-demo/main.go b/scripts/progress-demo/main.go new file mode 100644 index 0000000000..e76b8a5e4d --- /dev/null +++ b/scripts/progress-demo/main.go @@ -0,0 +1,138 @@ +package main + +import ( + "fmt" + "os" + "strings" + "sync" + "time" + + "github.com/ActiveState/cli/internal/runbits" + "github.com/ActiveState/cli/internal/testhelpers/outputhelper" + "github.com/ActiveState/cli/pkg/platform/runtime/setup/events" + "github.com/go-openapi/strfmt" +) + +// Demo for the runbits.RuntimeMessageHandler +// It demonstrates the installation (and optionally the remote build) of five artificial packages +// This script accepts two arguments +// +// +// Examples: +// 1. All five packages install successfully (no build step) +// go run -race ./scripts/progress-demo/demo +// 2. All five packages install successfully (with build step) +// go run -race ./scripts/progress-demo/demo true +// 3. The fourth package fails during the build step +// go run -race ./scripts/progress-demo/demo true nnnbn +// 4. The fourth package fails during the build step, and the second during the unpacking step, and the first one during the install step +// go run -race ./scripts/progress-demo/demo true iunbn + +func wait(times ...int) { + var factor time.Duration = 2 + if len(times) > 0 { + factor = time.Duration(times[0]) + } + time.Sleep(factor * 200 * time.Millisecond) +} + +func main() { + err := run() + if err != nil { + fmt.Println(err.Error()) + } +} + +type mockProducer struct { + IDs []strfmt.UUID + Names []string + Prod *events.RuntimeEventProducer + Failures string +} + +func (mp *mockProducer) NumArtifacts() int { + return len(mp.IDs) +} + +func newMockProducer(prod *events.RuntimeEventProducer, failures string) *mockProducer { + return &mockProducer{ + IDs: []strfmt.UUID{"1", "2", "3", "4", "5"}, + Names: []string{"pkg 1", "pkg 2", "pkg 3", "pkg 4", "a very long pkg name (5)"}, + Prod: prod, + Failures: failures, + } +} + +func (mp *mockProducer) mockStepProgress(index int, step events.SetupStep) bool { + mp.Prod.ArtifactStepStarting(step, mp.IDs[index], mp.Names[index], 100) + wait() + for i := 0; i < 10; i++ { + mp.Prod.ArtifactStepProgress(step, mp.IDs[index], 10) + wait() + } + if strings.ToLower(step.String())[0] == mp.Failures[index] { + mp.Prod.ArtifactStepFailed(step, mp.IDs[index], "error") + return false + } + mp.Prod.ArtifactStepCompleted(step, mp.IDs[index]) + return true +} + +func (mp *mockProducer) mockArtifactProgress(withBuild bool, index int) bool { + steps := []events.SetupStep{events.Download, events.Unpack, events.Install} + if withBuild { + steps = append([]events.SetupStep{events.Build}, steps...) + } + for _, s := range steps { + if !mp.mockStepProgress(index, s) { + return false + } + } + return true +} + +func run() error { + withBuildEvents := false + if len(os.Args) > 1 { + withBuildEvents = (os.Args[1] == "true") + } + failedSteps := "nnnnn" + if len(os.Args) > 2 { + failedSteps = os.Args[2] + if len(failedSteps) != 5 { + return fmt.Errorf("failure string needs to have length 5") + } + } + + prod := events.NewRuntimeEventProducer() + handler := runbits.DefaultRuntimeEventHandler(outputhelper.NewCatcher()) + + mock := newMockProducer(prod, failedSteps) + + go func() { + defer prod.Close() + + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + prod.TotalArtifacts(mock.NumArtifacts()) + if withBuildEvents { + prod.BuildStarting(mock.NumArtifacts()) + } + wait() + for i := 0; i < mock.NumArtifacts(); i++ { + wg.Add(1) + go func(withBuildEvents bool, index int) { + defer wg.Done() + mock.mockArtifactProgress(withBuildEvents, index) + }(withBuildEvents, i) + wait(8) + } + }() + wg.Wait() + }() + + handler.WaitForAllEvents(prod.Events()) + return nil +} diff --git a/test/integration/deploy_int_test.go b/test/integration/deploy_int_test.go index b715958a2e..4382995293 100644 --- a/test/integration/deploy_int_test.go +++ b/test/integration/deploy_int_test.go @@ -230,7 +230,6 @@ func (suite *DeployIntegrationTestSuite) InstallAndAssert(ts *e2e.Session) { ) cp.Expect("Installing Runtime") - cp.Expect("Downloading") cp.Expect("Installing", 120*time.Second) cp.Expect("Installation completed", 120*time.Second) cp.ExpectExitCode(0) diff --git a/vendor/github.com/acarl005/stripansi/LICENSE b/vendor/github.com/acarl005/stripansi/LICENSE new file mode 100644 index 0000000000..00abe0dbf4 --- /dev/null +++ b/vendor/github.com/acarl005/stripansi/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Andrew Carlson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/acarl005/stripansi/README.md b/vendor/github.com/acarl005/stripansi/README.md new file mode 100644 index 0000000000..8bdb1f5059 --- /dev/null +++ b/vendor/github.com/acarl005/stripansi/README.md @@ -0,0 +1,30 @@ +Strip ANSI +========== + +This Go package removes ANSI escape codes from strings. + +Ideally, we would prevent these from appearing in any text we want to process. +However, sometimes this can't be helped, and we need to be able to deal with that noise. +This will use a regexp to remove those unwanted escape codes. + + +## Install + +```sh +$ go get -u github.com/acarl005/stripansi +``` + +## Usage + +```go +import ( + "fmt" + "github.com/acarl005/stripansi" +) + +func main() { + msg := "\x1b[38;5;140m foo\x1b[0m bar" + cleanMsg := stripansi.Strip(msg) + fmt.Println(cleanMsg) // " foo bar" +} +``` diff --git a/vendor/github.com/acarl005/stripansi/stripansi.go b/vendor/github.com/acarl005/stripansi/stripansi.go new file mode 100644 index 0000000000..235732a782 --- /dev/null +++ b/vendor/github.com/acarl005/stripansi/stripansi.go @@ -0,0 +1,13 @@ +package stripansi + +import ( + "regexp" +) + +const ansi = "[\u001B\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))" + +var re = regexp.MustCompile(ansi) + +func Strip(str string) string { + return re.ReplaceAllString(str, "") +} diff --git a/vendor/github.com/faiface/mainthread/LICENSE b/vendor/github.com/faiface/mainthread/LICENSE new file mode 100644 index 0000000000..b497e83ab1 --- /dev/null +++ b/vendor/github.com/faiface/mainthread/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Michal Štrba + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/faiface/mainthread/README.md b/vendor/github.com/faiface/mainthread/README.md new file mode 100644 index 0000000000..20c834f22a --- /dev/null +++ b/vendor/github.com/faiface/mainthread/README.md @@ -0,0 +1,71 @@ +# mainthread [![GoDoc](https://godoc.org/github.com/faiface/mainthread?status.svg)](http://godoc.org/github.com/faiface/mainthread) [![Report card](https://goreportcard.com/badge/github.com/faiface/mainthread)](https://goreportcard.com/report/github.com/faiface/mainthread) + +Package mainthread allows you to run code on the main operating system thread. + +`go get github.com/faiface/mainthread` + +Operating systems often require, that code which deals with windows and graphics has to run on the +main thread. This is however somehow challenging in Go due to Go's concurrent nature. + +This package makes it easily possible. + +All you need to do is put your main code into a separate function and call `mainthread.Run` from +your real main, like this: + +```go +package main + +import ( + "fmt" + + "github.com/faiface/mainthread" +) + +func run() { + // now we can run stuff on the main thread like this + mainthread.Call(func() { + fmt.Println("printing from the main thread") + }) + fmt.Println("printing from another thread") +} + +func main() { + mainthread.Run(run) // enables mainthread package and runs run in a separate goroutine +} +``` + +## More functions + +If you don't wish to wait until a function finishes running on the main thread, use +`mainthread.CallNonBlock`: + +```go +mainthread.CallNonBlock(func() { + fmt.Println("i'm in the main thread") +}) +fmt.Println("but imma be likely printed first, cuz i don't wait") +``` + +If you want to get some value returned from the main thread, you can use `mainthread.CallErr` or +`mainthread.CallVal`: + +```go +err := mainthread.CallErr(func() error { + return nil // i don't do nothing wrong +}) +val := mainthread.CallVal(func() interface{} { + return 42 // the meaning of life, universe and everything +}) +``` + +If `mainthread.CallErr` or `mainthread.CallVal` aren't sufficient for you, you can just assign +variables from within the main thread: + +```go +var x, y int +mainthread.Call(func() { + x, y = 1, 2 +}) +``` + +However, be careful with `mainthread.CallNonBlock` when dealing with local variables. diff --git a/vendor/github.com/faiface/mainthread/mainthread.go b/vendor/github.com/faiface/mainthread/mainthread.go new file mode 100644 index 0000000000..7964520032 --- /dev/null +++ b/vendor/github.com/faiface/mainthread/mainthread.go @@ -0,0 +1,87 @@ +package mainthread + +import ( + "errors" + "runtime" +) + +// CallQueueCap is the capacity of the call queue. This means how many calls to CallNonBlock will not +// block until some call finishes. +// +// The default value is 16 and should be good for 99% usecases. +var CallQueueCap = 16 + +var ( + callQueue chan func() +) + +func init() { + runtime.LockOSThread() +} + +func checkRun() { + if callQueue == nil { + panic(errors.New("mainthread: did not call Run")) + } +} + +// Run enables mainthread package functionality. To use mainthread package, put your main function +// code into the run function (the argument to Run) and simply call Run from the real main function. +// +// Run returns when run (argument) function finishes. +func Run(run func()) { + callQueue = make(chan func(), CallQueueCap) + + done := make(chan struct{}) + go func() { + run() + done <- struct{}{} + }() + + for { + select { + case f := <-callQueue: + f() + case <-done: + return + } + } +} + +// CallNonBlock queues function f on the main thread and returns immediately. Does not wait until f +// finishes. +func CallNonBlock(f func()) { + checkRun() + callQueue <- f +} + +// Call queues function f on the main thread and blocks until the function f finishes. +func Call(f func()) { + checkRun() + done := make(chan struct{}) + callQueue <- func() { + f() + done <- struct{}{} + } + <-done +} + +// CallErr queues function f on the main thread and returns an error returned by f. +func CallErr(f func() error) error { + checkRun() + errChan := make(chan error) + callQueue <- func() { + errChan <- f() + } + return <-errChan +} + +// CallVal queues function f on the main thread and returns a value returned by f. +func CallVal(f func() interface{}) interface{} { + checkRun() + respChan := make(chan interface{}) + callQueue <- func() { + respChan <- f() + } + return <-respChan +} diff --git a/vendor/github.com/gammazero/deque/.gitignore b/vendor/github.com/gammazero/deque/.gitignore new file mode 100644 index 0000000000..b33406fb09 --- /dev/null +++ b/vendor/github.com/gammazero/deque/.gitignore @@ -0,0 +1,26 @@ +*~ + +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof diff --git a/vendor/github.com/gammazero/deque/.travis.yml b/vendor/github.com/gammazero/deque/.travis.yml new file mode 100644 index 0000000000..69e6ab3b31 --- /dev/null +++ b/vendor/github.com/gammazero/deque/.travis.yml @@ -0,0 +1,15 @@ +language: go + +go: + - 1.13.x + - 1.14.x + - tip + +before_script: + - go vet ./... + +script: + - ./go.test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/gammazero/deque/LICENSE b/vendor/github.com/gammazero/deque/LICENSE new file mode 100644 index 0000000000..0566f2661b --- /dev/null +++ b/vendor/github.com/gammazero/deque/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Andrew J. Gillis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/gammazero/deque/README.md b/vendor/github.com/gammazero/deque/README.md new file mode 100644 index 0000000000..1448db8152 --- /dev/null +++ b/vendor/github.com/gammazero/deque/README.md @@ -0,0 +1,73 @@ +# deque + +[![Build Status](https://travis-ci.com/gammazero/deque.svg)](https://travis-ci.com/gammazero/deque) +[![Go Report Card](https://goreportcard.com/badge/github.com/gammazero/deque)](https://goreportcard.com/report/github.com/gammazero/deque) +[![codecov](https://codecov.io/gh/gammazero/deque/branch/master/graph/badge.svg)](https://codecov.io/gh/gammazero/deque) +[![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) + +Fast ring-buffer deque ([double-ended queue](https://en.wikipedia.org/wiki/Double-ended_queue)) implementation. + +[![GoDoc](https://godoc.org/github.com/gammazero/deque?status.svg)](https://godoc.org/github.com/gammazero/deque) + +For a pictorial description, see the [Deque diagram](https://github.com/gammazero/deque/wiki) + +## Installation + +``` +$ go get github.com/gammazero/deque +``` + +## Deque data structure + +Deque generalizes a queue and a stack, to efficiently add and remove items at either end with O(1) performance. [Queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) (FIFO) operations are supported using `PushBack()` and `PopFront()`. [Stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) (LIFO) operations are supported using `PushBack()` and `PopBack()`. + +## Ring-buffer Performance + +This deque implementation is optimized for CPU and GC performance. The circular buffer automatically re-sizes by powers of two, growing when additional capacity is needed and shrinking when only a quarter of the capacity is used, and uses bitwise arithmetic for all calculations. Since growth is by powers of two, adding elements will only cause O(log n) allocations. + +The ring-buffer implementation improves memory and time performance with fewer GC pauses, compared to implementations based on slices and linked lists. By wrapping around the buffer, previously used space is reused, making allocation unnecessary until all buffer capacity is used. This is particularly efficient when data going into the dequeue is relatively balanced against data coming out. However, if size changes are very large and only fill and then empty then deque, the ring structure offers little benefit for memory reuse. For that usage pattern a different implementation may be preferable. + +For maximum speed, this deque implementation leaves concurrency safety up to the application to provide, however the application chooses, if needed at all. + +## Reading Empty Deque + +Since it is OK for the deque to contain a nil value, it is necessary to either panic or return a second boolean value to indicate the deque is empty, when reading or removing an element. This deque panics when reading from an empty deque. This is a run-time check to help catch programming errors, which may be missed if a second return value is ignored. Simply check Deque.Len() before reading from the deque. + +## Example + +```go +package main + +import ( + "fmt" + "github.com/gammazero/deque" +) + +func main() { + var q deque.Deque + q.PushBack("foo") + q.PushBack("bar") + q.PushBack("baz") + + fmt.Println(q.Len()) // Prints: 3 + fmt.Println(q.Front()) // Prints: foo + fmt.Println(q.Back()) // Prints: baz + + q.PopFront() // remove "foo" + q.PopBack() // remove "baz" + + q.PushFront("hello") + q.PushBack("world") + + // Consume deque and print elements. + for q.Len() != 0 { + fmt.Println(q.PopFront()) + } +} +``` + +## Uses + +Deque can be used as both a: +- [Queue](https://en.wikipedia.org/wiki/Queue_(abstract_data_type)) using `PushBack` and `PopFront` +- [Stack](https://en.wikipedia.org/wiki/Stack_(abstract_data_type)) using `PushBack` and `PopBack` diff --git a/vendor/github.com/gammazero/deque/deque.go b/vendor/github.com/gammazero/deque/deque.go new file mode 100644 index 0000000000..71949620e3 --- /dev/null +++ b/vendor/github.com/gammazero/deque/deque.go @@ -0,0 +1,254 @@ +package deque + +// minCapacity is the smallest capacity that deque may have. +// Must be power of 2 for bitwise modulus: x % n == x & (n - 1). +const minCapacity = 16 + +// Deque represents a single instance of the deque data structure. +type Deque struct { + buf []interface{} + head int + tail int + count int + minCap int +} + +// Len returns the number of elements currently stored in the queue. +func (q *Deque) Len() int { + return q.count +} + +// PushBack appends an element to the back of the queue. Implements FIFO when +// elements are removed with PopFront(), and LIFO when elements are removed +// with PopBack(). +func (q *Deque) PushBack(elem interface{}) { + q.growIfFull() + + q.buf[q.tail] = elem + // Calculate new tail position. + q.tail = q.next(q.tail) + q.count++ +} + +// PushFront prepends an element to the front of the queue. +func (q *Deque) PushFront(elem interface{}) { + q.growIfFull() + + // Calculate new head position. + q.head = q.prev(q.head) + q.buf[q.head] = elem + q.count++ +} + +// PopFront removes and returns the element from the front of the queue. +// Implements FIFO when used with PushBack(). If the queue is empty, the call +// panics. +func (q *Deque) PopFront() interface{} { + if q.count <= 0 { + panic("deque: PopFront() called on empty queue") + } + ret := q.buf[q.head] + q.buf[q.head] = nil + // Calculate new head position. + q.head = q.next(q.head) + q.count-- + + q.shrinkIfExcess() + return ret +} + +// PopBack removes and returns the element from the back of the queue. +// Implements LIFO when used with PushBack(). If the queue is empty, the call +// panics. +func (q *Deque) PopBack() interface{} { + if q.count <= 0 { + panic("deque: PopBack() called on empty queue") + } + + // Calculate new tail position + q.tail = q.prev(q.tail) + + // Remove value at tail. + ret := q.buf[q.tail] + q.buf[q.tail] = nil + q.count-- + + q.shrinkIfExcess() + return ret +} + +// Front returns the element at the front of the queue. This is the element +// that would be returned by PopFront(). This call panics if the queue is +// empty. +func (q *Deque) Front() interface{} { + if q.count <= 0 { + panic("deque: Front() called when empty") + } + return q.buf[q.head] +} + +// Back returns the element at the back of the queue. This is the element +// that would be returned by PopBack(). This call panics if the queue is +// empty. +func (q *Deque) Back() interface{} { + if q.count <= 0 { + panic("deque: Back() called when empty") + } + return q.buf[q.prev(q.tail)] +} + +// At returns the element at index i in the queue without removing the element +// from the queue. This method accepts only non-negative index values. At(0) +// refers to the first element and is the same as Front(). At(Len()-1) refers +// to the last element and is the same as Back(). If the index is invalid, the +// call panics. +// +// The purpose of At is to allow Deque to serve as a more general purpose +// circular buffer, where items are only added to and removed from the ends of +// the deque, but may be read from any place within the deque. Consider the +// case of a fixed-size circular log buffer: A new entry is pushed onto one end +// and when full the oldest is popped from the other end. All the log entries +// in the buffer must be readable without altering the buffer contents. +func (q *Deque) At(i int) interface{} { + if i < 0 || i >= q.count { + panic("deque: At() called with index out of range") + } + // bitwise modulus + return q.buf[(q.head+i)&(len(q.buf)-1)] +} + +// Set puts the element at index i in the queue. Set shares the same purpose +// than At() but perform the opposite operation. The index i is the same +// index defined by At(). If the index is invalid, the call panics. +func (q *Deque) Set(i int, elem interface{}) { + if i < 0 || i >= q.count { + panic("deque: Set() called with index out of range") + } + // bitwise modulus + q.buf[(q.head+i)&(len(q.buf)-1)] = elem +} + +// Clear removes all elements from the queue, but retains the current capacity. +// This is useful when repeatedly reusing the queue at high frequency to avoid +// GC during reuse. The queue will not be resized smaller as long as items are +// only added. Only when items are removed is the queue subject to getting +// resized smaller. +func (q *Deque) Clear() { + // bitwise modulus + modBits := len(q.buf) - 1 + for h := q.head; h != q.tail; h = (h + 1) & modBits { + q.buf[h] = nil + } + q.head = 0 + q.tail = 0 + q.count = 0 +} + +// Rotate rotates the deque n steps front-to-back. If n is negative, rotates +// back-to-front. Having Deque provide Rotate() avoids resizing that could +// happen if implementing rotation using only Pop and Push methods. +func (q *Deque) Rotate(n int) { + if q.count <= 1 { + return + } + // Rotating a multiple of q.count is same as no rotation. + n %= q.count + if n == 0 { + return + } + + modBits := len(q.buf) - 1 + // If no empty space in buffer, only move head and tail indexes. + if q.head == q.tail { + // Calculate new head and tail using bitwise modulus. + q.head = (q.head + n) & modBits + q.tail = (q.tail + n) & modBits + return + } + + if n < 0 { + // Rotate back to front. + for ; n < 0; n++ { + // Calculate new head and tail using bitwise modulus. + q.head = (q.head - 1) & modBits + q.tail = (q.tail - 1) & modBits + // Put tail value at head and remove value at tail. + q.buf[q.head] = q.buf[q.tail] + q.buf[q.tail] = nil + } + return + } + + // Rotate front to back. + for ; n > 0; n-- { + // Put head value at tail and remove value at head. + q.buf[q.tail] = q.buf[q.head] + q.buf[q.head] = nil + // Calculate new head and tail using bitwise modulus. + q.head = (q.head + 1) & modBits + q.tail = (q.tail + 1) & modBits + } +} + +// SetMinCapacity sets a minimum capacity of 2^minCapacityExp. If the value of +// the minimum capacity is less than or equal to the minimum allowed, then +// capacity is set to the minimum allowed. This may be called at anytime to +// set a new minimum capacity. +// +// Setting a larger minimum capacity may be used to prevent resizing when the +// number of stored items changes frequently across a wide range. +func (q *Deque) SetMinCapacity(minCapacityExp uint) { + if 1< minCapacity { + q.minCap = 1 << minCapacityExp + } else { + q.minCap = minCapacity + } +} + +// prev returns the previous buffer position wrapping around buffer. +func (q *Deque) prev(i int) int { + return (i - 1) & (len(q.buf) - 1) // bitwise modulus +} + +// next returns the next buffer position wrapping around buffer. +func (q *Deque) next(i int) int { + return (i + 1) & (len(q.buf) - 1) // bitwise modulus +} + +// growIfFull resizes up if the buffer is full. +func (q *Deque) growIfFull() { + if len(q.buf) == 0 { + if q.minCap == 0 { + q.minCap = minCapacity + } + q.buf = make([]interface{}, q.minCap) + return + } + if q.count == len(q.buf) { + q.resize() + } +} + +// shrinkIfExcess resize down if the buffer 1/4 full. +func (q *Deque) shrinkIfExcess() { + if len(q.buf) > q.minCap && (q.count<<2) == len(q.buf) { + q.resize() + } +} + +// resize resizes the deque to fit exactly twice its current contents. This is +// used to grow the queue when it is full, and also to shrink it when it is +// only a quarter full. +func (q *Deque) resize() { + newBuf := make([]interface{}, q.count<<1) + if q.tail > q.head { + copy(newBuf, q.buf[q.head:q.tail]) + } else { + n := copy(newBuf, q.buf[q.head:]) + copy(newBuf[n:], q.buf[:q.tail]) + } + + q.head = 0 + q.tail = q.count + q.buf = newBuf +} diff --git a/vendor/github.com/gammazero/deque/doc.go b/vendor/github.com/gammazero/deque/doc.go new file mode 100644 index 0000000000..c9647f983c --- /dev/null +++ b/vendor/github.com/gammazero/deque/doc.go @@ -0,0 +1,34 @@ +/* +Package deque provides a fast ring-buffer deque (double-ended queue) +implementation. + +Deque generalizes a queue and a stack, to efficiently add and remove items at +either end with O(1) performance. Queue (FIFO) operations are supported using +PushBack() and PopFront(). Stack (LIFO) operations are supported using +PushBack() and PopBack(). + +Ring-buffer Performance + +The ring-buffer automatically resizes by +powers of two, growing when additional capacity is needed and shrinking when +only a quarter of the capacity is used, and uses bitwise arithmetic for all +calculations. + +The ring-buffer implementation significantly improves memory and time +performance with fewer GC pauses, compared to implementations based on slices +and linked lists. + +For maximum speed, this deque implementation leaves concurrency safety up to +the application to provide, however the application chooses, if needed at all. + +Reading Empty Deque + +Since it is OK for the deque to contain a nil value, it is necessary to either +panic or return a second boolean value to indicate the deque is empty, when +reading or removing an element. This deque panics when reading from an empty +deque. This is a run-time check to help catch programming errors, which may be +missed if a second return value is ignored. Simply check Deque.Len() before +reading from the deque. + +*/ +package deque diff --git a/vendor/github.com/gammazero/deque/go.mod b/vendor/github.com/gammazero/deque/go.mod new file mode 100644 index 0000000000..a63a33aece --- /dev/null +++ b/vendor/github.com/gammazero/deque/go.mod @@ -0,0 +1,3 @@ +module github.com/gammazero/deque + +go 1.12 diff --git a/vendor/github.com/gammazero/deque/go.test.sh b/vendor/github.com/gammazero/deque/go.test.sh new file mode 100644 index 0000000000..494b176ba1 --- /dev/null +++ b/vendor/github.com/gammazero/deque/go.test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -coverprofile=profile.out -covermode=atomic $d + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/gammazero/workerpool/.gitignore b/vendor/github.com/gammazero/workerpool/.gitignore new file mode 100644 index 0000000000..ff737f5aa2 --- /dev/null +++ b/vendor/github.com/gammazero/workerpool/.gitignore @@ -0,0 +1,28 @@ +*~ + +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof + +coverage.out diff --git a/vendor/github.com/gammazero/workerpool/.travis.yml b/vendor/github.com/gammazero/workerpool/.travis.yml new file mode 100644 index 0000000000..fd89806664 --- /dev/null +++ b/vendor/github.com/gammazero/workerpool/.travis.yml @@ -0,0 +1,15 @@ +language: go + +go: + - 1.14.x + - 1.15.x + - tip + +before_script: + - go vet ./... + +script: + - ./go.test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/gammazero/workerpool/LICENSE b/vendor/github.com/gammazero/workerpool/LICENSE new file mode 100644 index 0000000000..f6ff6ce9da --- /dev/null +++ b/vendor/github.com/gammazero/workerpool/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Andrew J. Gillis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/gammazero/workerpool/README.md b/vendor/github.com/gammazero/workerpool/README.md new file mode 100644 index 0000000000..bcf37d1009 --- /dev/null +++ b/vendor/github.com/gammazero/workerpool/README.md @@ -0,0 +1,52 @@ +# workerpool +[![Build Status](https://travis-ci.com/gammazero/workerpool.svg)](https://travis-ci.com/gammazero/workerpool) +[![Go Report Card](https://goreportcard.com/badge/github.com/gammazero/workerpool)](https://goreportcard.com/report/github.com/gammazero/workerpool) +[![codecov](https://codecov.io/gh/gammazero/workerpool/branch/master/graph/badge.svg)](https://codecov.io/gh/gammazero/workerpool) +[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/gammazero/workerpool/blob/master/LICENSE) + +Concurrency limiting goroutine pool. Limits the concurrency of task execution, not the number of tasks queued. Never blocks submitting tasks, no matter how many tasks are queued. + +[![GoDoc](https://godoc.org/github.com/gammazero/workerpool?status.svg)](https://godoc.org/github.com/gammazero/workerpool) + +This implementation builds on ideas from the following: + +- http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang +- http://nesv.github.io/golang/2014/02/25/worker-queues-in-go.html + +## Installation +To install this package, you need to setup your Go workspace. The simplest way to install the library is to run: +``` +$ go get github.com/gammazero/workerpool +``` + +## Example +```go +package main + +import ( + "fmt" + "github.com/gammazero/workerpool" +) + +func main() { + wp := workerpool.New(2) + requests := []string{"alpha", "beta", "gamma", "delta", "epsilon"} + + for _, r := range requests { + r := r + wp.Submit(func() { + fmt.Println("Handling request:", r) + }) + } + + wp.StopWait() +} +``` + +## Usage Note + +There is no upper limit on the number of tasks queued, other than the limits of system resources. If the number of inbound tasks is too many to even queue for pending processing, then the solution is outside the scope of workerpool, and should be solved by distributing load over multiple systems, and/or storing input for pending processing in intermediate storage such as a file system, distributed message queue, etc. + +## Real world examples + +The list of open source projects using worker pool can be found [here](https://github.com/gammazero/workerpool/wiki#open-projects-using-workerpool) diff --git a/vendor/github.com/gammazero/workerpool/doc.go b/vendor/github.com/gammazero/workerpool/doc.go new file mode 100644 index 0000000000..c189fde821 --- /dev/null +++ b/vendor/github.com/gammazero/workerpool/doc.go @@ -0,0 +1,66 @@ +/* +Package workerpool queues work to a limited number of goroutines. + +The purpose of the worker pool is to limit the concurrency of tasks +executed by the workers. This is useful when performing tasks that require +sufficient resources (CPU, memory, etc.), and running too many tasks at the +same time would exhaust resources. + +Non-blocking task submission + +A task is a function submitted to the worker pool for execution. Submitting +tasks to this worker pool will not block, regardless of the number of tasks. +Incoming tasks are immediately dispatched to an available +worker. If no worker is immediately available, or there are already tasks +waiting for an available worker, then the task is put on a waiting queue to +wait for an available worker. + +The intent of the worker pool is to limit the concurrency of task execution, +not limit the number of tasks queued to be executed. Therefore, this unbounded +input of tasks is acceptable as the tasks cannot be discarded. If the number +of inbound tasks is too many to even queue for pending processing, then the +solution is outside the scope of workerpool, and should be solved by +distributing load over multiple systems, and/or storing input for pending +processing in intermediate storage such as a database, file system, distributed +message queue, etc. + +Dispatcher + +This worker pool uses a single dispatcher goroutine to read tasks from the +input task queue and dispatch them to worker goroutines. This allows for a +small input channel, and lets the dispatcher queue as many tasks as are +submitted when there are no available workers. Additionally, the dispatcher +can adjust the number of workers as appropriate for the work load, without +having to utilize locked counters and checks incurred on task submission. + +When no tasks have been submitted for a period of time, a worker is removed by +the dispatcher. This is done until there are no more workers to remove. The +minimum number of workers is always zero, because the time to start new workers +is insignificant. + +Usage note + +It is advisable to use different worker pools for tasks that are bound by +different resources, or that have different resource use patterns. For +example, tasks that use X Mb of memory may need different concurrency limits +than tasks that use Y Mb of memory. + +Waiting queue vs goroutines + +When there are no available workers to handle incoming tasks, the tasks are put +on a waiting queue, in this implementation. In implementations mentioned in +the credits below, these tasks were passed to goroutines. Using a queue is +faster and has less memory overhead than creating a separate goroutine for each +waiting task, allowing a much higher number of waiting tasks. Also, using a +waiting queue ensures that tasks are given to workers in the order the tasks +were received. + +Credits + +This implementation builds on ideas from the following: + +http://marcio.io/2015/07/handling-1-million-requests-per-minute-with-golang +http://nesv.github.io/golang/2014/02/25/worker-queues-in-go.html + +*/ +package workerpool diff --git a/vendor/github.com/gammazero/workerpool/go.mod b/vendor/github.com/gammazero/workerpool/go.mod new file mode 100644 index 0000000000..a59dbec22f --- /dev/null +++ b/vendor/github.com/gammazero/workerpool/go.mod @@ -0,0 +1,5 @@ +module github.com/gammazero/workerpool + +require github.com/gammazero/deque v0.0.0-20200721202602-07291166fe33 + +go 1.14 diff --git a/vendor/github.com/gammazero/workerpool/go.sum b/vendor/github.com/gammazero/workerpool/go.sum new file mode 100644 index 0000000000..0dea262f3c --- /dev/null +++ b/vendor/github.com/gammazero/workerpool/go.sum @@ -0,0 +1,2 @@ +github.com/gammazero/deque v0.0.0-20200721202602-07291166fe33 h1:UG4wNrJX9xSKnm/Gck5yTbxnOhpNleuE4MQRdmcGySo= +github.com/gammazero/deque v0.0.0-20200721202602-07291166fe33/go.mod h1:D90+MBHVc9Sk1lJAbEVgws0eYEurY4mv2TDso3Nxh3w= diff --git a/vendor/github.com/gammazero/workerpool/go.test.sh b/vendor/github.com/gammazero/workerpool/go.test.sh new file mode 100644 index 0000000000..34dbbfb316 --- /dev/null +++ b/vendor/github.com/gammazero/workerpool/go.test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -race -coverprofile=profile.out -covermode=atomic $d + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/gammazero/workerpool/workerpool.go b/vendor/github.com/gammazero/workerpool/workerpool.go new file mode 100644 index 0000000000..4ccca1276b --- /dev/null +++ b/vendor/github.com/gammazero/workerpool/workerpool.go @@ -0,0 +1,305 @@ +package workerpool + +import ( + "context" + "sync" + "sync/atomic" + "time" + + "github.com/gammazero/deque" +) + +const ( + // If workes idle for at least this period of time, then stop a worker. + idleTimeout = 2 * time.Second +) + +// New creates and starts a pool of worker goroutines. +// +// The maxWorkers parameter specifies the maximum number of workers that can +// execute tasks concurrently. When there are no incoming tasks, workers are +// gradually stopped until there are no remaining workers. +func New(maxWorkers int) *WorkerPool { + // There must be at least one worker. + if maxWorkers < 1 { + maxWorkers = 1 + } + + pool := &WorkerPool{ + maxWorkers: maxWorkers, + taskQueue: make(chan func(), 1), + workerQueue: make(chan func()), + stopSignal: make(chan struct{}), + stoppedChan: make(chan struct{}), + } + + // Start the task dispatcher. + go pool.dispatch() + + return pool +} + +// WorkerPool is a collection of goroutines, where the number of concurrent +// goroutines processing requests does not exceed the specified maximum. +type WorkerPool struct { + maxWorkers int + taskQueue chan func() + workerQueue chan func() + stoppedChan chan struct{} + stopSignal chan struct{} + waitingQueue deque.Deque + stopLock sync.Mutex + stopOnce sync.Once + stopped bool + waiting int32 + wait bool +} + +// Size returns the maximum number of concurrent workers. +func (p *WorkerPool) Size() int { + return p.maxWorkers +} + +// Stop stops the worker pool and waits for only currently running tasks to +// complete. Pending tasks that are not currently running are abandoned. +// Tasks must not be submitted to the worker pool after calling stop. +// +// Since creating the worker pool starts at least one goroutine, for the +// dispatcher, Stop() or StopWait() should be called when the worker pool is no +// longer needed. +func (p *WorkerPool) Stop() { + p.stop(false) +} + +// StopWait stops the worker pool and waits for all queued tasks tasks to +// complete. No additional tasks may be submitted, but all pending tasks are +// executed by workers before this function returns. +func (p *WorkerPool) StopWait() { + p.stop(true) +} + +// Stopped returns true if this worker pool has been stopped. +func (p *WorkerPool) Stopped() bool { + p.stopLock.Lock() + defer p.stopLock.Unlock() + return p.stopped +} + +// Submit enqueues a function for a worker to execute. +// +// Any external values needed by the task function must be captured in a +// closure. Any return values should be returned over a channel that is +// captured in the task function closure. +// +// Submit will not block regardless of the number of tasks submitted. Each +// task is immediately given to an available worker or to a newly started +// worker. If there are no available workers, and the maximum number of +// workers are already created, then the task is put onto a waiting queue. +// +// When there are tasks on the waiting queue, any additional new tasks are put +// on the waiting queue. Tasks are removed from the waiting queue as workers +// become available. +// +// As long as no new tasks arrive, one available worker is shutdown each time +// period until there are no more idle workers. Since the time to start new +// goroutines is not significant, there is no need to retain idle workers +// indefinitely. +func (p *WorkerPool) Submit(task func()) { + if task != nil { + p.taskQueue <- task + } +} + +// SubmitWait enqueues the given function and waits for it to be executed. +func (p *WorkerPool) SubmitWait(task func()) { + if task == nil { + return + } + doneChan := make(chan struct{}) + p.taskQueue <- func() { + task() + close(doneChan) + } + <-doneChan +} + +// WaitingQueueSize returns the count of tasks in the waiting queue. +func (p *WorkerPool) WaitingQueueSize() int { + return int(atomic.LoadInt32(&p.waiting)) +} + +// Pause causes all workers to wait on the given Context, thereby making them +// unavailable to run tasks. Pause returns when all workers are waiting. +// Tasks can continue to be queued to the workerpool, but are not executed +// until the Context is canceled or times out. +// +// Calling Pause when the worker pool is already paused causes Pause to wait +// until all previous pauses are canceled. This allows a goroutine to take +// control of pausing and unpausing the pool as soon as other goroutines have +// unpaused it. +// +// When the workerpool is stopped, workers are unpaused and queued tasks are +// executed during StopWait. +func (p *WorkerPool) Pause(ctx context.Context) { + p.stopLock.Lock() + defer p.stopLock.Unlock() + if p.stopped { + return + } + ready := new(sync.WaitGroup) + ready.Add(p.maxWorkers) + for i := 0; i < p.maxWorkers; i++ { + p.Submit(func() { + ready.Done() + select { + case <-ctx.Done(): + case <-p.stopSignal: + } + }) + } + // Wait for workers to all be paused + ready.Wait() +} + +// dispatch sends the next queued task to an available worker. +func (p *WorkerPool) dispatch() { + defer close(p.stoppedChan) + timeout := time.NewTimer(idleTimeout) + var workerCount int + var idle bool + +Loop: + for { + // As long as tasks are in the waiting queue, incoming tasks are put + // into the waiting queue and tasks to run are taken from the waiting + // queue. Once the waiting queue is empty, then go back to submitting + // incoming tasks directly to available workers. + if p.waitingQueue.Len() != 0 { + if !p.processWaitingQueue() { + break Loop + } + continue + } + + select { + case task, ok := <-p.taskQueue: + if !ok { + break Loop + } + // Got a task to do. + select { + case p.workerQueue <- task: + default: + // Create a new worker, if not at max. + if workerCount < p.maxWorkers { + go startWorker(task, p.workerQueue) + workerCount++ + } else { + // Enqueue task to be executed by next available worker. + p.waitingQueue.PushBack(task) + atomic.StoreInt32(&p.waiting, int32(p.waitingQueue.Len())) + } + } + idle = false + case <-timeout.C: + // Timed out waiting for work to arrive. Kill a ready worker if + // pool has been idle for a whole timeout. + if idle && workerCount > 0 { + if p.killIdleWorker() { + workerCount-- + } + } + idle = true + timeout.Reset(idleTimeout) + } + } + + // If instructed to wait, then run tasks that are already queued. + if p.wait { + p.runQueuedTasks() + } + + // Stop all remaining workers as they become ready. + for workerCount > 0 { + p.workerQueue <- nil + workerCount-- + } + + timeout.Stop() +} + +// startWorker runs initial task, then starts a worker waiting for more. +func startWorker(task func(), workerQueue chan func()) { + task() + go worker(workerQueue) +} + +// worker executes tasks and stops when it receives a nil task. +func worker(workerQueue chan func()) { + for task := range workerQueue { + if task == nil { + return + } + task() + } +} + +// stop tells the dispatcher to exit, and whether or not to complete queued +// tasks. +func (p *WorkerPool) stop(wait bool) { + p.stopOnce.Do(func() { + // Signal that workerpool is stopping, to unpause any paused workers. + close(p.stopSignal) + // Acquire stopLock to wait for any pause in progress to complete. All + // in-progress pauses will complete because the stopSignal unpauses the + // workers. + p.stopLock.Lock() + // The stopped flag prevents any additional paused workers. This makes + // it safe to close the taskQueue. + p.stopped = true + p.stopLock.Unlock() + p.wait = wait + // Close task queue and wait for currently running tasks to finish. + close(p.taskQueue) + }) + <-p.stoppedChan +} + +// processWaitingQueue puts new tasks onto the the waiting queue, and removes +// tasks from the waiting queue as workers become available. Returns false if +// worker pool is stopped. +func (p *WorkerPool) processWaitingQueue() bool { + select { + case task, ok := <-p.taskQueue: + if !ok { + return false + } + p.waitingQueue.PushBack(task) + case p.workerQueue <- p.waitingQueue.Front().(func()): + // A worker was ready, so gave task to worker. + p.waitingQueue.PopFront() + } + atomic.StoreInt32(&p.waiting, int32(p.waitingQueue.Len())) + return true +} + +func (p *WorkerPool) killIdleWorker() bool { + select { + case p.workerQueue <- nil: + // Sent kill signal to worker. + return true + default: + // No ready workers. All, if any, workers are busy. + return false + } +} + +// runQueuedTasks removes each task from the waiting queue and gives it to +// workers until queue is empty. +func (p *WorkerPool) runQueuedTasks() { + for p.waitingQueue.Len() != 0 { + // A worker is ready, so give task to worker. + p.workerQueue <- p.waitingQueue.PopFront().(func()) + atomic.StoreInt32(&p.waiting, int32(p.waitingQueue.Len())) + } +} diff --git a/vendor/github.com/mattn/go-runewidth/.travis.yml b/vendor/github.com/mattn/go-runewidth/.travis.yml index 5c9c2a30f0..6a21813a3e 100644 --- a/vendor/github.com/mattn/go-runewidth/.travis.yml +++ b/vendor/github.com/mattn/go-runewidth/.travis.yml @@ -1,8 +1,16 @@ language: go +sudo: false go: + - 1.13.x - tip + before_install: - - go get github.com/mattn/goveralls - - go get golang.org/x/tools/cmd/cover + - go get -t -v ./... + script: - - $HOME/gopath/bin/goveralls -repotoken lAKAWPzcGsD3A8yBX3BGGtRUdJ6CaGERL + - go generate + - git diff --cached --exit-code + - ./go.test.sh + +after_success: + - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/mattn/go-runewidth/README.mkd b/vendor/github.com/mattn/go-runewidth/README.md similarity index 82% rename from vendor/github.com/mattn/go-runewidth/README.mkd rename to vendor/github.com/mattn/go-runewidth/README.md index 66663a94b0..aa56ab96c2 100644 --- a/vendor/github.com/mattn/go-runewidth/README.mkd +++ b/vendor/github.com/mattn/go-runewidth/README.md @@ -2,7 +2,7 @@ go-runewidth ============ [![Build Status](https://travis-ci.org/mattn/go-runewidth.png?branch=master)](https://travis-ci.org/mattn/go-runewidth) -[![Coverage Status](https://coveralls.io/repos/mattn/go-runewidth/badge.png?branch=HEAD)](https://coveralls.io/r/mattn/go-runewidth?branch=HEAD) +[![Codecov](https://codecov.io/gh/mattn/go-runewidth/branch/master/graph/badge.svg)](https://codecov.io/gh/mattn/go-runewidth) [![GoDoc](https://godoc.org/github.com/mattn/go-runewidth?status.svg)](http://godoc.org/github.com/mattn/go-runewidth) [![Go Report Card](https://goreportcard.com/badge/github.com/mattn/go-runewidth)](https://goreportcard.com/report/github.com/mattn/go-runewidth) diff --git a/vendor/github.com/mattn/go-runewidth/go.test.sh b/vendor/github.com/mattn/go-runewidth/go.test.sh new file mode 100644 index 0000000000..012162b077 --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/go.test.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -e +echo "" > coverage.txt + +for d in $(go list ./... | grep -v vendor); do + go test -race -coverprofile=profile.out -covermode=atomic "$d" + if [ -f profile.out ]; then + cat profile.out >> coverage.txt + rm profile.out + fi +done diff --git a/vendor/github.com/mattn/go-runewidth/runewidth.go b/vendor/github.com/mattn/go-runewidth/runewidth.go index 3cb94106f9..f3871a624a 100644 --- a/vendor/github.com/mattn/go-runewidth/runewidth.go +++ b/vendor/github.com/mattn/go-runewidth/runewidth.go @@ -2,15 +2,16 @@ package runewidth import ( "os" + + "github.com/rivo/uniseg" ) +//go:generate go run script/generate.go + var ( // EastAsianWidth will be set true if the current locale is CJK EastAsianWidth bool - // ZeroWidthJoiner is flag to set to use UTR#51 ZWJ - ZeroWidthJoiner bool - // DefaultCondition is a condition in current locale DefaultCondition = &Condition{} ) @@ -28,7 +29,6 @@ func handleEnv() { } // update DefaultCondition DefaultCondition.EastAsianWidth = EastAsianWidth - DefaultCondition.ZeroWidthJoiner = ZeroWidthJoiner } type interval struct { @@ -48,7 +48,6 @@ func inTables(r rune, ts ...table) bool { } func inTable(r rune, t table) bool { - // func (t table) IncludesRune(r rune) bool { if r < t[0].first { return false } @@ -82,739 +81,15 @@ var nonprint = table{ {0xFEFF, 0xFEFF}, {0xFFF9, 0xFFFB}, {0xFFFE, 0xFFFF}, } -var combining = table{ - {0x0300, 0x036F}, {0x0483, 0x0489}, {0x0591, 0x05BD}, - {0x05BF, 0x05BF}, {0x05C1, 0x05C2}, {0x05C4, 0x05C5}, - {0x05C7, 0x05C7}, {0x0610, 0x061A}, {0x064B, 0x065F}, - {0x0670, 0x0670}, {0x06D6, 0x06DC}, {0x06DF, 0x06E4}, - {0x06E7, 0x06E8}, {0x06EA, 0x06ED}, {0x0711, 0x0711}, - {0x0730, 0x074A}, {0x07A6, 0x07B0}, {0x07EB, 0x07F3}, - {0x0816, 0x0819}, {0x081B, 0x0823}, {0x0825, 0x0827}, - {0x0829, 0x082D}, {0x0859, 0x085B}, {0x08D4, 0x08E1}, - {0x08E3, 0x0903}, {0x093A, 0x093C}, {0x093E, 0x094F}, - {0x0951, 0x0957}, {0x0962, 0x0963}, {0x0981, 0x0983}, - {0x09BC, 0x09BC}, {0x09BE, 0x09C4}, {0x09C7, 0x09C8}, - {0x09CB, 0x09CD}, {0x09D7, 0x09D7}, {0x09E2, 0x09E3}, - {0x0A01, 0x0A03}, {0x0A3C, 0x0A3C}, {0x0A3E, 0x0A42}, - {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, {0x0A51, 0x0A51}, - {0x0A70, 0x0A71}, {0x0A75, 0x0A75}, {0x0A81, 0x0A83}, - {0x0ABC, 0x0ABC}, {0x0ABE, 0x0AC5}, {0x0AC7, 0x0AC9}, - {0x0ACB, 0x0ACD}, {0x0AE2, 0x0AE3}, {0x0B01, 0x0B03}, - {0x0B3C, 0x0B3C}, {0x0B3E, 0x0B44}, {0x0B47, 0x0B48}, - {0x0B4B, 0x0B4D}, {0x0B56, 0x0B57}, {0x0B62, 0x0B63}, - {0x0B82, 0x0B82}, {0x0BBE, 0x0BC2}, {0x0BC6, 0x0BC8}, - {0x0BCA, 0x0BCD}, {0x0BD7, 0x0BD7}, {0x0C00, 0x0C03}, - {0x0C3E, 0x0C44}, {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, - {0x0C55, 0x0C56}, {0x0C62, 0x0C63}, {0x0C81, 0x0C83}, - {0x0CBC, 0x0CBC}, {0x0CBE, 0x0CC4}, {0x0CC6, 0x0CC8}, - {0x0CCA, 0x0CCD}, {0x0CD5, 0x0CD6}, {0x0CE2, 0x0CE3}, - {0x0D01, 0x0D03}, {0x0D3E, 0x0D44}, {0x0D46, 0x0D48}, - {0x0D4A, 0x0D4D}, {0x0D57, 0x0D57}, {0x0D62, 0x0D63}, - {0x0D82, 0x0D83}, {0x0DCA, 0x0DCA}, {0x0DCF, 0x0DD4}, - {0x0DD6, 0x0DD6}, {0x0DD8, 0x0DDF}, {0x0DF2, 0x0DF3}, - {0x0E31, 0x0E31}, {0x0E34, 0x0E3A}, {0x0E47, 0x0E4E}, - {0x0EB1, 0x0EB1}, {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC}, - {0x0EC8, 0x0ECD}, {0x0F18, 0x0F19}, {0x0F35, 0x0F35}, - {0x0F37, 0x0F37}, {0x0F39, 0x0F39}, {0x0F3E, 0x0F3F}, - {0x0F71, 0x0F84}, {0x0F86, 0x0F87}, {0x0F8D, 0x0F97}, - {0x0F99, 0x0FBC}, {0x0FC6, 0x0FC6}, {0x102B, 0x103E}, - {0x1056, 0x1059}, {0x105E, 0x1060}, {0x1062, 0x1064}, - {0x1067, 0x106D}, {0x1071, 0x1074}, {0x1082, 0x108D}, - {0x108F, 0x108F}, {0x109A, 0x109D}, {0x135D, 0x135F}, - {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753}, - {0x1772, 0x1773}, {0x17B4, 0x17D3}, {0x17DD, 0x17DD}, - {0x180B, 0x180D}, {0x1885, 0x1886}, {0x18A9, 0x18A9}, - {0x1920, 0x192B}, {0x1930, 0x193B}, {0x1A17, 0x1A1B}, - {0x1A55, 0x1A5E}, {0x1A60, 0x1A7C}, {0x1A7F, 0x1A7F}, - {0x1AB0, 0x1ABE}, {0x1B00, 0x1B04}, {0x1B34, 0x1B44}, - {0x1B6B, 0x1B73}, {0x1B80, 0x1B82}, {0x1BA1, 0x1BAD}, - {0x1BE6, 0x1BF3}, {0x1C24, 0x1C37}, {0x1CD0, 0x1CD2}, - {0x1CD4, 0x1CE8}, {0x1CED, 0x1CED}, {0x1CF2, 0x1CF4}, - {0x1CF8, 0x1CF9}, {0x1DC0, 0x1DF5}, {0x1DFB, 0x1DFF}, - {0x20D0, 0x20F0}, {0x2CEF, 0x2CF1}, {0x2D7F, 0x2D7F}, - {0x2DE0, 0x2DFF}, {0x302A, 0x302F}, {0x3099, 0x309A}, - {0xA66F, 0xA672}, {0xA674, 0xA67D}, {0xA69E, 0xA69F}, - {0xA6F0, 0xA6F1}, {0xA802, 0xA802}, {0xA806, 0xA806}, - {0xA80B, 0xA80B}, {0xA823, 0xA827}, {0xA880, 0xA881}, - {0xA8B4, 0xA8C5}, {0xA8E0, 0xA8F1}, {0xA926, 0xA92D}, - {0xA947, 0xA953}, {0xA980, 0xA983}, {0xA9B3, 0xA9C0}, - {0xA9E5, 0xA9E5}, {0xAA29, 0xAA36}, {0xAA43, 0xAA43}, - {0xAA4C, 0xAA4D}, {0xAA7B, 0xAA7D}, {0xAAB0, 0xAAB0}, - {0xAAB2, 0xAAB4}, {0xAAB7, 0xAAB8}, {0xAABE, 0xAABF}, - {0xAAC1, 0xAAC1}, {0xAAEB, 0xAAEF}, {0xAAF5, 0xAAF6}, - {0xABE3, 0xABEA}, {0xABEC, 0xABED}, {0xFB1E, 0xFB1E}, - {0xFE00, 0xFE0F}, {0xFE20, 0xFE2F}, {0x101FD, 0x101FD}, - {0x102E0, 0x102E0}, {0x10376, 0x1037A}, {0x10A01, 0x10A03}, - {0x10A05, 0x10A06}, {0x10A0C, 0x10A0F}, {0x10A38, 0x10A3A}, - {0x10A3F, 0x10A3F}, {0x10AE5, 0x10AE6}, {0x11000, 0x11002}, - {0x11038, 0x11046}, {0x1107F, 0x11082}, {0x110B0, 0x110BA}, - {0x11100, 0x11102}, {0x11127, 0x11134}, {0x11173, 0x11173}, - {0x11180, 0x11182}, {0x111B3, 0x111C0}, {0x111CA, 0x111CC}, - {0x1122C, 0x11237}, {0x1123E, 0x1123E}, {0x112DF, 0x112EA}, - {0x11300, 0x11303}, {0x1133C, 0x1133C}, {0x1133E, 0x11344}, - {0x11347, 0x11348}, {0x1134B, 0x1134D}, {0x11357, 0x11357}, - {0x11362, 0x11363}, {0x11366, 0x1136C}, {0x11370, 0x11374}, - {0x11435, 0x11446}, {0x114B0, 0x114C3}, {0x115AF, 0x115B5}, - {0x115B8, 0x115C0}, {0x115DC, 0x115DD}, {0x11630, 0x11640}, - {0x116AB, 0x116B7}, {0x1171D, 0x1172B}, {0x11C2F, 0x11C36}, - {0x11C38, 0x11C3F}, {0x11C92, 0x11CA7}, {0x11CA9, 0x11CB6}, - {0x16AF0, 0x16AF4}, {0x16B30, 0x16B36}, {0x16F51, 0x16F7E}, - {0x16F8F, 0x16F92}, {0x1BC9D, 0x1BC9E}, {0x1D165, 0x1D169}, - {0x1D16D, 0x1D172}, {0x1D17B, 0x1D182}, {0x1D185, 0x1D18B}, - {0x1D1AA, 0x1D1AD}, {0x1D242, 0x1D244}, {0x1DA00, 0x1DA36}, - {0x1DA3B, 0x1DA6C}, {0x1DA75, 0x1DA75}, {0x1DA84, 0x1DA84}, - {0x1DA9B, 0x1DA9F}, {0x1DAA1, 0x1DAAF}, {0x1E000, 0x1E006}, - {0x1E008, 0x1E018}, {0x1E01B, 0x1E021}, {0x1E023, 0x1E024}, - {0x1E026, 0x1E02A}, {0x1E8D0, 0x1E8D6}, {0x1E944, 0x1E94A}, - {0xE0100, 0xE01EF}, -} - -var doublewidth = table{ - {0x1100, 0x115F}, {0x231A, 0x231B}, {0x2329, 0x232A}, - {0x23E9, 0x23EC}, {0x23F0, 0x23F0}, {0x23F3, 0x23F3}, - {0x25FD, 0x25FE}, {0x2614, 0x2615}, {0x2648, 0x2653}, - {0x267F, 0x267F}, {0x2693, 0x2693}, {0x26A1, 0x26A1}, - {0x26AA, 0x26AB}, {0x26BD, 0x26BE}, {0x26C4, 0x26C5}, - {0x26CE, 0x26CE}, {0x26D4, 0x26D4}, {0x26EA, 0x26EA}, - {0x26F2, 0x26F3}, {0x26F5, 0x26F5}, {0x26FA, 0x26FA}, - {0x26FD, 0x26FD}, {0x2705, 0x2705}, {0x270A, 0x270B}, - {0x2728, 0x2728}, {0x274C, 0x274C}, {0x274E, 0x274E}, - {0x2753, 0x2755}, {0x2757, 0x2757}, {0x2795, 0x2797}, - {0x27B0, 0x27B0}, {0x27BF, 0x27BF}, {0x2B1B, 0x2B1C}, - {0x2B50, 0x2B50}, {0x2B55, 0x2B55}, {0x2E80, 0x2E99}, - {0x2E9B, 0x2EF3}, {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB}, - {0x3000, 0x303E}, {0x3041, 0x3096}, {0x3099, 0x30FF}, - {0x3105, 0x312D}, {0x3131, 0x318E}, {0x3190, 0x31BA}, - {0x31C0, 0x31E3}, {0x31F0, 0x321E}, {0x3220, 0x3247}, - {0x3250, 0x32FE}, {0x3300, 0x4DBF}, {0x4E00, 0xA48C}, - {0xA490, 0xA4C6}, {0xA960, 0xA97C}, {0xAC00, 0xD7A3}, - {0xF900, 0xFAFF}, {0xFE10, 0xFE19}, {0xFE30, 0xFE52}, - {0xFE54, 0xFE66}, {0xFE68, 0xFE6B}, {0xFF01, 0xFF60}, - {0xFFE0, 0xFFE6}, {0x16FE0, 0x16FE0}, {0x17000, 0x187EC}, - {0x18800, 0x18AF2}, {0x1B000, 0x1B001}, {0x1F004, 0x1F004}, - {0x1F0CF, 0x1F0CF}, {0x1F18E, 0x1F18E}, {0x1F191, 0x1F19A}, - {0x1F200, 0x1F202}, {0x1F210, 0x1F23B}, {0x1F240, 0x1F248}, - {0x1F250, 0x1F251}, {0x1F300, 0x1F320}, {0x1F32D, 0x1F335}, - {0x1F337, 0x1F37C}, {0x1F37E, 0x1F393}, {0x1F3A0, 0x1F3CA}, - {0x1F3CF, 0x1F3D3}, {0x1F3E0, 0x1F3F0}, {0x1F3F4, 0x1F3F4}, - {0x1F3F8, 0x1F43E}, {0x1F440, 0x1F440}, {0x1F442, 0x1F4FC}, - {0x1F4FF, 0x1F53D}, {0x1F54B, 0x1F54E}, {0x1F550, 0x1F567}, - {0x1F57A, 0x1F57A}, {0x1F595, 0x1F596}, {0x1F5A4, 0x1F5A4}, - {0x1F5FB, 0x1F64F}, {0x1F680, 0x1F6C5}, {0x1F6CC, 0x1F6CC}, - {0x1F6D0, 0x1F6D2}, {0x1F6EB, 0x1F6EC}, {0x1F6F4, 0x1F6F6}, - {0x1F910, 0x1F91E}, {0x1F920, 0x1F927}, {0x1F930, 0x1F930}, - {0x1F933, 0x1F93E}, {0x1F940, 0x1F94B}, {0x1F950, 0x1F95E}, - {0x1F980, 0x1F991}, {0x1F9C0, 0x1F9C0}, {0x20000, 0x2FFFD}, - {0x30000, 0x3FFFD}, -} - -var ambiguous = table{ - {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8}, - {0x00AA, 0x00AA}, {0x00AD, 0x00AE}, {0x00B0, 0x00B4}, - {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6}, - {0x00D0, 0x00D0}, {0x00D7, 0x00D8}, {0x00DE, 0x00E1}, - {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED}, - {0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA}, - {0x00FC, 0x00FC}, {0x00FE, 0x00FE}, {0x0101, 0x0101}, - {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B}, - {0x0126, 0x0127}, {0x012B, 0x012B}, {0x0131, 0x0133}, - {0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144}, - {0x0148, 0x014B}, {0x014D, 0x014D}, {0x0152, 0x0153}, - {0x0166, 0x0167}, {0x016B, 0x016B}, {0x01CE, 0x01CE}, - {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4}, - {0x01D6, 0x01D6}, {0x01D8, 0x01D8}, {0x01DA, 0x01DA}, - {0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261}, - {0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB}, - {0x02CD, 0x02CD}, {0x02D0, 0x02D0}, {0x02D8, 0x02DB}, - {0x02DD, 0x02DD}, {0x02DF, 0x02DF}, {0x0300, 0x036F}, - {0x0391, 0x03A1}, {0x03A3, 0x03A9}, {0x03B1, 0x03C1}, - {0x03C3, 0x03C9}, {0x0401, 0x0401}, {0x0410, 0x044F}, - {0x0451, 0x0451}, {0x2010, 0x2010}, {0x2013, 0x2016}, - {0x2018, 0x2019}, {0x201C, 0x201D}, {0x2020, 0x2022}, - {0x2024, 0x2027}, {0x2030, 0x2030}, {0x2032, 0x2033}, - {0x2035, 0x2035}, {0x203B, 0x203B}, {0x203E, 0x203E}, - {0x2074, 0x2074}, {0x207F, 0x207F}, {0x2081, 0x2084}, - {0x20AC, 0x20AC}, {0x2103, 0x2103}, {0x2105, 0x2105}, - {0x2109, 0x2109}, {0x2113, 0x2113}, {0x2116, 0x2116}, - {0x2121, 0x2122}, {0x2126, 0x2126}, {0x212B, 0x212B}, - {0x2153, 0x2154}, {0x215B, 0x215E}, {0x2160, 0x216B}, - {0x2170, 0x2179}, {0x2189, 0x2189}, {0x2190, 0x2199}, - {0x21B8, 0x21B9}, {0x21D2, 0x21D2}, {0x21D4, 0x21D4}, - {0x21E7, 0x21E7}, {0x2200, 0x2200}, {0x2202, 0x2203}, - {0x2207, 0x2208}, {0x220B, 0x220B}, {0x220F, 0x220F}, - {0x2211, 0x2211}, {0x2215, 0x2215}, {0x221A, 0x221A}, - {0x221D, 0x2220}, {0x2223, 0x2223}, {0x2225, 0x2225}, - {0x2227, 0x222C}, {0x222E, 0x222E}, {0x2234, 0x2237}, - {0x223C, 0x223D}, {0x2248, 0x2248}, {0x224C, 0x224C}, - {0x2252, 0x2252}, {0x2260, 0x2261}, {0x2264, 0x2267}, - {0x226A, 0x226B}, {0x226E, 0x226F}, {0x2282, 0x2283}, - {0x2286, 0x2287}, {0x2295, 0x2295}, {0x2299, 0x2299}, - {0x22A5, 0x22A5}, {0x22BF, 0x22BF}, {0x2312, 0x2312}, - {0x2460, 0x24E9}, {0x24EB, 0x254B}, {0x2550, 0x2573}, - {0x2580, 0x258F}, {0x2592, 0x2595}, {0x25A0, 0x25A1}, - {0x25A3, 0x25A9}, {0x25B2, 0x25B3}, {0x25B6, 0x25B7}, - {0x25BC, 0x25BD}, {0x25C0, 0x25C1}, {0x25C6, 0x25C8}, - {0x25CB, 0x25CB}, {0x25CE, 0x25D1}, {0x25E2, 0x25E5}, - {0x25EF, 0x25EF}, {0x2605, 0x2606}, {0x2609, 0x2609}, - {0x260E, 0x260F}, {0x261C, 0x261C}, {0x261E, 0x261E}, - {0x2640, 0x2640}, {0x2642, 0x2642}, {0x2660, 0x2661}, - {0x2663, 0x2665}, {0x2667, 0x266A}, {0x266C, 0x266D}, - {0x266F, 0x266F}, {0x269E, 0x269F}, {0x26BF, 0x26BF}, - {0x26C6, 0x26CD}, {0x26CF, 0x26D3}, {0x26D5, 0x26E1}, - {0x26E3, 0x26E3}, {0x26E8, 0x26E9}, {0x26EB, 0x26F1}, - {0x26F4, 0x26F4}, {0x26F6, 0x26F9}, {0x26FB, 0x26FC}, - {0x26FE, 0x26FF}, {0x273D, 0x273D}, {0x2776, 0x277F}, - {0x2B56, 0x2B59}, {0x3248, 0x324F}, {0xE000, 0xF8FF}, - {0xFE00, 0xFE0F}, {0xFFFD, 0xFFFD}, {0x1F100, 0x1F10A}, - {0x1F110, 0x1F12D}, {0x1F130, 0x1F169}, {0x1F170, 0x1F18D}, - {0x1F18F, 0x1F190}, {0x1F19B, 0x1F1AC}, {0xE0100, 0xE01EF}, - {0xF0000, 0xFFFFD}, {0x100000, 0x10FFFD}, -} - -var emoji = table{ - {0x203C, 0x203C}, {0x2049, 0x2049}, {0x2122, 0x2122}, - {0x2139, 0x2139}, {0x2194, 0x2199}, {0x21A9, 0x21AA}, - {0x231A, 0x231B}, {0x2328, 0x2328}, {0x23CF, 0x23CF}, - {0x23E9, 0x23F3}, {0x23F8, 0x23FA}, {0x24C2, 0x24C2}, - {0x25AA, 0x25AB}, {0x25B6, 0x25B6}, {0x25C0, 0x25C0}, - {0x25FB, 0x25FE}, {0x2600, 0x2604}, {0x260E, 0x260E}, - {0x2611, 0x2611}, {0x2614, 0x2615}, {0x2618, 0x2618}, - {0x261D, 0x261D}, {0x2620, 0x2620}, {0x2622, 0x2623}, - {0x2626, 0x2626}, {0x262A, 0x262A}, {0x262E, 0x262F}, - {0x2638, 0x263A}, {0x2640, 0x2640}, {0x2642, 0x2642}, - {0x2648, 0x2653}, {0x265F, 0x2660}, {0x2663, 0x2663}, - {0x2665, 0x2666}, {0x2668, 0x2668}, {0x267B, 0x267B}, - {0x267E, 0x267F}, {0x2692, 0x2697}, {0x2699, 0x2699}, - {0x269B, 0x269C}, {0x26A0, 0x26A1}, {0x26AA, 0x26AB}, - {0x26B0, 0x26B1}, {0x26BD, 0x26BE}, {0x26C4, 0x26C5}, - {0x26C8, 0x26C8}, {0x26CE, 0x26CF}, {0x26D1, 0x26D1}, - {0x26D3, 0x26D4}, {0x26E9, 0x26EA}, {0x26F0, 0x26F5}, - {0x26F7, 0x26FA}, {0x26FD, 0x26FD}, {0x2702, 0x2702}, - {0x2705, 0x2705}, {0x2708, 0x270D}, {0x270F, 0x270F}, - {0x2712, 0x2712}, {0x2714, 0x2714}, {0x2716, 0x2716}, - {0x271D, 0x271D}, {0x2721, 0x2721}, {0x2728, 0x2728}, - {0x2733, 0x2734}, {0x2744, 0x2744}, {0x2747, 0x2747}, - {0x274C, 0x274C}, {0x274E, 0x274E}, {0x2753, 0x2755}, - {0x2757, 0x2757}, {0x2763, 0x2764}, {0x2795, 0x2797}, - {0x27A1, 0x27A1}, {0x27B0, 0x27B0}, {0x27BF, 0x27BF}, - {0x2934, 0x2935}, {0x2B05, 0x2B07}, {0x2B1B, 0x2B1C}, - {0x2B50, 0x2B50}, {0x2B55, 0x2B55}, {0x3030, 0x3030}, - {0x303D, 0x303D}, {0x3297, 0x3297}, {0x3299, 0x3299}, - {0x1F004, 0x1F004}, {0x1F0CF, 0x1F0CF}, {0x1F170, 0x1F171}, - {0x1F17E, 0x1F17F}, {0x1F18E, 0x1F18E}, {0x1F191, 0x1F19A}, - {0x1F1E6, 0x1F1FF}, {0x1F201, 0x1F202}, {0x1F21A, 0x1F21A}, - {0x1F22F, 0x1F22F}, {0x1F232, 0x1F23A}, {0x1F250, 0x1F251}, - {0x1F300, 0x1F321}, {0x1F324, 0x1F393}, {0x1F396, 0x1F397}, - {0x1F399, 0x1F39B}, {0x1F39E, 0x1F3F0}, {0x1F3F3, 0x1F3F5}, - {0x1F3F7, 0x1F4FD}, {0x1F4FF, 0x1F53D}, {0x1F549, 0x1F54E}, - {0x1F550, 0x1F567}, {0x1F56F, 0x1F570}, {0x1F573, 0x1F57A}, - {0x1F587, 0x1F587}, {0x1F58A, 0x1F58D}, {0x1F590, 0x1F590}, - {0x1F595, 0x1F596}, {0x1F5A4, 0x1F5A5}, {0x1F5A8, 0x1F5A8}, - {0x1F5B1, 0x1F5B2}, {0x1F5BC, 0x1F5BC}, {0x1F5C2, 0x1F5C4}, - {0x1F5D1, 0x1F5D3}, {0x1F5DC, 0x1F5DE}, {0x1F5E1, 0x1F5E1}, - {0x1F5E3, 0x1F5E3}, {0x1F5E8, 0x1F5E8}, {0x1F5EF, 0x1F5EF}, - {0x1F5F3, 0x1F5F3}, {0x1F5FA, 0x1F64F}, {0x1F680, 0x1F6C5}, - {0x1F6CB, 0x1F6D2}, {0x1F6E0, 0x1F6E5}, {0x1F6E9, 0x1F6E9}, - {0x1F6EB, 0x1F6EC}, {0x1F6F0, 0x1F6F0}, {0x1F6F3, 0x1F6F9}, - {0x1F910, 0x1F93A}, {0x1F93C, 0x1F93E}, {0x1F940, 0x1F945}, - {0x1F947, 0x1F970}, {0x1F973, 0x1F976}, {0x1F97A, 0x1F97A}, - {0x1F97C, 0x1F9A2}, {0x1F9B0, 0x1F9B9}, {0x1F9C0, 0x1F9C2}, - {0x1F9D0, 0x1F9FF}, -} - -var notassigned = table{ - {0x0378, 0x0379}, {0x0380, 0x0383}, {0x038B, 0x038B}, - {0x038D, 0x038D}, {0x03A2, 0x03A2}, {0x0530, 0x0530}, - {0x0557, 0x0558}, {0x0560, 0x0560}, {0x0588, 0x0588}, - {0x058B, 0x058C}, {0x0590, 0x0590}, {0x05C8, 0x05CF}, - {0x05EB, 0x05EF}, {0x05F5, 0x05FF}, {0x061D, 0x061D}, - {0x070E, 0x070E}, {0x074B, 0x074C}, {0x07B2, 0x07BF}, - {0x07FB, 0x07FF}, {0x082E, 0x082F}, {0x083F, 0x083F}, - {0x085C, 0x085D}, {0x085F, 0x089F}, {0x08B5, 0x08B5}, - {0x08BE, 0x08D3}, {0x0984, 0x0984}, {0x098D, 0x098E}, - {0x0991, 0x0992}, {0x09A9, 0x09A9}, {0x09B1, 0x09B1}, - {0x09B3, 0x09B5}, {0x09BA, 0x09BB}, {0x09C5, 0x09C6}, - {0x09C9, 0x09CA}, {0x09CF, 0x09D6}, {0x09D8, 0x09DB}, - {0x09DE, 0x09DE}, {0x09E4, 0x09E5}, {0x09FC, 0x0A00}, - {0x0A04, 0x0A04}, {0x0A0B, 0x0A0E}, {0x0A11, 0x0A12}, - {0x0A29, 0x0A29}, {0x0A31, 0x0A31}, {0x0A34, 0x0A34}, - {0x0A37, 0x0A37}, {0x0A3A, 0x0A3B}, {0x0A3D, 0x0A3D}, - {0x0A43, 0x0A46}, {0x0A49, 0x0A4A}, {0x0A4E, 0x0A50}, - {0x0A52, 0x0A58}, {0x0A5D, 0x0A5D}, {0x0A5F, 0x0A65}, - {0x0A76, 0x0A80}, {0x0A84, 0x0A84}, {0x0A8E, 0x0A8E}, - {0x0A92, 0x0A92}, {0x0AA9, 0x0AA9}, {0x0AB1, 0x0AB1}, - {0x0AB4, 0x0AB4}, {0x0ABA, 0x0ABB}, {0x0AC6, 0x0AC6}, - {0x0ACA, 0x0ACA}, {0x0ACE, 0x0ACF}, {0x0AD1, 0x0ADF}, - {0x0AE4, 0x0AE5}, {0x0AF2, 0x0AF8}, {0x0AFA, 0x0B00}, - {0x0B04, 0x0B04}, {0x0B0D, 0x0B0E}, {0x0B11, 0x0B12}, - {0x0B29, 0x0B29}, {0x0B31, 0x0B31}, {0x0B34, 0x0B34}, - {0x0B3A, 0x0B3B}, {0x0B45, 0x0B46}, {0x0B49, 0x0B4A}, - {0x0B4E, 0x0B55}, {0x0B58, 0x0B5B}, {0x0B5E, 0x0B5E}, - {0x0B64, 0x0B65}, {0x0B78, 0x0B81}, {0x0B84, 0x0B84}, - {0x0B8B, 0x0B8D}, {0x0B91, 0x0B91}, {0x0B96, 0x0B98}, - {0x0B9B, 0x0B9B}, {0x0B9D, 0x0B9D}, {0x0BA0, 0x0BA2}, - {0x0BA5, 0x0BA7}, {0x0BAB, 0x0BAD}, {0x0BBA, 0x0BBD}, - {0x0BC3, 0x0BC5}, {0x0BC9, 0x0BC9}, {0x0BCE, 0x0BCF}, - {0x0BD1, 0x0BD6}, {0x0BD8, 0x0BE5}, {0x0BFB, 0x0BFF}, - {0x0C04, 0x0C04}, {0x0C0D, 0x0C0D}, {0x0C11, 0x0C11}, - {0x0C29, 0x0C29}, {0x0C3A, 0x0C3C}, {0x0C45, 0x0C45}, - {0x0C49, 0x0C49}, {0x0C4E, 0x0C54}, {0x0C57, 0x0C57}, - {0x0C5B, 0x0C5F}, {0x0C64, 0x0C65}, {0x0C70, 0x0C77}, - {0x0C84, 0x0C84}, {0x0C8D, 0x0C8D}, {0x0C91, 0x0C91}, - {0x0CA9, 0x0CA9}, {0x0CB4, 0x0CB4}, {0x0CBA, 0x0CBB}, - {0x0CC5, 0x0CC5}, {0x0CC9, 0x0CC9}, {0x0CCE, 0x0CD4}, - {0x0CD7, 0x0CDD}, {0x0CDF, 0x0CDF}, {0x0CE4, 0x0CE5}, - {0x0CF0, 0x0CF0}, {0x0CF3, 0x0D00}, {0x0D04, 0x0D04}, - {0x0D0D, 0x0D0D}, {0x0D11, 0x0D11}, {0x0D3B, 0x0D3C}, - {0x0D45, 0x0D45}, {0x0D49, 0x0D49}, {0x0D50, 0x0D53}, - {0x0D64, 0x0D65}, {0x0D80, 0x0D81}, {0x0D84, 0x0D84}, - {0x0D97, 0x0D99}, {0x0DB2, 0x0DB2}, {0x0DBC, 0x0DBC}, - {0x0DBE, 0x0DBF}, {0x0DC7, 0x0DC9}, {0x0DCB, 0x0DCE}, - {0x0DD5, 0x0DD5}, {0x0DD7, 0x0DD7}, {0x0DE0, 0x0DE5}, - {0x0DF0, 0x0DF1}, {0x0DF5, 0x0E00}, {0x0E3B, 0x0E3E}, - {0x0E5C, 0x0E80}, {0x0E83, 0x0E83}, {0x0E85, 0x0E86}, - {0x0E89, 0x0E89}, {0x0E8B, 0x0E8C}, {0x0E8E, 0x0E93}, - {0x0E98, 0x0E98}, {0x0EA0, 0x0EA0}, {0x0EA4, 0x0EA4}, - {0x0EA6, 0x0EA6}, {0x0EA8, 0x0EA9}, {0x0EAC, 0x0EAC}, - {0x0EBA, 0x0EBA}, {0x0EBE, 0x0EBF}, {0x0EC5, 0x0EC5}, - {0x0EC7, 0x0EC7}, {0x0ECE, 0x0ECF}, {0x0EDA, 0x0EDB}, - {0x0EE0, 0x0EFF}, {0x0F48, 0x0F48}, {0x0F6D, 0x0F70}, - {0x0F98, 0x0F98}, {0x0FBD, 0x0FBD}, {0x0FCD, 0x0FCD}, - {0x0FDB, 0x0FFF}, {0x10C6, 0x10C6}, {0x10C8, 0x10CC}, - {0x10CE, 0x10CF}, {0x1249, 0x1249}, {0x124E, 0x124F}, - {0x1257, 0x1257}, {0x1259, 0x1259}, {0x125E, 0x125F}, - {0x1289, 0x1289}, {0x128E, 0x128F}, {0x12B1, 0x12B1}, - {0x12B6, 0x12B7}, {0x12BF, 0x12BF}, {0x12C1, 0x12C1}, - {0x12C6, 0x12C7}, {0x12D7, 0x12D7}, {0x1311, 0x1311}, - {0x1316, 0x1317}, {0x135B, 0x135C}, {0x137D, 0x137F}, - {0x139A, 0x139F}, {0x13F6, 0x13F7}, {0x13FE, 0x13FF}, - {0x169D, 0x169F}, {0x16F9, 0x16FF}, {0x170D, 0x170D}, - {0x1715, 0x171F}, {0x1737, 0x173F}, {0x1754, 0x175F}, - {0x176D, 0x176D}, {0x1771, 0x1771}, {0x1774, 0x177F}, - {0x17DE, 0x17DF}, {0x17EA, 0x17EF}, {0x17FA, 0x17FF}, - {0x180F, 0x180F}, {0x181A, 0x181F}, {0x1878, 0x187F}, - {0x18AB, 0x18AF}, {0x18F6, 0x18FF}, {0x191F, 0x191F}, - {0x192C, 0x192F}, {0x193C, 0x193F}, {0x1941, 0x1943}, - {0x196E, 0x196F}, {0x1975, 0x197F}, {0x19AC, 0x19AF}, - {0x19CA, 0x19CF}, {0x19DB, 0x19DD}, {0x1A1C, 0x1A1D}, - {0x1A5F, 0x1A5F}, {0x1A7D, 0x1A7E}, {0x1A8A, 0x1A8F}, - {0x1A9A, 0x1A9F}, {0x1AAE, 0x1AAF}, {0x1ABF, 0x1AFF}, - {0x1B4C, 0x1B4F}, {0x1B7D, 0x1B7F}, {0x1BF4, 0x1BFB}, - {0x1C38, 0x1C3A}, {0x1C4A, 0x1C4C}, {0x1C89, 0x1CBF}, - {0x1CC8, 0x1CCF}, {0x1CF7, 0x1CF7}, {0x1CFA, 0x1CFF}, - {0x1DF6, 0x1DFA}, {0x1F16, 0x1F17}, {0x1F1E, 0x1F1F}, - {0x1F46, 0x1F47}, {0x1F4E, 0x1F4F}, {0x1F58, 0x1F58}, - {0x1F5A, 0x1F5A}, {0x1F5C, 0x1F5C}, {0x1F5E, 0x1F5E}, - {0x1F7E, 0x1F7F}, {0x1FB5, 0x1FB5}, {0x1FC5, 0x1FC5}, - {0x1FD4, 0x1FD5}, {0x1FDC, 0x1FDC}, {0x1FF0, 0x1FF1}, - {0x1FF5, 0x1FF5}, {0x1FFF, 0x1FFF}, {0x2065, 0x2065}, - {0x2072, 0x2073}, {0x208F, 0x208F}, {0x209D, 0x209F}, - {0x20BF, 0x20CF}, {0x20F1, 0x20FF}, {0x218C, 0x218F}, - {0x23FF, 0x23FF}, {0x2427, 0x243F}, {0x244B, 0x245F}, - {0x2B74, 0x2B75}, {0x2B96, 0x2B97}, {0x2BBA, 0x2BBC}, - {0x2BC9, 0x2BC9}, {0x2BD2, 0x2BEB}, {0x2BF0, 0x2BFF}, - {0x2C2F, 0x2C2F}, {0x2C5F, 0x2C5F}, {0x2CF4, 0x2CF8}, - {0x2D26, 0x2D26}, {0x2D28, 0x2D2C}, {0x2D2E, 0x2D2F}, - {0x2D68, 0x2D6E}, {0x2D71, 0x2D7E}, {0x2D97, 0x2D9F}, - {0x2DA7, 0x2DA7}, {0x2DAF, 0x2DAF}, {0x2DB7, 0x2DB7}, - {0x2DBF, 0x2DBF}, {0x2DC7, 0x2DC7}, {0x2DCF, 0x2DCF}, - {0x2DD7, 0x2DD7}, {0x2DDF, 0x2DDF}, {0x2E45, 0x2E7F}, - {0x2E9A, 0x2E9A}, {0x2EF4, 0x2EFF}, {0x2FD6, 0x2FEF}, - {0x2FFC, 0x2FFF}, {0x3040, 0x3040}, {0x3097, 0x3098}, - {0x3100, 0x3104}, {0x312E, 0x3130}, {0x318F, 0x318F}, - {0x31BB, 0x31BF}, {0x31E4, 0x31EF}, {0x321F, 0x321F}, - {0x32FF, 0x32FF}, {0x4DB6, 0x4DBF}, {0x9FD6, 0x9FFF}, - {0xA48D, 0xA48F}, {0xA4C7, 0xA4CF}, {0xA62C, 0xA63F}, - {0xA6F8, 0xA6FF}, {0xA7AF, 0xA7AF}, {0xA7B8, 0xA7F6}, - {0xA82C, 0xA82F}, {0xA83A, 0xA83F}, {0xA878, 0xA87F}, - {0xA8C6, 0xA8CD}, {0xA8DA, 0xA8DF}, {0xA8FE, 0xA8FF}, - {0xA954, 0xA95E}, {0xA97D, 0xA97F}, {0xA9CE, 0xA9CE}, - {0xA9DA, 0xA9DD}, {0xA9FF, 0xA9FF}, {0xAA37, 0xAA3F}, - {0xAA4E, 0xAA4F}, {0xAA5A, 0xAA5B}, {0xAAC3, 0xAADA}, - {0xAAF7, 0xAB00}, {0xAB07, 0xAB08}, {0xAB0F, 0xAB10}, - {0xAB17, 0xAB1F}, {0xAB27, 0xAB27}, {0xAB2F, 0xAB2F}, - {0xAB66, 0xAB6F}, {0xABEE, 0xABEF}, {0xABFA, 0xABFF}, - {0xD7A4, 0xD7AF}, {0xD7C7, 0xD7CA}, {0xD7FC, 0xD7FF}, - {0xFA6E, 0xFA6F}, {0xFADA, 0xFAFF}, {0xFB07, 0xFB12}, - {0xFB18, 0xFB1C}, {0xFB37, 0xFB37}, {0xFB3D, 0xFB3D}, - {0xFB3F, 0xFB3F}, {0xFB42, 0xFB42}, {0xFB45, 0xFB45}, - {0xFBC2, 0xFBD2}, {0xFD40, 0xFD4F}, {0xFD90, 0xFD91}, - {0xFDC8, 0xFDEF}, {0xFDFE, 0xFDFF}, {0xFE1A, 0xFE1F}, - {0xFE53, 0xFE53}, {0xFE67, 0xFE67}, {0xFE6C, 0xFE6F}, - {0xFE75, 0xFE75}, {0xFEFD, 0xFEFE}, {0xFF00, 0xFF00}, - {0xFFBF, 0xFFC1}, {0xFFC8, 0xFFC9}, {0xFFD0, 0xFFD1}, - {0xFFD8, 0xFFD9}, {0xFFDD, 0xFFDF}, {0xFFE7, 0xFFE7}, - {0xFFEF, 0xFFF8}, {0xFFFE, 0xFFFF}, {0x1000C, 0x1000C}, - {0x10027, 0x10027}, {0x1003B, 0x1003B}, {0x1003E, 0x1003E}, - {0x1004E, 0x1004F}, {0x1005E, 0x1007F}, {0x100FB, 0x100FF}, - {0x10103, 0x10106}, {0x10134, 0x10136}, {0x1018F, 0x1018F}, - {0x1019C, 0x1019F}, {0x101A1, 0x101CF}, {0x101FE, 0x1027F}, - {0x1029D, 0x1029F}, {0x102D1, 0x102DF}, {0x102FC, 0x102FF}, - {0x10324, 0x1032F}, {0x1034B, 0x1034F}, {0x1037B, 0x1037F}, - {0x1039E, 0x1039E}, {0x103C4, 0x103C7}, {0x103D6, 0x103FF}, - {0x1049E, 0x1049F}, {0x104AA, 0x104AF}, {0x104D4, 0x104D7}, - {0x104FC, 0x104FF}, {0x10528, 0x1052F}, {0x10564, 0x1056E}, - {0x10570, 0x105FF}, {0x10737, 0x1073F}, {0x10756, 0x1075F}, - {0x10768, 0x107FF}, {0x10806, 0x10807}, {0x10809, 0x10809}, - {0x10836, 0x10836}, {0x10839, 0x1083B}, {0x1083D, 0x1083E}, - {0x10856, 0x10856}, {0x1089F, 0x108A6}, {0x108B0, 0x108DF}, - {0x108F3, 0x108F3}, {0x108F6, 0x108FA}, {0x1091C, 0x1091E}, - {0x1093A, 0x1093E}, {0x10940, 0x1097F}, {0x109B8, 0x109BB}, - {0x109D0, 0x109D1}, {0x10A04, 0x10A04}, {0x10A07, 0x10A0B}, - {0x10A14, 0x10A14}, {0x10A18, 0x10A18}, {0x10A34, 0x10A37}, - {0x10A3B, 0x10A3E}, {0x10A48, 0x10A4F}, {0x10A59, 0x10A5F}, - {0x10AA0, 0x10ABF}, {0x10AE7, 0x10AEA}, {0x10AF7, 0x10AFF}, - {0x10B36, 0x10B38}, {0x10B56, 0x10B57}, {0x10B73, 0x10B77}, - {0x10B92, 0x10B98}, {0x10B9D, 0x10BA8}, {0x10BB0, 0x10BFF}, - {0x10C49, 0x10C7F}, {0x10CB3, 0x10CBF}, {0x10CF3, 0x10CF9}, - {0x10D00, 0x10E5F}, {0x10E7F, 0x10FFF}, {0x1104E, 0x11051}, - {0x11070, 0x1107E}, {0x110C2, 0x110CF}, {0x110E9, 0x110EF}, - {0x110FA, 0x110FF}, {0x11135, 0x11135}, {0x11144, 0x1114F}, - {0x11177, 0x1117F}, {0x111CE, 0x111CF}, {0x111E0, 0x111E0}, - {0x111F5, 0x111FF}, {0x11212, 0x11212}, {0x1123F, 0x1127F}, - {0x11287, 0x11287}, {0x11289, 0x11289}, {0x1128E, 0x1128E}, - {0x1129E, 0x1129E}, {0x112AA, 0x112AF}, {0x112EB, 0x112EF}, - {0x112FA, 0x112FF}, {0x11304, 0x11304}, {0x1130D, 0x1130E}, - {0x11311, 0x11312}, {0x11329, 0x11329}, {0x11331, 0x11331}, - {0x11334, 0x11334}, {0x1133A, 0x1133B}, {0x11345, 0x11346}, - {0x11349, 0x1134A}, {0x1134E, 0x1134F}, {0x11351, 0x11356}, - {0x11358, 0x1135C}, {0x11364, 0x11365}, {0x1136D, 0x1136F}, - {0x11375, 0x113FF}, {0x1145A, 0x1145A}, {0x1145C, 0x1145C}, - {0x1145E, 0x1147F}, {0x114C8, 0x114CF}, {0x114DA, 0x1157F}, - {0x115B6, 0x115B7}, {0x115DE, 0x115FF}, {0x11645, 0x1164F}, - {0x1165A, 0x1165F}, {0x1166D, 0x1167F}, {0x116B8, 0x116BF}, - {0x116CA, 0x116FF}, {0x1171A, 0x1171C}, {0x1172C, 0x1172F}, - {0x11740, 0x1189F}, {0x118F3, 0x118FE}, {0x11900, 0x11ABF}, - {0x11AF9, 0x11BFF}, {0x11C09, 0x11C09}, {0x11C37, 0x11C37}, - {0x11C46, 0x11C4F}, {0x11C6D, 0x11C6F}, {0x11C90, 0x11C91}, - {0x11CA8, 0x11CA8}, {0x11CB7, 0x11FFF}, {0x1239A, 0x123FF}, - {0x1246F, 0x1246F}, {0x12475, 0x1247F}, {0x12544, 0x12FFF}, - {0x1342F, 0x143FF}, {0x14647, 0x167FF}, {0x16A39, 0x16A3F}, - {0x16A5F, 0x16A5F}, {0x16A6A, 0x16A6D}, {0x16A70, 0x16ACF}, - {0x16AEE, 0x16AEF}, {0x16AF6, 0x16AFF}, {0x16B46, 0x16B4F}, - {0x16B5A, 0x16B5A}, {0x16B62, 0x16B62}, {0x16B78, 0x16B7C}, - {0x16B90, 0x16EFF}, {0x16F45, 0x16F4F}, {0x16F7F, 0x16F8E}, - {0x16FA0, 0x16FDF}, {0x16FE1, 0x16FFF}, {0x187ED, 0x187FF}, - {0x18AF3, 0x1AFFF}, {0x1B002, 0x1BBFF}, {0x1BC6B, 0x1BC6F}, - {0x1BC7D, 0x1BC7F}, {0x1BC89, 0x1BC8F}, {0x1BC9A, 0x1BC9B}, - {0x1BCA4, 0x1CFFF}, {0x1D0F6, 0x1D0FF}, {0x1D127, 0x1D128}, - {0x1D1E9, 0x1D1FF}, {0x1D246, 0x1D2FF}, {0x1D357, 0x1D35F}, - {0x1D372, 0x1D3FF}, {0x1D455, 0x1D455}, {0x1D49D, 0x1D49D}, - {0x1D4A0, 0x1D4A1}, {0x1D4A3, 0x1D4A4}, {0x1D4A7, 0x1D4A8}, - {0x1D4AD, 0x1D4AD}, {0x1D4BA, 0x1D4BA}, {0x1D4BC, 0x1D4BC}, - {0x1D4C4, 0x1D4C4}, {0x1D506, 0x1D506}, {0x1D50B, 0x1D50C}, - {0x1D515, 0x1D515}, {0x1D51D, 0x1D51D}, {0x1D53A, 0x1D53A}, - {0x1D53F, 0x1D53F}, {0x1D545, 0x1D545}, {0x1D547, 0x1D549}, - {0x1D551, 0x1D551}, {0x1D6A6, 0x1D6A7}, {0x1D7CC, 0x1D7CD}, - {0x1DA8C, 0x1DA9A}, {0x1DAA0, 0x1DAA0}, {0x1DAB0, 0x1DFFF}, - {0x1E007, 0x1E007}, {0x1E019, 0x1E01A}, {0x1E022, 0x1E022}, - {0x1E025, 0x1E025}, {0x1E02B, 0x1E7FF}, {0x1E8C5, 0x1E8C6}, - {0x1E8D7, 0x1E8FF}, {0x1E94B, 0x1E94F}, {0x1E95A, 0x1E95D}, - {0x1E960, 0x1EDFF}, {0x1EE04, 0x1EE04}, {0x1EE20, 0x1EE20}, - {0x1EE23, 0x1EE23}, {0x1EE25, 0x1EE26}, {0x1EE28, 0x1EE28}, - {0x1EE33, 0x1EE33}, {0x1EE38, 0x1EE38}, {0x1EE3A, 0x1EE3A}, - {0x1EE3C, 0x1EE41}, {0x1EE43, 0x1EE46}, {0x1EE48, 0x1EE48}, - {0x1EE4A, 0x1EE4A}, {0x1EE4C, 0x1EE4C}, {0x1EE50, 0x1EE50}, - {0x1EE53, 0x1EE53}, {0x1EE55, 0x1EE56}, {0x1EE58, 0x1EE58}, - {0x1EE5A, 0x1EE5A}, {0x1EE5C, 0x1EE5C}, {0x1EE5E, 0x1EE5E}, - {0x1EE60, 0x1EE60}, {0x1EE63, 0x1EE63}, {0x1EE65, 0x1EE66}, - {0x1EE6B, 0x1EE6B}, {0x1EE73, 0x1EE73}, {0x1EE78, 0x1EE78}, - {0x1EE7D, 0x1EE7D}, {0x1EE7F, 0x1EE7F}, {0x1EE8A, 0x1EE8A}, - {0x1EE9C, 0x1EEA0}, {0x1EEA4, 0x1EEA4}, {0x1EEAA, 0x1EEAA}, - {0x1EEBC, 0x1EEEF}, {0x1EEF2, 0x1EFFF}, {0x1F02C, 0x1F02F}, - {0x1F094, 0x1F09F}, {0x1F0AF, 0x1F0B0}, {0x1F0C0, 0x1F0C0}, - {0x1F0D0, 0x1F0D0}, {0x1F0F6, 0x1F0FF}, {0x1F10D, 0x1F10F}, - {0x1F12F, 0x1F12F}, {0x1F16C, 0x1F16F}, {0x1F1AD, 0x1F1E5}, - {0x1F203, 0x1F20F}, {0x1F23C, 0x1F23F}, {0x1F249, 0x1F24F}, - {0x1F252, 0x1F2FF}, {0x1F6D3, 0x1F6DF}, {0x1F6ED, 0x1F6EF}, - {0x1F6F7, 0x1F6FF}, {0x1F774, 0x1F77F}, {0x1F7D5, 0x1F7FF}, - {0x1F80C, 0x1F80F}, {0x1F848, 0x1F84F}, {0x1F85A, 0x1F85F}, - {0x1F888, 0x1F88F}, {0x1F8AE, 0x1F90F}, {0x1F91F, 0x1F91F}, - {0x1F928, 0x1F92F}, {0x1F931, 0x1F932}, {0x1F93F, 0x1F93F}, - {0x1F94C, 0x1F94F}, {0x1F95F, 0x1F97F}, {0x1F992, 0x1F9BF}, - {0x1F9C1, 0x1FFFF}, {0x2A6D7, 0x2A6FF}, {0x2B735, 0x2B73F}, - {0x2B81E, 0x2B81F}, {0x2CEA2, 0x2F7FF}, {0x2FA1E, 0xE0000}, - {0xE0002, 0xE001F}, {0xE0080, 0xE00FF}, {0xE01F0, 0xEFFFF}, - {0xFFFFE, 0xFFFFF}, -} - -var neutral = table{ - {0x0000, 0x001F}, {0x007F, 0x00A0}, {0x00A9, 0x00A9}, - {0x00AB, 0x00AB}, {0x00B5, 0x00B5}, {0x00BB, 0x00BB}, - {0x00C0, 0x00C5}, {0x00C7, 0x00CF}, {0x00D1, 0x00D6}, - {0x00D9, 0x00DD}, {0x00E2, 0x00E5}, {0x00E7, 0x00E7}, - {0x00EB, 0x00EB}, {0x00EE, 0x00EF}, {0x00F1, 0x00F1}, - {0x00F4, 0x00F6}, {0x00FB, 0x00FB}, {0x00FD, 0x00FD}, - {0x00FF, 0x0100}, {0x0102, 0x0110}, {0x0112, 0x0112}, - {0x0114, 0x011A}, {0x011C, 0x0125}, {0x0128, 0x012A}, - {0x012C, 0x0130}, {0x0134, 0x0137}, {0x0139, 0x013E}, - {0x0143, 0x0143}, {0x0145, 0x0147}, {0x014C, 0x014C}, - {0x014E, 0x0151}, {0x0154, 0x0165}, {0x0168, 0x016A}, - {0x016C, 0x01CD}, {0x01CF, 0x01CF}, {0x01D1, 0x01D1}, - {0x01D3, 0x01D3}, {0x01D5, 0x01D5}, {0x01D7, 0x01D7}, - {0x01D9, 0x01D9}, {0x01DB, 0x01DB}, {0x01DD, 0x0250}, - {0x0252, 0x0260}, {0x0262, 0x02C3}, {0x02C5, 0x02C6}, - {0x02C8, 0x02C8}, {0x02CC, 0x02CC}, {0x02CE, 0x02CF}, - {0x02D1, 0x02D7}, {0x02DC, 0x02DC}, {0x02DE, 0x02DE}, - {0x02E0, 0x02FF}, {0x0370, 0x0377}, {0x037A, 0x037F}, - {0x0384, 0x038A}, {0x038C, 0x038C}, {0x038E, 0x0390}, - {0x03AA, 0x03B0}, {0x03C2, 0x03C2}, {0x03CA, 0x0400}, - {0x0402, 0x040F}, {0x0450, 0x0450}, {0x0452, 0x052F}, - {0x0531, 0x0556}, {0x0559, 0x055F}, {0x0561, 0x0587}, - {0x0589, 0x058A}, {0x058D, 0x058F}, {0x0591, 0x05C7}, - {0x05D0, 0x05EA}, {0x05F0, 0x05F4}, {0x0600, 0x061C}, - {0x061E, 0x070D}, {0x070F, 0x074A}, {0x074D, 0x07B1}, - {0x07C0, 0x07FA}, {0x0800, 0x082D}, {0x0830, 0x083E}, - {0x0840, 0x085B}, {0x085E, 0x085E}, {0x08A0, 0x08B4}, - {0x08B6, 0x08BD}, {0x08D4, 0x0983}, {0x0985, 0x098C}, - {0x098F, 0x0990}, {0x0993, 0x09A8}, {0x09AA, 0x09B0}, - {0x09B2, 0x09B2}, {0x09B6, 0x09B9}, {0x09BC, 0x09C4}, - {0x09C7, 0x09C8}, {0x09CB, 0x09CE}, {0x09D7, 0x09D7}, - {0x09DC, 0x09DD}, {0x09DF, 0x09E3}, {0x09E6, 0x09FB}, - {0x0A01, 0x0A03}, {0x0A05, 0x0A0A}, {0x0A0F, 0x0A10}, - {0x0A13, 0x0A28}, {0x0A2A, 0x0A30}, {0x0A32, 0x0A33}, - {0x0A35, 0x0A36}, {0x0A38, 0x0A39}, {0x0A3C, 0x0A3C}, - {0x0A3E, 0x0A42}, {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, - {0x0A51, 0x0A51}, {0x0A59, 0x0A5C}, {0x0A5E, 0x0A5E}, - {0x0A66, 0x0A75}, {0x0A81, 0x0A83}, {0x0A85, 0x0A8D}, - {0x0A8F, 0x0A91}, {0x0A93, 0x0AA8}, {0x0AAA, 0x0AB0}, - {0x0AB2, 0x0AB3}, {0x0AB5, 0x0AB9}, {0x0ABC, 0x0AC5}, - {0x0AC7, 0x0AC9}, {0x0ACB, 0x0ACD}, {0x0AD0, 0x0AD0}, - {0x0AE0, 0x0AE3}, {0x0AE6, 0x0AF1}, {0x0AF9, 0x0AF9}, - {0x0B01, 0x0B03}, {0x0B05, 0x0B0C}, {0x0B0F, 0x0B10}, - {0x0B13, 0x0B28}, {0x0B2A, 0x0B30}, {0x0B32, 0x0B33}, - {0x0B35, 0x0B39}, {0x0B3C, 0x0B44}, {0x0B47, 0x0B48}, - {0x0B4B, 0x0B4D}, {0x0B56, 0x0B57}, {0x0B5C, 0x0B5D}, - {0x0B5F, 0x0B63}, {0x0B66, 0x0B77}, {0x0B82, 0x0B83}, - {0x0B85, 0x0B8A}, {0x0B8E, 0x0B90}, {0x0B92, 0x0B95}, - {0x0B99, 0x0B9A}, {0x0B9C, 0x0B9C}, {0x0B9E, 0x0B9F}, - {0x0BA3, 0x0BA4}, {0x0BA8, 0x0BAA}, {0x0BAE, 0x0BB9}, - {0x0BBE, 0x0BC2}, {0x0BC6, 0x0BC8}, {0x0BCA, 0x0BCD}, - {0x0BD0, 0x0BD0}, {0x0BD7, 0x0BD7}, {0x0BE6, 0x0BFA}, - {0x0C00, 0x0C03}, {0x0C05, 0x0C0C}, {0x0C0E, 0x0C10}, - {0x0C12, 0x0C28}, {0x0C2A, 0x0C39}, {0x0C3D, 0x0C44}, - {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, {0x0C55, 0x0C56}, - {0x0C58, 0x0C5A}, {0x0C60, 0x0C63}, {0x0C66, 0x0C6F}, - {0x0C78, 0x0C83}, {0x0C85, 0x0C8C}, {0x0C8E, 0x0C90}, - {0x0C92, 0x0CA8}, {0x0CAA, 0x0CB3}, {0x0CB5, 0x0CB9}, - {0x0CBC, 0x0CC4}, {0x0CC6, 0x0CC8}, {0x0CCA, 0x0CCD}, - {0x0CD5, 0x0CD6}, {0x0CDE, 0x0CDE}, {0x0CE0, 0x0CE3}, - {0x0CE6, 0x0CEF}, {0x0CF1, 0x0CF2}, {0x0D01, 0x0D03}, - {0x0D05, 0x0D0C}, {0x0D0E, 0x0D10}, {0x0D12, 0x0D3A}, - {0x0D3D, 0x0D44}, {0x0D46, 0x0D48}, {0x0D4A, 0x0D4F}, - {0x0D54, 0x0D63}, {0x0D66, 0x0D7F}, {0x0D82, 0x0D83}, - {0x0D85, 0x0D96}, {0x0D9A, 0x0DB1}, {0x0DB3, 0x0DBB}, - {0x0DBD, 0x0DBD}, {0x0DC0, 0x0DC6}, {0x0DCA, 0x0DCA}, - {0x0DCF, 0x0DD4}, {0x0DD6, 0x0DD6}, {0x0DD8, 0x0DDF}, - {0x0DE6, 0x0DEF}, {0x0DF2, 0x0DF4}, {0x0E01, 0x0E3A}, - {0x0E3F, 0x0E5B}, {0x0E81, 0x0E82}, {0x0E84, 0x0E84}, - {0x0E87, 0x0E88}, {0x0E8A, 0x0E8A}, {0x0E8D, 0x0E8D}, - {0x0E94, 0x0E97}, {0x0E99, 0x0E9F}, {0x0EA1, 0x0EA3}, - {0x0EA5, 0x0EA5}, {0x0EA7, 0x0EA7}, {0x0EAA, 0x0EAB}, - {0x0EAD, 0x0EB9}, {0x0EBB, 0x0EBD}, {0x0EC0, 0x0EC4}, - {0x0EC6, 0x0EC6}, {0x0EC8, 0x0ECD}, {0x0ED0, 0x0ED9}, - {0x0EDC, 0x0EDF}, {0x0F00, 0x0F47}, {0x0F49, 0x0F6C}, - {0x0F71, 0x0F97}, {0x0F99, 0x0FBC}, {0x0FBE, 0x0FCC}, - {0x0FCE, 0x0FDA}, {0x1000, 0x10C5}, {0x10C7, 0x10C7}, - {0x10CD, 0x10CD}, {0x10D0, 0x10FF}, {0x1160, 0x1248}, - {0x124A, 0x124D}, {0x1250, 0x1256}, {0x1258, 0x1258}, - {0x125A, 0x125D}, {0x1260, 0x1288}, {0x128A, 0x128D}, - {0x1290, 0x12B0}, {0x12B2, 0x12B5}, {0x12B8, 0x12BE}, - {0x12C0, 0x12C0}, {0x12C2, 0x12C5}, {0x12C8, 0x12D6}, - {0x12D8, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x135A}, - {0x135D, 0x137C}, {0x1380, 0x1399}, {0x13A0, 0x13F5}, - {0x13F8, 0x13FD}, {0x1400, 0x169C}, {0x16A0, 0x16F8}, - {0x1700, 0x170C}, {0x170E, 0x1714}, {0x1720, 0x1736}, - {0x1740, 0x1753}, {0x1760, 0x176C}, {0x176E, 0x1770}, - {0x1772, 0x1773}, {0x1780, 0x17DD}, {0x17E0, 0x17E9}, - {0x17F0, 0x17F9}, {0x1800, 0x180E}, {0x1810, 0x1819}, - {0x1820, 0x1877}, {0x1880, 0x18AA}, {0x18B0, 0x18F5}, - {0x1900, 0x191E}, {0x1920, 0x192B}, {0x1930, 0x193B}, - {0x1940, 0x1940}, {0x1944, 0x196D}, {0x1970, 0x1974}, - {0x1980, 0x19AB}, {0x19B0, 0x19C9}, {0x19D0, 0x19DA}, - {0x19DE, 0x1A1B}, {0x1A1E, 0x1A5E}, {0x1A60, 0x1A7C}, - {0x1A7F, 0x1A89}, {0x1A90, 0x1A99}, {0x1AA0, 0x1AAD}, - {0x1AB0, 0x1ABE}, {0x1B00, 0x1B4B}, {0x1B50, 0x1B7C}, - {0x1B80, 0x1BF3}, {0x1BFC, 0x1C37}, {0x1C3B, 0x1C49}, - {0x1C4D, 0x1C88}, {0x1CC0, 0x1CC7}, {0x1CD0, 0x1CF6}, - {0x1CF8, 0x1CF9}, {0x1D00, 0x1DF5}, {0x1DFB, 0x1F15}, - {0x1F18, 0x1F1D}, {0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, - {0x1F50, 0x1F57}, {0x1F59, 0x1F59}, {0x1F5B, 0x1F5B}, - {0x1F5D, 0x1F5D}, {0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4}, - {0x1FB6, 0x1FC4}, {0x1FC6, 0x1FD3}, {0x1FD6, 0x1FDB}, - {0x1FDD, 0x1FEF}, {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFE}, - {0x2000, 0x200F}, {0x2011, 0x2012}, {0x2017, 0x2017}, - {0x201A, 0x201B}, {0x201E, 0x201F}, {0x2023, 0x2023}, - {0x2028, 0x202F}, {0x2031, 0x2031}, {0x2034, 0x2034}, - {0x2036, 0x203A}, {0x203C, 0x203D}, {0x203F, 0x2064}, - {0x2066, 0x2071}, {0x2075, 0x207E}, {0x2080, 0x2080}, - {0x2085, 0x208E}, {0x2090, 0x209C}, {0x20A0, 0x20A8}, - {0x20AA, 0x20AB}, {0x20AD, 0x20BE}, {0x20D0, 0x20F0}, - {0x2100, 0x2102}, {0x2104, 0x2104}, {0x2106, 0x2108}, - {0x210A, 0x2112}, {0x2114, 0x2115}, {0x2117, 0x2120}, - {0x2123, 0x2125}, {0x2127, 0x212A}, {0x212C, 0x2152}, - {0x2155, 0x215A}, {0x215F, 0x215F}, {0x216C, 0x216F}, - {0x217A, 0x2188}, {0x218A, 0x218B}, {0x219A, 0x21B7}, - {0x21BA, 0x21D1}, {0x21D3, 0x21D3}, {0x21D5, 0x21E6}, - {0x21E8, 0x21FF}, {0x2201, 0x2201}, {0x2204, 0x2206}, - {0x2209, 0x220A}, {0x220C, 0x220E}, {0x2210, 0x2210}, - {0x2212, 0x2214}, {0x2216, 0x2219}, {0x221B, 0x221C}, - {0x2221, 0x2222}, {0x2224, 0x2224}, {0x2226, 0x2226}, - {0x222D, 0x222D}, {0x222F, 0x2233}, {0x2238, 0x223B}, - {0x223E, 0x2247}, {0x2249, 0x224B}, {0x224D, 0x2251}, - {0x2253, 0x225F}, {0x2262, 0x2263}, {0x2268, 0x2269}, - {0x226C, 0x226D}, {0x2270, 0x2281}, {0x2284, 0x2285}, - {0x2288, 0x2294}, {0x2296, 0x2298}, {0x229A, 0x22A4}, - {0x22A6, 0x22BE}, {0x22C0, 0x2311}, {0x2313, 0x2319}, - {0x231C, 0x2328}, {0x232B, 0x23E8}, {0x23ED, 0x23EF}, - {0x23F1, 0x23F2}, {0x23F4, 0x23FE}, {0x2400, 0x2426}, - {0x2440, 0x244A}, {0x24EA, 0x24EA}, {0x254C, 0x254F}, - {0x2574, 0x257F}, {0x2590, 0x2591}, {0x2596, 0x259F}, - {0x25A2, 0x25A2}, {0x25AA, 0x25B1}, {0x25B4, 0x25B5}, - {0x25B8, 0x25BB}, {0x25BE, 0x25BF}, {0x25C2, 0x25C5}, - {0x25C9, 0x25CA}, {0x25CC, 0x25CD}, {0x25D2, 0x25E1}, - {0x25E6, 0x25EE}, {0x25F0, 0x25FC}, {0x25FF, 0x2604}, - {0x2607, 0x2608}, {0x260A, 0x260D}, {0x2610, 0x2613}, - {0x2616, 0x261B}, {0x261D, 0x261D}, {0x261F, 0x263F}, - {0x2641, 0x2641}, {0x2643, 0x2647}, {0x2654, 0x265F}, - {0x2662, 0x2662}, {0x2666, 0x2666}, {0x266B, 0x266B}, - {0x266E, 0x266E}, {0x2670, 0x267E}, {0x2680, 0x2692}, - {0x2694, 0x269D}, {0x26A0, 0x26A0}, {0x26A2, 0x26A9}, - {0x26AC, 0x26BC}, {0x26C0, 0x26C3}, {0x26E2, 0x26E2}, - {0x26E4, 0x26E7}, {0x2700, 0x2704}, {0x2706, 0x2709}, - {0x270C, 0x2727}, {0x2729, 0x273C}, {0x273E, 0x274B}, - {0x274D, 0x274D}, {0x274F, 0x2752}, {0x2756, 0x2756}, - {0x2758, 0x2775}, {0x2780, 0x2794}, {0x2798, 0x27AF}, - {0x27B1, 0x27BE}, {0x27C0, 0x27E5}, {0x27EE, 0x2984}, - {0x2987, 0x2B1A}, {0x2B1D, 0x2B4F}, {0x2B51, 0x2B54}, - {0x2B5A, 0x2B73}, {0x2B76, 0x2B95}, {0x2B98, 0x2BB9}, - {0x2BBD, 0x2BC8}, {0x2BCA, 0x2BD1}, {0x2BEC, 0x2BEF}, - {0x2C00, 0x2C2E}, {0x2C30, 0x2C5E}, {0x2C60, 0x2CF3}, - {0x2CF9, 0x2D25}, {0x2D27, 0x2D27}, {0x2D2D, 0x2D2D}, - {0x2D30, 0x2D67}, {0x2D6F, 0x2D70}, {0x2D7F, 0x2D96}, - {0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6}, - {0x2DB8, 0x2DBE}, {0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE}, - {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, {0x2DE0, 0x2E44}, - {0x303F, 0x303F}, {0x4DC0, 0x4DFF}, {0xA4D0, 0xA62B}, - {0xA640, 0xA6F7}, {0xA700, 0xA7AE}, {0xA7B0, 0xA7B7}, - {0xA7F7, 0xA82B}, {0xA830, 0xA839}, {0xA840, 0xA877}, - {0xA880, 0xA8C5}, {0xA8CE, 0xA8D9}, {0xA8E0, 0xA8FD}, - {0xA900, 0xA953}, {0xA95F, 0xA95F}, {0xA980, 0xA9CD}, - {0xA9CF, 0xA9D9}, {0xA9DE, 0xA9FE}, {0xAA00, 0xAA36}, - {0xAA40, 0xAA4D}, {0xAA50, 0xAA59}, {0xAA5C, 0xAAC2}, - {0xAADB, 0xAAF6}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E}, - {0xAB11, 0xAB16}, {0xAB20, 0xAB26}, {0xAB28, 0xAB2E}, - {0xAB30, 0xAB65}, {0xAB70, 0xABED}, {0xABF0, 0xABF9}, - {0xD7B0, 0xD7C6}, {0xD7CB, 0xD7FB}, {0xD800, 0xDFFF}, - {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFB1D, 0xFB36}, - {0xFB38, 0xFB3C}, {0xFB3E, 0xFB3E}, {0xFB40, 0xFB41}, - {0xFB43, 0xFB44}, {0xFB46, 0xFBC1}, {0xFBD3, 0xFD3F}, - {0xFD50, 0xFD8F}, {0xFD92, 0xFDC7}, {0xFDF0, 0xFDFD}, - {0xFE20, 0xFE2F}, {0xFE70, 0xFE74}, {0xFE76, 0xFEFC}, - {0xFEFF, 0xFEFF}, {0xFFF9, 0xFFFC}, {0x10000, 0x1000B}, - {0x1000D, 0x10026}, {0x10028, 0x1003A}, {0x1003C, 0x1003D}, - {0x1003F, 0x1004D}, {0x10050, 0x1005D}, {0x10080, 0x100FA}, - {0x10100, 0x10102}, {0x10107, 0x10133}, {0x10137, 0x1018E}, - {0x10190, 0x1019B}, {0x101A0, 0x101A0}, {0x101D0, 0x101FD}, - {0x10280, 0x1029C}, {0x102A0, 0x102D0}, {0x102E0, 0x102FB}, - {0x10300, 0x10323}, {0x10330, 0x1034A}, {0x10350, 0x1037A}, - {0x10380, 0x1039D}, {0x1039F, 0x103C3}, {0x103C8, 0x103D5}, - {0x10400, 0x1049D}, {0x104A0, 0x104A9}, {0x104B0, 0x104D3}, - {0x104D8, 0x104FB}, {0x10500, 0x10527}, {0x10530, 0x10563}, - {0x1056F, 0x1056F}, {0x10600, 0x10736}, {0x10740, 0x10755}, - {0x10760, 0x10767}, {0x10800, 0x10805}, {0x10808, 0x10808}, - {0x1080A, 0x10835}, {0x10837, 0x10838}, {0x1083C, 0x1083C}, - {0x1083F, 0x10855}, {0x10857, 0x1089E}, {0x108A7, 0x108AF}, - {0x108E0, 0x108F2}, {0x108F4, 0x108F5}, {0x108FB, 0x1091B}, - {0x1091F, 0x10939}, {0x1093F, 0x1093F}, {0x10980, 0x109B7}, - {0x109BC, 0x109CF}, {0x109D2, 0x10A03}, {0x10A05, 0x10A06}, - {0x10A0C, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A33}, - {0x10A38, 0x10A3A}, {0x10A3F, 0x10A47}, {0x10A50, 0x10A58}, - {0x10A60, 0x10A9F}, {0x10AC0, 0x10AE6}, {0x10AEB, 0x10AF6}, - {0x10B00, 0x10B35}, {0x10B39, 0x10B55}, {0x10B58, 0x10B72}, - {0x10B78, 0x10B91}, {0x10B99, 0x10B9C}, {0x10BA9, 0x10BAF}, - {0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, - {0x10CFA, 0x10CFF}, {0x10E60, 0x10E7E}, {0x11000, 0x1104D}, - {0x11052, 0x1106F}, {0x1107F, 0x110C1}, {0x110D0, 0x110E8}, - {0x110F0, 0x110F9}, {0x11100, 0x11134}, {0x11136, 0x11143}, - {0x11150, 0x11176}, {0x11180, 0x111CD}, {0x111D0, 0x111DF}, - {0x111E1, 0x111F4}, {0x11200, 0x11211}, {0x11213, 0x1123E}, - {0x11280, 0x11286}, {0x11288, 0x11288}, {0x1128A, 0x1128D}, - {0x1128F, 0x1129D}, {0x1129F, 0x112A9}, {0x112B0, 0x112EA}, - {0x112F0, 0x112F9}, {0x11300, 0x11303}, {0x11305, 0x1130C}, - {0x1130F, 0x11310}, {0x11313, 0x11328}, {0x1132A, 0x11330}, - {0x11332, 0x11333}, {0x11335, 0x11339}, {0x1133C, 0x11344}, - {0x11347, 0x11348}, {0x1134B, 0x1134D}, {0x11350, 0x11350}, - {0x11357, 0x11357}, {0x1135D, 0x11363}, {0x11366, 0x1136C}, - {0x11370, 0x11374}, {0x11400, 0x11459}, {0x1145B, 0x1145B}, - {0x1145D, 0x1145D}, {0x11480, 0x114C7}, {0x114D0, 0x114D9}, - {0x11580, 0x115B5}, {0x115B8, 0x115DD}, {0x11600, 0x11644}, - {0x11650, 0x11659}, {0x11660, 0x1166C}, {0x11680, 0x116B7}, - {0x116C0, 0x116C9}, {0x11700, 0x11719}, {0x1171D, 0x1172B}, - {0x11730, 0x1173F}, {0x118A0, 0x118F2}, {0x118FF, 0x118FF}, - {0x11AC0, 0x11AF8}, {0x11C00, 0x11C08}, {0x11C0A, 0x11C36}, - {0x11C38, 0x11C45}, {0x11C50, 0x11C6C}, {0x11C70, 0x11C8F}, - {0x11C92, 0x11CA7}, {0x11CA9, 0x11CB6}, {0x12000, 0x12399}, - {0x12400, 0x1246E}, {0x12470, 0x12474}, {0x12480, 0x12543}, - {0x13000, 0x1342E}, {0x14400, 0x14646}, {0x16800, 0x16A38}, - {0x16A40, 0x16A5E}, {0x16A60, 0x16A69}, {0x16A6E, 0x16A6F}, - {0x16AD0, 0x16AED}, {0x16AF0, 0x16AF5}, {0x16B00, 0x16B45}, - {0x16B50, 0x16B59}, {0x16B5B, 0x16B61}, {0x16B63, 0x16B77}, - {0x16B7D, 0x16B8F}, {0x16F00, 0x16F44}, {0x16F50, 0x16F7E}, - {0x16F8F, 0x16F9F}, {0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C}, - {0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1BC9C, 0x1BCA3}, - {0x1D000, 0x1D0F5}, {0x1D100, 0x1D126}, {0x1D129, 0x1D1E8}, - {0x1D200, 0x1D245}, {0x1D300, 0x1D356}, {0x1D360, 0x1D371}, - {0x1D400, 0x1D454}, {0x1D456, 0x1D49C}, {0x1D49E, 0x1D49F}, - {0x1D4A2, 0x1D4A2}, {0x1D4A5, 0x1D4A6}, {0x1D4A9, 0x1D4AC}, - {0x1D4AE, 0x1D4B9}, {0x1D4BB, 0x1D4BB}, {0x1D4BD, 0x1D4C3}, - {0x1D4C5, 0x1D505}, {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, - {0x1D516, 0x1D51C}, {0x1D51E, 0x1D539}, {0x1D53B, 0x1D53E}, - {0x1D540, 0x1D544}, {0x1D546, 0x1D546}, {0x1D54A, 0x1D550}, - {0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D7CB}, {0x1D7CE, 0x1DA8B}, - {0x1DA9B, 0x1DA9F}, {0x1DAA1, 0x1DAAF}, {0x1E000, 0x1E006}, - {0x1E008, 0x1E018}, {0x1E01B, 0x1E021}, {0x1E023, 0x1E024}, - {0x1E026, 0x1E02A}, {0x1E800, 0x1E8C4}, {0x1E8C7, 0x1E8D6}, - {0x1E900, 0x1E94A}, {0x1E950, 0x1E959}, {0x1E95E, 0x1E95F}, - {0x1EE00, 0x1EE03}, {0x1EE05, 0x1EE1F}, {0x1EE21, 0x1EE22}, - {0x1EE24, 0x1EE24}, {0x1EE27, 0x1EE27}, {0x1EE29, 0x1EE32}, - {0x1EE34, 0x1EE37}, {0x1EE39, 0x1EE39}, {0x1EE3B, 0x1EE3B}, - {0x1EE42, 0x1EE42}, {0x1EE47, 0x1EE47}, {0x1EE49, 0x1EE49}, - {0x1EE4B, 0x1EE4B}, {0x1EE4D, 0x1EE4F}, {0x1EE51, 0x1EE52}, - {0x1EE54, 0x1EE54}, {0x1EE57, 0x1EE57}, {0x1EE59, 0x1EE59}, - {0x1EE5B, 0x1EE5B}, {0x1EE5D, 0x1EE5D}, {0x1EE5F, 0x1EE5F}, - {0x1EE61, 0x1EE62}, {0x1EE64, 0x1EE64}, {0x1EE67, 0x1EE6A}, - {0x1EE6C, 0x1EE72}, {0x1EE74, 0x1EE77}, {0x1EE79, 0x1EE7C}, - {0x1EE7E, 0x1EE7E}, {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B}, - {0x1EEA1, 0x1EEA3}, {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, - {0x1EEF0, 0x1EEF1}, {0x1F000, 0x1F003}, {0x1F005, 0x1F02B}, - {0x1F030, 0x1F093}, {0x1F0A0, 0x1F0AE}, {0x1F0B1, 0x1F0BF}, - {0x1F0C1, 0x1F0CE}, {0x1F0D1, 0x1F0F5}, {0x1F10B, 0x1F10C}, - {0x1F12E, 0x1F12E}, {0x1F16A, 0x1F16B}, {0x1F1E6, 0x1F1FF}, - {0x1F321, 0x1F32C}, {0x1F336, 0x1F336}, {0x1F37D, 0x1F37D}, - {0x1F394, 0x1F39F}, {0x1F3CB, 0x1F3CE}, {0x1F3D4, 0x1F3DF}, - {0x1F3F1, 0x1F3F3}, {0x1F3F5, 0x1F3F7}, {0x1F43F, 0x1F43F}, - {0x1F441, 0x1F441}, {0x1F4FD, 0x1F4FE}, {0x1F53E, 0x1F54A}, - {0x1F54F, 0x1F54F}, {0x1F568, 0x1F579}, {0x1F57B, 0x1F594}, - {0x1F597, 0x1F5A3}, {0x1F5A5, 0x1F5FA}, {0x1F650, 0x1F67F}, - {0x1F6C6, 0x1F6CB}, {0x1F6CD, 0x1F6CF}, {0x1F6E0, 0x1F6EA}, - {0x1F6F0, 0x1F6F3}, {0x1F700, 0x1F773}, {0x1F780, 0x1F7D4}, - {0x1F800, 0x1F80B}, {0x1F810, 0x1F847}, {0x1F850, 0x1F859}, - {0x1F860, 0x1F887}, {0x1F890, 0x1F8AD}, {0xE0001, 0xE0001}, - {0xE0020, 0xE007F}, -} - // Condition have flag EastAsianWidth whether the current locale is CJK or not. type Condition struct { - EastAsianWidth bool - ZeroWidthJoiner bool + EastAsianWidth bool } // NewCondition return new instance of Condition which is current locale. func NewCondition() *Condition { return &Condition{ - EastAsianWidth: EastAsianWidth, - ZeroWidthJoiner: ZeroWidthJoiner, + EastAsianWidth: EastAsianWidth, } } @@ -822,46 +97,29 @@ func NewCondition() *Condition { // See http://www.unicode.org/reports/tr11/ func (c *Condition) RuneWidth(r rune) int { switch { - case r < 0 || r > 0x10FFFF || - inTables(r, nonprint, combining, notassigned): + case r < 0 || r > 0x10FFFF || inTables(r, nonprint, combining, notassigned): return 0 - case (c.EastAsianWidth && IsAmbiguousWidth(r)) || - inTables(r, doublewidth, emoji): + case (c.EastAsianWidth && IsAmbiguousWidth(r)) || inTables(r, doublewidth): return 2 default: return 1 } } -func (c *Condition) stringWidth(s string) (width int) { - for _, r := range []rune(s) { - width += c.RuneWidth(r) - } - return width -} - -func (c *Condition) stringWidthZeroJoiner(s string) (width int) { - r1, r2 := rune(0), rune(0) - for _, r := range []rune(s) { - if r == 0xFE0E || r == 0xFE0F { - continue - } - w := c.RuneWidth(r) - if r2 == 0x200D && inTables(r, emoji) && inTables(r1, emoji) { - w = 0 - } - width += w - r1, r2 = r2, r - } - return width -} - // StringWidth return width as you can see func (c *Condition) StringWidth(s string) (width int) { - if c.ZeroWidthJoiner { - return c.stringWidthZeroJoiner(s) + g := uniseg.NewGraphemes(s) + for g.Next() { + var chWidth int + for _, r := range g.Runes() { + chWidth = c.RuneWidth(r) + if chWidth > 0 { + break // Our best guess at this point is to use the width of the first non-zero-width rune. + } + } + width += chWidth } - return c.stringWidth(s) + return } // Truncate return string truncated with w cells @@ -869,19 +127,25 @@ func (c *Condition) Truncate(s string, w int, tail string) string { if c.StringWidth(s) <= w { return s } - r := []rune(s) - tw := c.StringWidth(tail) - w -= tw - width := 0 - i := 0 - for ; i < len(r); i++ { - cw := c.RuneWidth(r[i]) - if width+cw > w { + w -= c.StringWidth(tail) + var width int + pos := len(s) + g := uniseg.NewGraphemes(s) + for g.Next() { + var chWidth int + for _, r := range g.Runes() { + chWidth = c.RuneWidth(r) + if chWidth > 0 { + break // See StringWidth() for details. + } + } + if width+chWidth > w { + pos, _ = g.Positions() break } - width += cw + width += chWidth } - return string(r[0:i]) + tail + return s[:pos] + tail } // Wrap return string wrapped with w cells @@ -889,7 +153,7 @@ func (c *Condition) Wrap(s string, w int) string { width := 0 out := "" for _, r := range []rune(s) { - cw := RuneWidth(r) + cw := c.RuneWidth(r) if r == '\n' { out += string(r) width = 0 diff --git a/vendor/github.com/mattn/go-runewidth/runewidth_posix.go b/vendor/github.com/mattn/go-runewidth/runewidth_posix.go index 66a58b5d87..480ad74853 100644 --- a/vendor/github.com/mattn/go-runewidth/runewidth_posix.go +++ b/vendor/github.com/mattn/go-runewidth/runewidth_posix.go @@ -62,7 +62,10 @@ func isEastAsian(locale string) bool { // IsEastAsian return true if the current locale is CJK func IsEastAsian() bool { - locale := os.Getenv("LC_CTYPE") + locale := os.Getenv("LC_ALL") + if locale == "" { + locale = os.Getenv("LC_CTYPE") + } if locale == "" { locale = os.Getenv("LANG") } diff --git a/vendor/github.com/mattn/go-runewidth/runewidth_table.go b/vendor/github.com/mattn/go-runewidth/runewidth_table.go new file mode 100644 index 0000000000..b27d77d891 --- /dev/null +++ b/vendor/github.com/mattn/go-runewidth/runewidth_table.go @@ -0,0 +1,437 @@ +// Code generated by script/generate.go. DO NOT EDIT. + +package runewidth + +var combining = table{ + {0x0300, 0x036F}, {0x0483, 0x0489}, {0x07EB, 0x07F3}, + {0x0C00, 0x0C00}, {0x0C04, 0x0C04}, {0x0D00, 0x0D01}, + {0x135D, 0x135F}, {0x1A7F, 0x1A7F}, {0x1AB0, 0x1AC0}, + {0x1B6B, 0x1B73}, {0x1DC0, 0x1DF9}, {0x1DFB, 0x1DFF}, + {0x20D0, 0x20F0}, {0x2CEF, 0x2CF1}, {0x2DE0, 0x2DFF}, + {0x3099, 0x309A}, {0xA66F, 0xA672}, {0xA674, 0xA67D}, + {0xA69E, 0xA69F}, {0xA6F0, 0xA6F1}, {0xA8E0, 0xA8F1}, + {0xFE20, 0xFE2F}, {0x101FD, 0x101FD}, {0x10376, 0x1037A}, + {0x10EAB, 0x10EAC}, {0x10F46, 0x10F50}, {0x11300, 0x11301}, + {0x1133B, 0x1133C}, {0x11366, 0x1136C}, {0x11370, 0x11374}, + {0x16AF0, 0x16AF4}, {0x1D165, 0x1D169}, {0x1D16D, 0x1D172}, + {0x1D17B, 0x1D182}, {0x1D185, 0x1D18B}, {0x1D1AA, 0x1D1AD}, + {0x1D242, 0x1D244}, {0x1E000, 0x1E006}, {0x1E008, 0x1E018}, + {0x1E01B, 0x1E021}, {0x1E023, 0x1E024}, {0x1E026, 0x1E02A}, + {0x1E8D0, 0x1E8D6}, +} + +var doublewidth = table{ + {0x1100, 0x115F}, {0x231A, 0x231B}, {0x2329, 0x232A}, + {0x23E9, 0x23EC}, {0x23F0, 0x23F0}, {0x23F3, 0x23F3}, + {0x25FD, 0x25FE}, {0x2614, 0x2615}, {0x2648, 0x2653}, + {0x267F, 0x267F}, {0x2693, 0x2693}, {0x26A1, 0x26A1}, + {0x26AA, 0x26AB}, {0x26BD, 0x26BE}, {0x26C4, 0x26C5}, + {0x26CE, 0x26CE}, {0x26D4, 0x26D4}, {0x26EA, 0x26EA}, + {0x26F2, 0x26F3}, {0x26F5, 0x26F5}, {0x26FA, 0x26FA}, + {0x26FD, 0x26FD}, {0x2705, 0x2705}, {0x270A, 0x270B}, + {0x2728, 0x2728}, {0x274C, 0x274C}, {0x274E, 0x274E}, + {0x2753, 0x2755}, {0x2757, 0x2757}, {0x2795, 0x2797}, + {0x27B0, 0x27B0}, {0x27BF, 0x27BF}, {0x2B1B, 0x2B1C}, + {0x2B50, 0x2B50}, {0x2B55, 0x2B55}, {0x2E80, 0x2E99}, + {0x2E9B, 0x2EF3}, {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB}, + {0x3000, 0x303E}, {0x3041, 0x3096}, {0x3099, 0x30FF}, + {0x3105, 0x312F}, {0x3131, 0x318E}, {0x3190, 0x31E3}, + {0x31F0, 0x321E}, {0x3220, 0x3247}, {0x3250, 0x4DBF}, + {0x4E00, 0xA48C}, {0xA490, 0xA4C6}, {0xA960, 0xA97C}, + {0xAC00, 0xD7A3}, {0xF900, 0xFAFF}, {0xFE10, 0xFE19}, + {0xFE30, 0xFE52}, {0xFE54, 0xFE66}, {0xFE68, 0xFE6B}, + {0xFF01, 0xFF60}, {0xFFE0, 0xFFE6}, {0x16FE0, 0x16FE4}, + {0x16FF0, 0x16FF1}, {0x17000, 0x187F7}, {0x18800, 0x18CD5}, + {0x18D00, 0x18D08}, {0x1B000, 0x1B11E}, {0x1B150, 0x1B152}, + {0x1B164, 0x1B167}, {0x1B170, 0x1B2FB}, {0x1F004, 0x1F004}, + {0x1F0CF, 0x1F0CF}, {0x1F18E, 0x1F18E}, {0x1F191, 0x1F19A}, + {0x1F200, 0x1F202}, {0x1F210, 0x1F23B}, {0x1F240, 0x1F248}, + {0x1F250, 0x1F251}, {0x1F260, 0x1F265}, {0x1F300, 0x1F320}, + {0x1F32D, 0x1F335}, {0x1F337, 0x1F37C}, {0x1F37E, 0x1F393}, + {0x1F3A0, 0x1F3CA}, {0x1F3CF, 0x1F3D3}, {0x1F3E0, 0x1F3F0}, + {0x1F3F4, 0x1F3F4}, {0x1F3F8, 0x1F43E}, {0x1F440, 0x1F440}, + {0x1F442, 0x1F4FC}, {0x1F4FF, 0x1F53D}, {0x1F54B, 0x1F54E}, + {0x1F550, 0x1F567}, {0x1F57A, 0x1F57A}, {0x1F595, 0x1F596}, + {0x1F5A4, 0x1F5A4}, {0x1F5FB, 0x1F64F}, {0x1F680, 0x1F6C5}, + {0x1F6CC, 0x1F6CC}, {0x1F6D0, 0x1F6D2}, {0x1F6D5, 0x1F6D7}, + {0x1F6EB, 0x1F6EC}, {0x1F6F4, 0x1F6FC}, {0x1F7E0, 0x1F7EB}, + {0x1F90C, 0x1F93A}, {0x1F93C, 0x1F945}, {0x1F947, 0x1F978}, + {0x1F97A, 0x1F9CB}, {0x1F9CD, 0x1F9FF}, {0x1FA70, 0x1FA74}, + {0x1FA78, 0x1FA7A}, {0x1FA80, 0x1FA86}, {0x1FA90, 0x1FAA8}, + {0x1FAB0, 0x1FAB6}, {0x1FAC0, 0x1FAC2}, {0x1FAD0, 0x1FAD6}, + {0x20000, 0x2FFFD}, {0x30000, 0x3FFFD}, +} + +var ambiguous = table{ + {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8}, + {0x00AA, 0x00AA}, {0x00AD, 0x00AE}, {0x00B0, 0x00B4}, + {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6}, + {0x00D0, 0x00D0}, {0x00D7, 0x00D8}, {0x00DE, 0x00E1}, + {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED}, + {0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA}, + {0x00FC, 0x00FC}, {0x00FE, 0x00FE}, {0x0101, 0x0101}, + {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B}, + {0x0126, 0x0127}, {0x012B, 0x012B}, {0x0131, 0x0133}, + {0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144}, + {0x0148, 0x014B}, {0x014D, 0x014D}, {0x0152, 0x0153}, + {0x0166, 0x0167}, {0x016B, 0x016B}, {0x01CE, 0x01CE}, + {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4}, + {0x01D6, 0x01D6}, {0x01D8, 0x01D8}, {0x01DA, 0x01DA}, + {0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261}, + {0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB}, + {0x02CD, 0x02CD}, {0x02D0, 0x02D0}, {0x02D8, 0x02DB}, + {0x02DD, 0x02DD}, {0x02DF, 0x02DF}, {0x0300, 0x036F}, + {0x0391, 0x03A1}, {0x03A3, 0x03A9}, {0x03B1, 0x03C1}, + {0x03C3, 0x03C9}, {0x0401, 0x0401}, {0x0410, 0x044F}, + {0x0451, 0x0451}, {0x2010, 0x2010}, {0x2013, 0x2016}, + {0x2018, 0x2019}, {0x201C, 0x201D}, {0x2020, 0x2022}, + {0x2024, 0x2027}, {0x2030, 0x2030}, {0x2032, 0x2033}, + {0x2035, 0x2035}, {0x203B, 0x203B}, {0x203E, 0x203E}, + {0x2074, 0x2074}, {0x207F, 0x207F}, {0x2081, 0x2084}, + {0x20AC, 0x20AC}, {0x2103, 0x2103}, {0x2105, 0x2105}, + {0x2109, 0x2109}, {0x2113, 0x2113}, {0x2116, 0x2116}, + {0x2121, 0x2122}, {0x2126, 0x2126}, {0x212B, 0x212B}, + {0x2153, 0x2154}, {0x215B, 0x215E}, {0x2160, 0x216B}, + {0x2170, 0x2179}, {0x2189, 0x2189}, {0x2190, 0x2199}, + {0x21B8, 0x21B9}, {0x21D2, 0x21D2}, {0x21D4, 0x21D4}, + {0x21E7, 0x21E7}, {0x2200, 0x2200}, {0x2202, 0x2203}, + {0x2207, 0x2208}, {0x220B, 0x220B}, {0x220F, 0x220F}, + {0x2211, 0x2211}, {0x2215, 0x2215}, {0x221A, 0x221A}, + {0x221D, 0x2220}, {0x2223, 0x2223}, {0x2225, 0x2225}, + {0x2227, 0x222C}, {0x222E, 0x222E}, {0x2234, 0x2237}, + {0x223C, 0x223D}, {0x2248, 0x2248}, {0x224C, 0x224C}, + {0x2252, 0x2252}, {0x2260, 0x2261}, {0x2264, 0x2267}, + {0x226A, 0x226B}, {0x226E, 0x226F}, {0x2282, 0x2283}, + {0x2286, 0x2287}, {0x2295, 0x2295}, {0x2299, 0x2299}, + {0x22A5, 0x22A5}, {0x22BF, 0x22BF}, {0x2312, 0x2312}, + {0x2460, 0x24E9}, {0x24EB, 0x254B}, {0x2550, 0x2573}, + {0x2580, 0x258F}, {0x2592, 0x2595}, {0x25A0, 0x25A1}, + {0x25A3, 0x25A9}, {0x25B2, 0x25B3}, {0x25B6, 0x25B7}, + {0x25BC, 0x25BD}, {0x25C0, 0x25C1}, {0x25C6, 0x25C8}, + {0x25CB, 0x25CB}, {0x25CE, 0x25D1}, {0x25E2, 0x25E5}, + {0x25EF, 0x25EF}, {0x2605, 0x2606}, {0x2609, 0x2609}, + {0x260E, 0x260F}, {0x261C, 0x261C}, {0x261E, 0x261E}, + {0x2640, 0x2640}, {0x2642, 0x2642}, {0x2660, 0x2661}, + {0x2663, 0x2665}, {0x2667, 0x266A}, {0x266C, 0x266D}, + {0x266F, 0x266F}, {0x269E, 0x269F}, {0x26BF, 0x26BF}, + {0x26C6, 0x26CD}, {0x26CF, 0x26D3}, {0x26D5, 0x26E1}, + {0x26E3, 0x26E3}, {0x26E8, 0x26E9}, {0x26EB, 0x26F1}, + {0x26F4, 0x26F4}, {0x26F6, 0x26F9}, {0x26FB, 0x26FC}, + {0x26FE, 0x26FF}, {0x273D, 0x273D}, {0x2776, 0x277F}, + {0x2B56, 0x2B59}, {0x3248, 0x324F}, {0xE000, 0xF8FF}, + {0xFE00, 0xFE0F}, {0xFFFD, 0xFFFD}, {0x1F100, 0x1F10A}, + {0x1F110, 0x1F12D}, {0x1F130, 0x1F169}, {0x1F170, 0x1F18D}, + {0x1F18F, 0x1F190}, {0x1F19B, 0x1F1AC}, {0xE0100, 0xE01EF}, + {0xF0000, 0xFFFFD}, {0x100000, 0x10FFFD}, +} +var notassigned = table{ + {0x27E6, 0x27ED}, {0x2985, 0x2986}, +} + +var neutral = table{ + {0x0000, 0x001F}, {0x007F, 0x00A0}, {0x00A9, 0x00A9}, + {0x00AB, 0x00AB}, {0x00B5, 0x00B5}, {0x00BB, 0x00BB}, + {0x00C0, 0x00C5}, {0x00C7, 0x00CF}, {0x00D1, 0x00D6}, + {0x00D9, 0x00DD}, {0x00E2, 0x00E5}, {0x00E7, 0x00E7}, + {0x00EB, 0x00EB}, {0x00EE, 0x00EF}, {0x00F1, 0x00F1}, + {0x00F4, 0x00F6}, {0x00FB, 0x00FB}, {0x00FD, 0x00FD}, + {0x00FF, 0x0100}, {0x0102, 0x0110}, {0x0112, 0x0112}, + {0x0114, 0x011A}, {0x011C, 0x0125}, {0x0128, 0x012A}, + {0x012C, 0x0130}, {0x0134, 0x0137}, {0x0139, 0x013E}, + {0x0143, 0x0143}, {0x0145, 0x0147}, {0x014C, 0x014C}, + {0x014E, 0x0151}, {0x0154, 0x0165}, {0x0168, 0x016A}, + {0x016C, 0x01CD}, {0x01CF, 0x01CF}, {0x01D1, 0x01D1}, + {0x01D3, 0x01D3}, {0x01D5, 0x01D5}, {0x01D7, 0x01D7}, + {0x01D9, 0x01D9}, {0x01DB, 0x01DB}, {0x01DD, 0x0250}, + {0x0252, 0x0260}, {0x0262, 0x02C3}, {0x02C5, 0x02C6}, + {0x02C8, 0x02C8}, {0x02CC, 0x02CC}, {0x02CE, 0x02CF}, + {0x02D1, 0x02D7}, {0x02DC, 0x02DC}, {0x02DE, 0x02DE}, + {0x02E0, 0x02FF}, {0x0370, 0x0377}, {0x037A, 0x037F}, + {0x0384, 0x038A}, {0x038C, 0x038C}, {0x038E, 0x0390}, + {0x03AA, 0x03B0}, {0x03C2, 0x03C2}, {0x03CA, 0x0400}, + {0x0402, 0x040F}, {0x0450, 0x0450}, {0x0452, 0x052F}, + {0x0531, 0x0556}, {0x0559, 0x058A}, {0x058D, 0x058F}, + {0x0591, 0x05C7}, {0x05D0, 0x05EA}, {0x05EF, 0x05F4}, + {0x0600, 0x061C}, {0x061E, 0x070D}, {0x070F, 0x074A}, + {0x074D, 0x07B1}, {0x07C0, 0x07FA}, {0x07FD, 0x082D}, + {0x0830, 0x083E}, {0x0840, 0x085B}, {0x085E, 0x085E}, + {0x0860, 0x086A}, {0x08A0, 0x08B4}, {0x08B6, 0x08C7}, + {0x08D3, 0x0983}, {0x0985, 0x098C}, {0x098F, 0x0990}, + {0x0993, 0x09A8}, {0x09AA, 0x09B0}, {0x09B2, 0x09B2}, + {0x09B6, 0x09B9}, {0x09BC, 0x09C4}, {0x09C7, 0x09C8}, + {0x09CB, 0x09CE}, {0x09D7, 0x09D7}, {0x09DC, 0x09DD}, + {0x09DF, 0x09E3}, {0x09E6, 0x09FE}, {0x0A01, 0x0A03}, + {0x0A05, 0x0A0A}, {0x0A0F, 0x0A10}, {0x0A13, 0x0A28}, + {0x0A2A, 0x0A30}, {0x0A32, 0x0A33}, {0x0A35, 0x0A36}, + {0x0A38, 0x0A39}, {0x0A3C, 0x0A3C}, {0x0A3E, 0x0A42}, + {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, {0x0A51, 0x0A51}, + {0x0A59, 0x0A5C}, {0x0A5E, 0x0A5E}, {0x0A66, 0x0A76}, + {0x0A81, 0x0A83}, {0x0A85, 0x0A8D}, {0x0A8F, 0x0A91}, + {0x0A93, 0x0AA8}, {0x0AAA, 0x0AB0}, {0x0AB2, 0x0AB3}, + {0x0AB5, 0x0AB9}, {0x0ABC, 0x0AC5}, {0x0AC7, 0x0AC9}, + {0x0ACB, 0x0ACD}, {0x0AD0, 0x0AD0}, {0x0AE0, 0x0AE3}, + {0x0AE6, 0x0AF1}, {0x0AF9, 0x0AFF}, {0x0B01, 0x0B03}, + {0x0B05, 0x0B0C}, {0x0B0F, 0x0B10}, {0x0B13, 0x0B28}, + {0x0B2A, 0x0B30}, {0x0B32, 0x0B33}, {0x0B35, 0x0B39}, + {0x0B3C, 0x0B44}, {0x0B47, 0x0B48}, {0x0B4B, 0x0B4D}, + {0x0B55, 0x0B57}, {0x0B5C, 0x0B5D}, {0x0B5F, 0x0B63}, + {0x0B66, 0x0B77}, {0x0B82, 0x0B83}, {0x0B85, 0x0B8A}, + {0x0B8E, 0x0B90}, {0x0B92, 0x0B95}, {0x0B99, 0x0B9A}, + {0x0B9C, 0x0B9C}, {0x0B9E, 0x0B9F}, {0x0BA3, 0x0BA4}, + {0x0BA8, 0x0BAA}, {0x0BAE, 0x0BB9}, {0x0BBE, 0x0BC2}, + {0x0BC6, 0x0BC8}, {0x0BCA, 0x0BCD}, {0x0BD0, 0x0BD0}, + {0x0BD7, 0x0BD7}, {0x0BE6, 0x0BFA}, {0x0C00, 0x0C0C}, + {0x0C0E, 0x0C10}, {0x0C12, 0x0C28}, {0x0C2A, 0x0C39}, + {0x0C3D, 0x0C44}, {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, + {0x0C55, 0x0C56}, {0x0C58, 0x0C5A}, {0x0C60, 0x0C63}, + {0x0C66, 0x0C6F}, {0x0C77, 0x0C8C}, {0x0C8E, 0x0C90}, + {0x0C92, 0x0CA8}, {0x0CAA, 0x0CB3}, {0x0CB5, 0x0CB9}, + {0x0CBC, 0x0CC4}, {0x0CC6, 0x0CC8}, {0x0CCA, 0x0CCD}, + {0x0CD5, 0x0CD6}, {0x0CDE, 0x0CDE}, {0x0CE0, 0x0CE3}, + {0x0CE6, 0x0CEF}, {0x0CF1, 0x0CF2}, {0x0D00, 0x0D0C}, + {0x0D0E, 0x0D10}, {0x0D12, 0x0D44}, {0x0D46, 0x0D48}, + {0x0D4A, 0x0D4F}, {0x0D54, 0x0D63}, {0x0D66, 0x0D7F}, + {0x0D81, 0x0D83}, {0x0D85, 0x0D96}, {0x0D9A, 0x0DB1}, + {0x0DB3, 0x0DBB}, {0x0DBD, 0x0DBD}, {0x0DC0, 0x0DC6}, + {0x0DCA, 0x0DCA}, {0x0DCF, 0x0DD4}, {0x0DD6, 0x0DD6}, + {0x0DD8, 0x0DDF}, {0x0DE6, 0x0DEF}, {0x0DF2, 0x0DF4}, + {0x0E01, 0x0E3A}, {0x0E3F, 0x0E5B}, {0x0E81, 0x0E82}, + {0x0E84, 0x0E84}, {0x0E86, 0x0E8A}, {0x0E8C, 0x0EA3}, + {0x0EA5, 0x0EA5}, {0x0EA7, 0x0EBD}, {0x0EC0, 0x0EC4}, + {0x0EC6, 0x0EC6}, {0x0EC8, 0x0ECD}, {0x0ED0, 0x0ED9}, + {0x0EDC, 0x0EDF}, {0x0F00, 0x0F47}, {0x0F49, 0x0F6C}, + {0x0F71, 0x0F97}, {0x0F99, 0x0FBC}, {0x0FBE, 0x0FCC}, + {0x0FCE, 0x0FDA}, {0x1000, 0x10C5}, {0x10C7, 0x10C7}, + {0x10CD, 0x10CD}, {0x10D0, 0x10FF}, {0x1160, 0x1248}, + {0x124A, 0x124D}, {0x1250, 0x1256}, {0x1258, 0x1258}, + {0x125A, 0x125D}, {0x1260, 0x1288}, {0x128A, 0x128D}, + {0x1290, 0x12B0}, {0x12B2, 0x12B5}, {0x12B8, 0x12BE}, + {0x12C0, 0x12C0}, {0x12C2, 0x12C5}, {0x12C8, 0x12D6}, + {0x12D8, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x135A}, + {0x135D, 0x137C}, {0x1380, 0x1399}, {0x13A0, 0x13F5}, + {0x13F8, 0x13FD}, {0x1400, 0x169C}, {0x16A0, 0x16F8}, + {0x1700, 0x170C}, {0x170E, 0x1714}, {0x1720, 0x1736}, + {0x1740, 0x1753}, {0x1760, 0x176C}, {0x176E, 0x1770}, + {0x1772, 0x1773}, {0x1780, 0x17DD}, {0x17E0, 0x17E9}, + {0x17F0, 0x17F9}, {0x1800, 0x180E}, {0x1810, 0x1819}, + {0x1820, 0x1878}, {0x1880, 0x18AA}, {0x18B0, 0x18F5}, + {0x1900, 0x191E}, {0x1920, 0x192B}, {0x1930, 0x193B}, + {0x1940, 0x1940}, {0x1944, 0x196D}, {0x1970, 0x1974}, + {0x1980, 0x19AB}, {0x19B0, 0x19C9}, {0x19D0, 0x19DA}, + {0x19DE, 0x1A1B}, {0x1A1E, 0x1A5E}, {0x1A60, 0x1A7C}, + {0x1A7F, 0x1A89}, {0x1A90, 0x1A99}, {0x1AA0, 0x1AAD}, + {0x1AB0, 0x1AC0}, {0x1B00, 0x1B4B}, {0x1B50, 0x1B7C}, + {0x1B80, 0x1BF3}, {0x1BFC, 0x1C37}, {0x1C3B, 0x1C49}, + {0x1C4D, 0x1C88}, {0x1C90, 0x1CBA}, {0x1CBD, 0x1CC7}, + {0x1CD0, 0x1CFA}, {0x1D00, 0x1DF9}, {0x1DFB, 0x1F15}, + {0x1F18, 0x1F1D}, {0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, + {0x1F50, 0x1F57}, {0x1F59, 0x1F59}, {0x1F5B, 0x1F5B}, + {0x1F5D, 0x1F5D}, {0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4}, + {0x1FB6, 0x1FC4}, {0x1FC6, 0x1FD3}, {0x1FD6, 0x1FDB}, + {0x1FDD, 0x1FEF}, {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFE}, + {0x2000, 0x200F}, {0x2011, 0x2012}, {0x2017, 0x2017}, + {0x201A, 0x201B}, {0x201E, 0x201F}, {0x2023, 0x2023}, + {0x2028, 0x202F}, {0x2031, 0x2031}, {0x2034, 0x2034}, + {0x2036, 0x203A}, {0x203C, 0x203D}, {0x203F, 0x2064}, + {0x2066, 0x2071}, {0x2075, 0x207E}, {0x2080, 0x2080}, + {0x2085, 0x208E}, {0x2090, 0x209C}, {0x20A0, 0x20A8}, + {0x20AA, 0x20AB}, {0x20AD, 0x20BF}, {0x20D0, 0x20F0}, + {0x2100, 0x2102}, {0x2104, 0x2104}, {0x2106, 0x2108}, + {0x210A, 0x2112}, {0x2114, 0x2115}, {0x2117, 0x2120}, + {0x2123, 0x2125}, {0x2127, 0x212A}, {0x212C, 0x2152}, + {0x2155, 0x215A}, {0x215F, 0x215F}, {0x216C, 0x216F}, + {0x217A, 0x2188}, {0x218A, 0x218B}, {0x219A, 0x21B7}, + {0x21BA, 0x21D1}, {0x21D3, 0x21D3}, {0x21D5, 0x21E6}, + {0x21E8, 0x21FF}, {0x2201, 0x2201}, {0x2204, 0x2206}, + {0x2209, 0x220A}, {0x220C, 0x220E}, {0x2210, 0x2210}, + {0x2212, 0x2214}, {0x2216, 0x2219}, {0x221B, 0x221C}, + {0x2221, 0x2222}, {0x2224, 0x2224}, {0x2226, 0x2226}, + {0x222D, 0x222D}, {0x222F, 0x2233}, {0x2238, 0x223B}, + {0x223E, 0x2247}, {0x2249, 0x224B}, {0x224D, 0x2251}, + {0x2253, 0x225F}, {0x2262, 0x2263}, {0x2268, 0x2269}, + {0x226C, 0x226D}, {0x2270, 0x2281}, {0x2284, 0x2285}, + {0x2288, 0x2294}, {0x2296, 0x2298}, {0x229A, 0x22A4}, + {0x22A6, 0x22BE}, {0x22C0, 0x2311}, {0x2313, 0x2319}, + {0x231C, 0x2328}, {0x232B, 0x23E8}, {0x23ED, 0x23EF}, + {0x23F1, 0x23F2}, {0x23F4, 0x2426}, {0x2440, 0x244A}, + {0x24EA, 0x24EA}, {0x254C, 0x254F}, {0x2574, 0x257F}, + {0x2590, 0x2591}, {0x2596, 0x259F}, {0x25A2, 0x25A2}, + {0x25AA, 0x25B1}, {0x25B4, 0x25B5}, {0x25B8, 0x25BB}, + {0x25BE, 0x25BF}, {0x25C2, 0x25C5}, {0x25C9, 0x25CA}, + {0x25CC, 0x25CD}, {0x25D2, 0x25E1}, {0x25E6, 0x25EE}, + {0x25F0, 0x25FC}, {0x25FF, 0x2604}, {0x2607, 0x2608}, + {0x260A, 0x260D}, {0x2610, 0x2613}, {0x2616, 0x261B}, + {0x261D, 0x261D}, {0x261F, 0x263F}, {0x2641, 0x2641}, + {0x2643, 0x2647}, {0x2654, 0x265F}, {0x2662, 0x2662}, + {0x2666, 0x2666}, {0x266B, 0x266B}, {0x266E, 0x266E}, + {0x2670, 0x267E}, {0x2680, 0x2692}, {0x2694, 0x269D}, + {0x26A0, 0x26A0}, {0x26A2, 0x26A9}, {0x26AC, 0x26BC}, + {0x26C0, 0x26C3}, {0x26E2, 0x26E2}, {0x26E4, 0x26E7}, + {0x2700, 0x2704}, {0x2706, 0x2709}, {0x270C, 0x2727}, + {0x2729, 0x273C}, {0x273E, 0x274B}, {0x274D, 0x274D}, + {0x274F, 0x2752}, {0x2756, 0x2756}, {0x2758, 0x2775}, + {0x2780, 0x2794}, {0x2798, 0x27AF}, {0x27B1, 0x27BE}, + {0x27C0, 0x27E5}, {0x27EE, 0x2984}, {0x2987, 0x2B1A}, + {0x2B1D, 0x2B4F}, {0x2B51, 0x2B54}, {0x2B5A, 0x2B73}, + {0x2B76, 0x2B95}, {0x2B97, 0x2C2E}, {0x2C30, 0x2C5E}, + {0x2C60, 0x2CF3}, {0x2CF9, 0x2D25}, {0x2D27, 0x2D27}, + {0x2D2D, 0x2D2D}, {0x2D30, 0x2D67}, {0x2D6F, 0x2D70}, + {0x2D7F, 0x2D96}, {0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, + {0x2DB0, 0x2DB6}, {0x2DB8, 0x2DBE}, {0x2DC0, 0x2DC6}, + {0x2DC8, 0x2DCE}, {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, + {0x2DE0, 0x2E52}, {0x303F, 0x303F}, {0x4DC0, 0x4DFF}, + {0xA4D0, 0xA62B}, {0xA640, 0xA6F7}, {0xA700, 0xA7BF}, + {0xA7C2, 0xA7CA}, {0xA7F5, 0xA82C}, {0xA830, 0xA839}, + {0xA840, 0xA877}, {0xA880, 0xA8C5}, {0xA8CE, 0xA8D9}, + {0xA8E0, 0xA953}, {0xA95F, 0xA95F}, {0xA980, 0xA9CD}, + {0xA9CF, 0xA9D9}, {0xA9DE, 0xA9FE}, {0xAA00, 0xAA36}, + {0xAA40, 0xAA4D}, {0xAA50, 0xAA59}, {0xAA5C, 0xAAC2}, + {0xAADB, 0xAAF6}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E}, + {0xAB11, 0xAB16}, {0xAB20, 0xAB26}, {0xAB28, 0xAB2E}, + {0xAB30, 0xAB6B}, {0xAB70, 0xABED}, {0xABF0, 0xABF9}, + {0xD7B0, 0xD7C6}, {0xD7CB, 0xD7FB}, {0xD800, 0xDFFF}, + {0xFB00, 0xFB06}, {0xFB13, 0xFB17}, {0xFB1D, 0xFB36}, + {0xFB38, 0xFB3C}, {0xFB3E, 0xFB3E}, {0xFB40, 0xFB41}, + {0xFB43, 0xFB44}, {0xFB46, 0xFBC1}, {0xFBD3, 0xFD3F}, + {0xFD50, 0xFD8F}, {0xFD92, 0xFDC7}, {0xFDF0, 0xFDFD}, + {0xFE20, 0xFE2F}, {0xFE70, 0xFE74}, {0xFE76, 0xFEFC}, + {0xFEFF, 0xFEFF}, {0xFFF9, 0xFFFC}, {0x10000, 0x1000B}, + {0x1000D, 0x10026}, {0x10028, 0x1003A}, {0x1003C, 0x1003D}, + {0x1003F, 0x1004D}, {0x10050, 0x1005D}, {0x10080, 0x100FA}, + {0x10100, 0x10102}, {0x10107, 0x10133}, {0x10137, 0x1018E}, + {0x10190, 0x1019C}, {0x101A0, 0x101A0}, {0x101D0, 0x101FD}, + {0x10280, 0x1029C}, {0x102A0, 0x102D0}, {0x102E0, 0x102FB}, + {0x10300, 0x10323}, {0x1032D, 0x1034A}, {0x10350, 0x1037A}, + {0x10380, 0x1039D}, {0x1039F, 0x103C3}, {0x103C8, 0x103D5}, + {0x10400, 0x1049D}, {0x104A0, 0x104A9}, {0x104B0, 0x104D3}, + {0x104D8, 0x104FB}, {0x10500, 0x10527}, {0x10530, 0x10563}, + {0x1056F, 0x1056F}, {0x10600, 0x10736}, {0x10740, 0x10755}, + {0x10760, 0x10767}, {0x10800, 0x10805}, {0x10808, 0x10808}, + {0x1080A, 0x10835}, {0x10837, 0x10838}, {0x1083C, 0x1083C}, + {0x1083F, 0x10855}, {0x10857, 0x1089E}, {0x108A7, 0x108AF}, + {0x108E0, 0x108F2}, {0x108F4, 0x108F5}, {0x108FB, 0x1091B}, + {0x1091F, 0x10939}, {0x1093F, 0x1093F}, {0x10980, 0x109B7}, + {0x109BC, 0x109CF}, {0x109D2, 0x10A03}, {0x10A05, 0x10A06}, + {0x10A0C, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A35}, + {0x10A38, 0x10A3A}, {0x10A3F, 0x10A48}, {0x10A50, 0x10A58}, + {0x10A60, 0x10A9F}, {0x10AC0, 0x10AE6}, {0x10AEB, 0x10AF6}, + {0x10B00, 0x10B35}, {0x10B39, 0x10B55}, {0x10B58, 0x10B72}, + {0x10B78, 0x10B91}, {0x10B99, 0x10B9C}, {0x10BA9, 0x10BAF}, + {0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, + {0x10CFA, 0x10D27}, {0x10D30, 0x10D39}, {0x10E60, 0x10E7E}, + {0x10E80, 0x10EA9}, {0x10EAB, 0x10EAD}, {0x10EB0, 0x10EB1}, + {0x10F00, 0x10F27}, {0x10F30, 0x10F59}, {0x10FB0, 0x10FCB}, + {0x10FE0, 0x10FF6}, {0x11000, 0x1104D}, {0x11052, 0x1106F}, + {0x1107F, 0x110C1}, {0x110CD, 0x110CD}, {0x110D0, 0x110E8}, + {0x110F0, 0x110F9}, {0x11100, 0x11134}, {0x11136, 0x11147}, + {0x11150, 0x11176}, {0x11180, 0x111DF}, {0x111E1, 0x111F4}, + {0x11200, 0x11211}, {0x11213, 0x1123E}, {0x11280, 0x11286}, + {0x11288, 0x11288}, {0x1128A, 0x1128D}, {0x1128F, 0x1129D}, + {0x1129F, 0x112A9}, {0x112B0, 0x112EA}, {0x112F0, 0x112F9}, + {0x11300, 0x11303}, {0x11305, 0x1130C}, {0x1130F, 0x11310}, + {0x11313, 0x11328}, {0x1132A, 0x11330}, {0x11332, 0x11333}, + {0x11335, 0x11339}, {0x1133B, 0x11344}, {0x11347, 0x11348}, + {0x1134B, 0x1134D}, {0x11350, 0x11350}, {0x11357, 0x11357}, + {0x1135D, 0x11363}, {0x11366, 0x1136C}, {0x11370, 0x11374}, + {0x11400, 0x1145B}, {0x1145D, 0x11461}, {0x11480, 0x114C7}, + {0x114D0, 0x114D9}, {0x11580, 0x115B5}, {0x115B8, 0x115DD}, + {0x11600, 0x11644}, {0x11650, 0x11659}, {0x11660, 0x1166C}, + {0x11680, 0x116B8}, {0x116C0, 0x116C9}, {0x11700, 0x1171A}, + {0x1171D, 0x1172B}, {0x11730, 0x1173F}, {0x11800, 0x1183B}, + {0x118A0, 0x118F2}, {0x118FF, 0x11906}, {0x11909, 0x11909}, + {0x1190C, 0x11913}, {0x11915, 0x11916}, {0x11918, 0x11935}, + {0x11937, 0x11938}, {0x1193B, 0x11946}, {0x11950, 0x11959}, + {0x119A0, 0x119A7}, {0x119AA, 0x119D7}, {0x119DA, 0x119E4}, + {0x11A00, 0x11A47}, {0x11A50, 0x11AA2}, {0x11AC0, 0x11AF8}, + {0x11C00, 0x11C08}, {0x11C0A, 0x11C36}, {0x11C38, 0x11C45}, + {0x11C50, 0x11C6C}, {0x11C70, 0x11C8F}, {0x11C92, 0x11CA7}, + {0x11CA9, 0x11CB6}, {0x11D00, 0x11D06}, {0x11D08, 0x11D09}, + {0x11D0B, 0x11D36}, {0x11D3A, 0x11D3A}, {0x11D3C, 0x11D3D}, + {0x11D3F, 0x11D47}, {0x11D50, 0x11D59}, {0x11D60, 0x11D65}, + {0x11D67, 0x11D68}, {0x11D6A, 0x11D8E}, {0x11D90, 0x11D91}, + {0x11D93, 0x11D98}, {0x11DA0, 0x11DA9}, {0x11EE0, 0x11EF8}, + {0x11FB0, 0x11FB0}, {0x11FC0, 0x11FF1}, {0x11FFF, 0x12399}, + {0x12400, 0x1246E}, {0x12470, 0x12474}, {0x12480, 0x12543}, + {0x13000, 0x1342E}, {0x13430, 0x13438}, {0x14400, 0x14646}, + {0x16800, 0x16A38}, {0x16A40, 0x16A5E}, {0x16A60, 0x16A69}, + {0x16A6E, 0x16A6F}, {0x16AD0, 0x16AED}, {0x16AF0, 0x16AF5}, + {0x16B00, 0x16B45}, {0x16B50, 0x16B59}, {0x16B5B, 0x16B61}, + {0x16B63, 0x16B77}, {0x16B7D, 0x16B8F}, {0x16E40, 0x16E9A}, + {0x16F00, 0x16F4A}, {0x16F4F, 0x16F87}, {0x16F8F, 0x16F9F}, + {0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C}, {0x1BC80, 0x1BC88}, + {0x1BC90, 0x1BC99}, {0x1BC9C, 0x1BCA3}, {0x1D000, 0x1D0F5}, + {0x1D100, 0x1D126}, {0x1D129, 0x1D1E8}, {0x1D200, 0x1D245}, + {0x1D2E0, 0x1D2F3}, {0x1D300, 0x1D356}, {0x1D360, 0x1D378}, + {0x1D400, 0x1D454}, {0x1D456, 0x1D49C}, {0x1D49E, 0x1D49F}, + {0x1D4A2, 0x1D4A2}, {0x1D4A5, 0x1D4A6}, {0x1D4A9, 0x1D4AC}, + {0x1D4AE, 0x1D4B9}, {0x1D4BB, 0x1D4BB}, {0x1D4BD, 0x1D4C3}, + {0x1D4C5, 0x1D505}, {0x1D507, 0x1D50A}, {0x1D50D, 0x1D514}, + {0x1D516, 0x1D51C}, {0x1D51E, 0x1D539}, {0x1D53B, 0x1D53E}, + {0x1D540, 0x1D544}, {0x1D546, 0x1D546}, {0x1D54A, 0x1D550}, + {0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D7CB}, {0x1D7CE, 0x1DA8B}, + {0x1DA9B, 0x1DA9F}, {0x1DAA1, 0x1DAAF}, {0x1E000, 0x1E006}, + {0x1E008, 0x1E018}, {0x1E01B, 0x1E021}, {0x1E023, 0x1E024}, + {0x1E026, 0x1E02A}, {0x1E100, 0x1E12C}, {0x1E130, 0x1E13D}, + {0x1E140, 0x1E149}, {0x1E14E, 0x1E14F}, {0x1E2C0, 0x1E2F9}, + {0x1E2FF, 0x1E2FF}, {0x1E800, 0x1E8C4}, {0x1E8C7, 0x1E8D6}, + {0x1E900, 0x1E94B}, {0x1E950, 0x1E959}, {0x1E95E, 0x1E95F}, + {0x1EC71, 0x1ECB4}, {0x1ED01, 0x1ED3D}, {0x1EE00, 0x1EE03}, + {0x1EE05, 0x1EE1F}, {0x1EE21, 0x1EE22}, {0x1EE24, 0x1EE24}, + {0x1EE27, 0x1EE27}, {0x1EE29, 0x1EE32}, {0x1EE34, 0x1EE37}, + {0x1EE39, 0x1EE39}, {0x1EE3B, 0x1EE3B}, {0x1EE42, 0x1EE42}, + {0x1EE47, 0x1EE47}, {0x1EE49, 0x1EE49}, {0x1EE4B, 0x1EE4B}, + {0x1EE4D, 0x1EE4F}, {0x1EE51, 0x1EE52}, {0x1EE54, 0x1EE54}, + {0x1EE57, 0x1EE57}, {0x1EE59, 0x1EE59}, {0x1EE5B, 0x1EE5B}, + {0x1EE5D, 0x1EE5D}, {0x1EE5F, 0x1EE5F}, {0x1EE61, 0x1EE62}, + {0x1EE64, 0x1EE64}, {0x1EE67, 0x1EE6A}, {0x1EE6C, 0x1EE72}, + {0x1EE74, 0x1EE77}, {0x1EE79, 0x1EE7C}, {0x1EE7E, 0x1EE7E}, + {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B}, {0x1EEA1, 0x1EEA3}, + {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, {0x1EEF0, 0x1EEF1}, + {0x1F000, 0x1F003}, {0x1F005, 0x1F02B}, {0x1F030, 0x1F093}, + {0x1F0A0, 0x1F0AE}, {0x1F0B1, 0x1F0BF}, {0x1F0C1, 0x1F0CE}, + {0x1F0D1, 0x1F0F5}, {0x1F10B, 0x1F10F}, {0x1F12E, 0x1F12F}, + {0x1F16A, 0x1F16F}, {0x1F1AD, 0x1F1AD}, {0x1F1E6, 0x1F1FF}, + {0x1F321, 0x1F32C}, {0x1F336, 0x1F336}, {0x1F37D, 0x1F37D}, + {0x1F394, 0x1F39F}, {0x1F3CB, 0x1F3CE}, {0x1F3D4, 0x1F3DF}, + {0x1F3F1, 0x1F3F3}, {0x1F3F5, 0x1F3F7}, {0x1F43F, 0x1F43F}, + {0x1F441, 0x1F441}, {0x1F4FD, 0x1F4FE}, {0x1F53E, 0x1F54A}, + {0x1F54F, 0x1F54F}, {0x1F568, 0x1F579}, {0x1F57B, 0x1F594}, + {0x1F597, 0x1F5A3}, {0x1F5A5, 0x1F5FA}, {0x1F650, 0x1F67F}, + {0x1F6C6, 0x1F6CB}, {0x1F6CD, 0x1F6CF}, {0x1F6D3, 0x1F6D4}, + {0x1F6E0, 0x1F6EA}, {0x1F6F0, 0x1F6F3}, {0x1F700, 0x1F773}, + {0x1F780, 0x1F7D8}, {0x1F800, 0x1F80B}, {0x1F810, 0x1F847}, + {0x1F850, 0x1F859}, {0x1F860, 0x1F887}, {0x1F890, 0x1F8AD}, + {0x1F8B0, 0x1F8B1}, {0x1F900, 0x1F90B}, {0x1F93B, 0x1F93B}, + {0x1F946, 0x1F946}, {0x1FA00, 0x1FA53}, {0x1FA60, 0x1FA6D}, + {0x1FB00, 0x1FB92}, {0x1FB94, 0x1FBCA}, {0x1FBF0, 0x1FBF9}, + {0xE0001, 0xE0001}, {0xE0020, 0xE007F}, +} + +var emoji = table{ + {0x203C, 0x203C}, {0x2049, 0x2049}, {0x2122, 0x2122}, + {0x2139, 0x2139}, {0x2194, 0x2199}, {0x21A9, 0x21AA}, + {0x231A, 0x231B}, {0x2328, 0x2328}, {0x2388, 0x2388}, + {0x23CF, 0x23CF}, {0x23E9, 0x23F3}, {0x23F8, 0x23FA}, + {0x24C2, 0x24C2}, {0x25AA, 0x25AB}, {0x25B6, 0x25B6}, + {0x25C0, 0x25C0}, {0x25FB, 0x25FE}, {0x2600, 0x2605}, + {0x2607, 0x2612}, {0x2614, 0x2685}, {0x2690, 0x2705}, + {0x2708, 0x2712}, {0x2714, 0x2714}, {0x2716, 0x2716}, + {0x271D, 0x271D}, {0x2721, 0x2721}, {0x2728, 0x2728}, + {0x2733, 0x2734}, {0x2744, 0x2744}, {0x2747, 0x2747}, + {0x274C, 0x274C}, {0x274E, 0x274E}, {0x2753, 0x2755}, + {0x2757, 0x2757}, {0x2763, 0x2767}, {0x2795, 0x2797}, + {0x27A1, 0x27A1}, {0x27B0, 0x27B0}, {0x27BF, 0x27BF}, + {0x2934, 0x2935}, {0x2B05, 0x2B07}, {0x2B1B, 0x2B1C}, + {0x2B50, 0x2B50}, {0x2B55, 0x2B55}, {0x3030, 0x3030}, + {0x303D, 0x303D}, {0x3297, 0x3297}, {0x3299, 0x3299}, + {0x1F000, 0x1F0FF}, {0x1F10D, 0x1F10F}, {0x1F12F, 0x1F12F}, + {0x1F16C, 0x1F171}, {0x1F17E, 0x1F17F}, {0x1F18E, 0x1F18E}, + {0x1F191, 0x1F19A}, {0x1F1AD, 0x1F1E5}, {0x1F201, 0x1F20F}, + {0x1F21A, 0x1F21A}, {0x1F22F, 0x1F22F}, {0x1F232, 0x1F23A}, + {0x1F23C, 0x1F23F}, {0x1F249, 0x1F3FA}, {0x1F400, 0x1F53D}, + {0x1F546, 0x1F64F}, {0x1F680, 0x1F6FF}, {0x1F774, 0x1F77F}, + {0x1F7D5, 0x1F7FF}, {0x1F80C, 0x1F80F}, {0x1F848, 0x1F84F}, + {0x1F85A, 0x1F85F}, {0x1F888, 0x1F88F}, {0x1F8AE, 0x1F8FF}, + {0x1F90C, 0x1F93A}, {0x1F93C, 0x1F945}, {0x1F947, 0x1FAFF}, + {0x1FC00, 0x1FFFD}, +} diff --git a/vendor/github.com/rivo/uniseg/LICENSE.txt b/vendor/github.com/rivo/uniseg/LICENSE.txt new file mode 100644 index 0000000000..5040f1ef80 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Oliver Kuederle + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/rivo/uniseg/README.md b/vendor/github.com/rivo/uniseg/README.md new file mode 100644 index 0000000000..f8da293e15 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/README.md @@ -0,0 +1,62 @@ +# Unicode Text Segmentation for Go + +[![Godoc Reference](https://img.shields.io/badge/godoc-reference-blue.svg)](https://godoc.org/github.com/rivo/uniseg) +[![Go Report](https://img.shields.io/badge/go%20report-A%2B-brightgreen.svg)](https://goreportcard.com/report/github.com/rivo/uniseg) + +This Go package implements Unicode Text Segmentation according to [Unicode Standard Annex #29](http://unicode.org/reports/tr29/) (Unicode version 12.0.0). + +At this point, only the determination of grapheme cluster boundaries is implemented. + +## Background + +In Go, [strings are read-only slices of bytes](https://blog.golang.org/strings). They can be turned into Unicode code points using the `for` loop or by casting: `[]rune(str)`. However, multiple code points may be combined into one user-perceived character or what the Unicode specification calls "grapheme cluster". Here are some examples: + +|String|Bytes (UTF-8)|Code points (runes)|Grapheme clusters| +|-|-|-|-| +|Käse|6 bytes: `4b 61 cc 88 73 65`|5 code points: `4b 61 308 73 65`|4 clusters: `[4b],[61 308],[73],[65]`| +|🏳️‍🌈|14 bytes: `f0 9f 8f b3 ef b8 8f e2 80 8d f0 9f 8c 88`|4 code points: `1f3f3 fe0f 200d 1f308`|1 cluster: `[1f3f3 fe0f 200d 1f308]`| +|🇩🇪|8 bytes: `f0 9f 87 a9 f0 9f 87 aa`|2 code points: `1f1e9 1f1ea`|1 cluster: `[1f1e9 1f1ea]`| + +This package provides a tool to iterate over these grapheme clusters. This may be used to determine the number of user-perceived characters, to split strings in their intended places, or to extract individual characters which form a unit. + +## Installation + +```bash +go get github.com/rivo/uniseg +``` + +## Basic Example + +```go +package uniseg + +import ( + "fmt" + + "github.com/rivo/uniseg" +) + +func main() { + gr := uniseg.NewGraphemes("👍🏼!") + for gr.Next() { + fmt.Printf("%x ", gr.Runes()) + } + // Output: [1f44d 1f3fc] [21] +} +``` + +## Documentation + +Refer to https://godoc.org/github.com/rivo/uniseg for the package's documentation. + +## Dependencies + +This package does not depend on any packages outside the standard library. + +## Your Feedback + +Add your issue here on GitHub. Feel free to get in touch if you have any questions. + +## Version + +Version tags will be introduced once Golang modules are official. Consider this version 0.1. diff --git a/vendor/github.com/rivo/uniseg/doc.go b/vendor/github.com/rivo/uniseg/doc.go new file mode 100644 index 0000000000..60c737d7b3 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/doc.go @@ -0,0 +1,8 @@ +/* +Package uniseg implements Unicode Text Segmentation according to Unicode +Standard Annex #29 (http://unicode.org/reports/tr29/). + +At this point, only the determination of grapheme cluster boundaries is +implemented. +*/ +package uniseg diff --git a/vendor/github.com/rivo/uniseg/grapheme.go b/vendor/github.com/rivo/uniseg/grapheme.go new file mode 100644 index 0000000000..207157f5e4 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/grapheme.go @@ -0,0 +1,268 @@ +package uniseg + +import "unicode/utf8" + +// The states of the grapheme cluster parser. +const ( + grAny = iota + grCR + grControlLF + grL + grLVV + grLVTT + grPrepend + grExtendedPictographic + grExtendedPictographicZWJ + grRIOdd + grRIEven +) + +// The grapheme cluster parser's breaking instructions. +const ( + grNoBoundary = iota + grBoundary +) + +// The grapheme cluster parser's state transitions. Maps (state, property) to +// (new state, breaking instruction, rule number). The breaking instruction +// always refers to the boundary between the last and next code point. +// +// This map is queried as follows: +// +// 1. Find specific state + specific property. Stop if found. +// 2. Find specific state + any property. +// 3. Find any state + specific property. +// 4. If only (2) or (3) (but not both) was found, stop. +// 5. If both (2) and (3) were found, use state and breaking instruction from +// the transition with the lower rule number, prefer (3) if rule numbers +// are equal. Stop. +// 6. Assume grAny and grBoundary. +var grTransitions = map[[2]int][3]int{ + // GB5 + {grAny, prCR}: {grCR, grBoundary, 50}, + {grAny, prLF}: {grControlLF, grBoundary, 50}, + {grAny, prControl}: {grControlLF, grBoundary, 50}, + + // GB4 + {grCR, prAny}: {grAny, grBoundary, 40}, + {grControlLF, prAny}: {grAny, grBoundary, 40}, + + // GB3. + {grCR, prLF}: {grAny, grNoBoundary, 30}, + + // GB6. + {grAny, prL}: {grL, grBoundary, 9990}, + {grL, prL}: {grL, grNoBoundary, 60}, + {grL, prV}: {grLVV, grNoBoundary, 60}, + {grL, prLV}: {grLVV, grNoBoundary, 60}, + {grL, prLVT}: {grLVTT, grNoBoundary, 60}, + + // GB7. + {grAny, prLV}: {grLVV, grBoundary, 9990}, + {grAny, prV}: {grLVV, grBoundary, 9990}, + {grLVV, prV}: {grLVV, grNoBoundary, 70}, + {grLVV, prT}: {grLVTT, grNoBoundary, 70}, + + // GB8. + {grAny, prLVT}: {grLVTT, grBoundary, 9990}, + {grAny, prT}: {grLVTT, grBoundary, 9990}, + {grLVTT, prT}: {grLVTT, grNoBoundary, 80}, + + // GB9. + {grAny, prExtend}: {grAny, grNoBoundary, 90}, + {grAny, prZWJ}: {grAny, grNoBoundary, 90}, + + // GB9a. + {grAny, prSpacingMark}: {grAny, grNoBoundary, 91}, + + // GB9b. + {grAny, prPreprend}: {grPrepend, grBoundary, 9990}, + {grPrepend, prAny}: {grAny, grNoBoundary, 92}, + + // GB11. + {grAny, prExtendedPictographic}: {grExtendedPictographic, grBoundary, 9990}, + {grExtendedPictographic, prExtend}: {grExtendedPictographic, grNoBoundary, 110}, + {grExtendedPictographic, prZWJ}: {grExtendedPictographicZWJ, grNoBoundary, 110}, + {grExtendedPictographicZWJ, prExtendedPictographic}: {grExtendedPictographic, grNoBoundary, 110}, + + // GB12 / GB13. + {grAny, prRegionalIndicator}: {grRIOdd, grBoundary, 9990}, + {grRIOdd, prRegionalIndicator}: {grRIEven, grNoBoundary, 120}, + {grRIEven, prRegionalIndicator}: {grRIOdd, grBoundary, 120}, +} + +// Graphemes implements an iterator over Unicode extended grapheme clusters, +// specified in the Unicode Standard Annex #29. Grapheme clusters correspond to +// "user-perceived characters". These characters often consist of multiple +// code points (e.g. the "woman kissing woman" emoji consists of 8 code points: +// woman + ZWJ + heavy black heart (2 code points) + ZWJ + kiss mark + ZWJ + +// woman) and the rules described in Annex #29 must be applied to group those +// code points into clusters perceived by the user as one character. +type Graphemes struct { + // The code points over which this class iterates. + codePoints []rune + + // The (byte-based) indices of the code points into the original string plus + // len(original string). Thus, len(indices) = len(codePoints) + 1. + indices []int + + // The current grapheme cluster to be returned. These are indices into + // codePoints/indices. If start == end, we either haven't started iterating + // yet (0) or the iteration has already completed (1). + start, end int + + // The index of the next code point to be parsed. + pos int + + // The current state of the code point parser. + state int +} + +// NewGraphemes returns a new grapheme cluster iterator. +func NewGraphemes(s string) *Graphemes { + l := utf8.RuneCountInString(s) + codePoints := make([]rune, l) + indices := make([]int, l+1) + i := 0 + for pos, r := range s { + codePoints[i] = r + indices[i] = pos + i++ + } + indices[l] = len(s) + g := &Graphemes{ + codePoints: codePoints, + indices: indices, + } + g.Next() // Parse ahead. + return g +} + +// Next advances the iterator by one grapheme cluster and returns false if no +// clusters are left. This function must be called before the first cluster is +// accessed. +func (g *Graphemes) Next() bool { + g.start = g.end + + // The state transition gives us a boundary instruction BEFORE the next code + // point so we always need to stay ahead by one code point. + + // Parse the next code point. + for g.pos <= len(g.codePoints) { + // GB2. + if g.pos == len(g.codePoints) { + g.end = g.pos + g.pos++ + break + } + + // Determine the property of the next character. + nextProperty := property(g.codePoints[g.pos]) + g.pos++ + + // Find the applicable transition. + var boundary bool + transition, ok := grTransitions[[2]int{g.state, nextProperty}] + if ok { + // We have a specific transition. We'll use it. + g.state = transition[0] + boundary = transition[1] == grBoundary + } else { + // No specific transition found. Try the less specific ones. + transAnyProp, okAnyProp := grTransitions[[2]int{g.state, prAny}] + transAnyState, okAnyState := grTransitions[[2]int{grAny, nextProperty}] + if okAnyProp && okAnyState { + // Both apply. We'll use a mix (see comments for grTransitions). + g.state = transAnyState[0] + boundary = transAnyState[1] == grBoundary + if transAnyProp[2] < transAnyState[2] { + g.state = transAnyProp[0] + boundary = transAnyProp[1] == grBoundary + } + } else if okAnyProp { + // We only have a specific state. + g.state = transAnyProp[0] + boundary = transAnyProp[1] == grBoundary + // This branch will probably never be reached because okAnyState will + // always be true given the current transition map. But we keep it here + // for future modifications to the transition map where this may not be + // true anymore. + } else if okAnyState { + // We only have a specific property. + g.state = transAnyState[0] + boundary = transAnyState[1] == grBoundary + } else { + // No known transition. GB999: Any x Any. + g.state = grAny + boundary = true + } + } + + // If we found a cluster boundary, let's stop here. The current cluster will + // be the one that just ended. + if g.pos-1 == 0 /* GB1 */ || boundary { + g.end = g.pos - 1 + break + } + } + + return g.start != g.end +} + +// Runes returns a slice of runes (code points) which corresponds to the current +// grapheme cluster. If the iterator is already past the end or Next() has not +// yet been called, nil is returned. +func (g *Graphemes) Runes() []rune { + if g.start == g.end { + return nil + } + return g.codePoints[g.start:g.end] +} + +// Str returns a substring of the original string which corresponds to the +// current grapheme cluster. If the iterator is already past the end or Next() +// has not yet been called, an empty string is returned. +func (g *Graphemes) Str() string { + if g.start == g.end { + return "" + } + return string(g.codePoints[g.start:g.end]) +} + +// Bytes returns a byte slice which corresponds to the current grapheme cluster. +// If the iterator is already past the end or Next() has not yet been called, +// nil is returned. +func (g *Graphemes) Bytes() []byte { + if g.start == g.end { + return nil + } + return []byte(string(g.codePoints[g.start:g.end])) +} + +// Positions returns the interval of the current grapheme cluster as byte +// positions into the original string. The first returned value "from" indexes +// the first byte and the second returned value "to" indexes the first byte that +// is not included anymore, i.e. str[from:to] is the current grapheme cluster of +// the original string "str". If Next() has not yet been called, both values are +// 0. If the iterator is already past the end, both values are 1. +func (g *Graphemes) Positions() (int, int) { + return g.indices[g.start], g.indices[g.end] +} + +// Reset puts the iterator into its initial state such that the next call to +// Next() sets it to the first grapheme cluster again. +func (g *Graphemes) Reset() { + g.start, g.end, g.pos, g.state = 0, 0, 0, grAny + g.Next() // Parse ahead again. +} + +// GraphemeClusterCount returns the number of user-perceived characters +// (grapheme clusters) for the given string. To calculate this number, it +// iterates through the string using the Graphemes iterator. +func GraphemeClusterCount(s string) (n int) { + g := NewGraphemes(s) + for g.Next() { + n++ + } + return +} diff --git a/vendor/github.com/rivo/uniseg/properties.go b/vendor/github.com/rivo/uniseg/properties.go new file mode 100644 index 0000000000..a75ab58839 --- /dev/null +++ b/vendor/github.com/rivo/uniseg/properties.go @@ -0,0 +1,1658 @@ +package uniseg + +// The unicode properties. Only the ones needed in the context of this package +// are included. +const ( + prAny = iota + prPreprend + prCR + prLF + prControl + prExtend + prRegionalIndicator + prSpacingMark + prL + prV + prT + prLV + prLVT + prZWJ + prExtendedPictographic +) + +// Maps code point ranges to their properties. In the context of this package, +// any code point that is not contained may map to "prAny". The code point +// ranges in this slice are numerically sorted. +// +// These ranges were taken from +// http://www.unicode.org/Public/UCD/latest/ucd/auxiliary/GraphemeBreakProperty.txt +// as well as +// https://unicode.org/Public/emoji/latest/emoji-data.txt +// ("Extended_Pictographic" only) on March 11, 2019. See +// https://www.unicode.org/license.html for the Unicode license agreement. +var codePoints = [][3]int{ + {0x0000, 0x0009, prControl}, // Cc [10] .. + {0x000A, 0x000A, prLF}, // Cc + {0x000B, 0x000C, prControl}, // Cc [2] .. + {0x000D, 0x000D, prCR}, // Cc + {0x000E, 0x001F, prControl}, // Cc [18] .. + {0x007F, 0x009F, prControl}, // Cc [33] .. + {0x00A9, 0x00A9, prExtendedPictographic}, // 1.1 [1] (©️) copyright + {0x00AD, 0x00AD, prControl}, // Cf SOFT HYPHEN + {0x00AE, 0x00AE, prExtendedPictographic}, // 1.1 [1] (®️) registered + {0x0300, 0x036F, prExtend}, // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X + {0x0483, 0x0487, prExtend}, // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE + {0x0488, 0x0489, prExtend}, // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN + {0x0591, 0x05BD, prExtend}, // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG + {0x05BF, 0x05BF, prExtend}, // Mn HEBREW POINT RAFE + {0x05C1, 0x05C2, prExtend}, // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT + {0x05C4, 0x05C5, prExtend}, // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT + {0x05C7, 0x05C7, prExtend}, // Mn HEBREW POINT QAMATS QATAN + {0x0600, 0x0605, prPreprend}, // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE + {0x0610, 0x061A, prExtend}, // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA + {0x061C, 0x061C, prControl}, // Cf ARABIC LETTER MARK + {0x064B, 0x065F, prExtend}, // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW + {0x0670, 0x0670, prExtend}, // Mn ARABIC LETTER SUPERSCRIPT ALEF + {0x06D6, 0x06DC, prExtend}, // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN + {0x06DD, 0x06DD, prPreprend}, // Cf ARABIC END OF AYAH + {0x06DF, 0x06E4, prExtend}, // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA + {0x06E7, 0x06E8, prExtend}, // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON + {0x06EA, 0x06ED, prExtend}, // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM + {0x070F, 0x070F, prPreprend}, // Cf SYRIAC ABBREVIATION MARK + {0x0711, 0x0711, prExtend}, // Mn SYRIAC LETTER SUPERSCRIPT ALAPH + {0x0730, 0x074A, prExtend}, // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH + {0x07A6, 0x07B0, prExtend}, // Mn [11] THAANA ABAFILI..THAANA SUKUN + {0x07EB, 0x07F3, prExtend}, // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE + {0x07FD, 0x07FD, prExtend}, // Mn NKO DANTAYALAN + {0x0816, 0x0819, prExtend}, // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH + {0x081B, 0x0823, prExtend}, // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A + {0x0825, 0x0827, prExtend}, // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U + {0x0829, 0x082D, prExtend}, // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA + {0x0859, 0x085B, prExtend}, // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK + {0x08D3, 0x08E1, prExtend}, // Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA + {0x08E2, 0x08E2, prPreprend}, // Cf ARABIC DISPUTED END OF AYAH + {0x08E3, 0x0902, prExtend}, // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA + {0x0903, 0x0903, prSpacingMark}, // Mc DEVANAGARI SIGN VISARGA + {0x093A, 0x093A, prExtend}, // Mn DEVANAGARI VOWEL SIGN OE + {0x093B, 0x093B, prSpacingMark}, // Mc DEVANAGARI VOWEL SIGN OOE + {0x093C, 0x093C, prExtend}, // Mn DEVANAGARI SIGN NUKTA + {0x093E, 0x0940, prSpacingMark}, // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II + {0x0941, 0x0948, prExtend}, // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI + {0x0949, 0x094C, prSpacingMark}, // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU + {0x094D, 0x094D, prExtend}, // Mn DEVANAGARI SIGN VIRAMA + {0x094E, 0x094F, prSpacingMark}, // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW + {0x0951, 0x0957, prExtend}, // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE + {0x0962, 0x0963, prExtend}, // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL + {0x0981, 0x0981, prExtend}, // Mn BENGALI SIGN CANDRABINDU + {0x0982, 0x0983, prSpacingMark}, // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA + {0x09BC, 0x09BC, prExtend}, // Mn BENGALI SIGN NUKTA + {0x09BE, 0x09BE, prExtend}, // Mc BENGALI VOWEL SIGN AA + {0x09BF, 0x09C0, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II + {0x09C1, 0x09C4, prExtend}, // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR + {0x09C7, 0x09C8, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI + {0x09CB, 0x09CC, prSpacingMark}, // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU + {0x09CD, 0x09CD, prExtend}, // Mn BENGALI SIGN VIRAMA + {0x09D7, 0x09D7, prExtend}, // Mc BENGALI AU LENGTH MARK + {0x09E2, 0x09E3, prExtend}, // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL + {0x09FE, 0x09FE, prExtend}, // Mn BENGALI SANDHI MARK + {0x0A01, 0x0A02, prExtend}, // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI + {0x0A03, 0x0A03, prSpacingMark}, // Mc GURMUKHI SIGN VISARGA + {0x0A3C, 0x0A3C, prExtend}, // Mn GURMUKHI SIGN NUKTA + {0x0A3E, 0x0A40, prSpacingMark}, // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II + {0x0A41, 0x0A42, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU + {0x0A47, 0x0A48, prExtend}, // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI + {0x0A4B, 0x0A4D, prExtend}, // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA + {0x0A51, 0x0A51, prExtend}, // Mn GURMUKHI SIGN UDAAT + {0x0A70, 0x0A71, prExtend}, // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK + {0x0A75, 0x0A75, prExtend}, // Mn GURMUKHI SIGN YAKASH + {0x0A81, 0x0A82, prExtend}, // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA + {0x0A83, 0x0A83, prSpacingMark}, // Mc GUJARATI SIGN VISARGA + {0x0ABC, 0x0ABC, prExtend}, // Mn GUJARATI SIGN NUKTA + {0x0ABE, 0x0AC0, prSpacingMark}, // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II + {0x0AC1, 0x0AC5, prExtend}, // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E + {0x0AC7, 0x0AC8, prExtend}, // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI + {0x0AC9, 0x0AC9, prSpacingMark}, // Mc GUJARATI VOWEL SIGN CANDRA O + {0x0ACB, 0x0ACC, prSpacingMark}, // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU + {0x0ACD, 0x0ACD, prExtend}, // Mn GUJARATI SIGN VIRAMA + {0x0AE2, 0x0AE3, prExtend}, // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL + {0x0AFA, 0x0AFF, prExtend}, // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE + {0x0B01, 0x0B01, prExtend}, // Mn ORIYA SIGN CANDRABINDU + {0x0B02, 0x0B03, prSpacingMark}, // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA + {0x0B3C, 0x0B3C, prExtend}, // Mn ORIYA SIGN NUKTA + {0x0B3E, 0x0B3E, prExtend}, // Mc ORIYA VOWEL SIGN AA + {0x0B3F, 0x0B3F, prExtend}, // Mn ORIYA VOWEL SIGN I + {0x0B40, 0x0B40, prSpacingMark}, // Mc ORIYA VOWEL SIGN II + {0x0B41, 0x0B44, prExtend}, // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR + {0x0B47, 0x0B48, prSpacingMark}, // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI + {0x0B4B, 0x0B4C, prSpacingMark}, // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU + {0x0B4D, 0x0B4D, prExtend}, // Mn ORIYA SIGN VIRAMA + {0x0B56, 0x0B56, prExtend}, // Mn ORIYA AI LENGTH MARK + {0x0B57, 0x0B57, prExtend}, // Mc ORIYA AU LENGTH MARK + {0x0B62, 0x0B63, prExtend}, // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL + {0x0B82, 0x0B82, prExtend}, // Mn TAMIL SIGN ANUSVARA + {0x0BBE, 0x0BBE, prExtend}, // Mc TAMIL VOWEL SIGN AA + {0x0BBF, 0x0BBF, prSpacingMark}, // Mc TAMIL VOWEL SIGN I + {0x0BC0, 0x0BC0, prExtend}, // Mn TAMIL VOWEL SIGN II + {0x0BC1, 0x0BC2, prSpacingMark}, // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU + {0x0BC6, 0x0BC8, prSpacingMark}, // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI + {0x0BCA, 0x0BCC, prSpacingMark}, // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU + {0x0BCD, 0x0BCD, prExtend}, // Mn TAMIL SIGN VIRAMA + {0x0BD7, 0x0BD7, prExtend}, // Mc TAMIL AU LENGTH MARK + {0x0C00, 0x0C00, prExtend}, // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE + {0x0C01, 0x0C03, prSpacingMark}, // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA + {0x0C04, 0x0C04, prExtend}, // Mn TELUGU SIGN COMBINING ANUSVARA ABOVE + {0x0C3E, 0x0C40, prExtend}, // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II + {0x0C41, 0x0C44, prSpacingMark}, // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR + {0x0C46, 0x0C48, prExtend}, // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI + {0x0C4A, 0x0C4D, prExtend}, // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA + {0x0C55, 0x0C56, prExtend}, // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK + {0x0C62, 0x0C63, prExtend}, // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL + {0x0C81, 0x0C81, prExtend}, // Mn KANNADA SIGN CANDRABINDU + {0x0C82, 0x0C83, prSpacingMark}, // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA + {0x0CBC, 0x0CBC, prExtend}, // Mn KANNADA SIGN NUKTA + {0x0CBE, 0x0CBE, prSpacingMark}, // Mc KANNADA VOWEL SIGN AA + {0x0CBF, 0x0CBF, prExtend}, // Mn KANNADA VOWEL SIGN I + {0x0CC0, 0x0CC1, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U + {0x0CC2, 0x0CC2, prExtend}, // Mc KANNADA VOWEL SIGN UU + {0x0CC3, 0x0CC4, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR + {0x0CC6, 0x0CC6, prExtend}, // Mn KANNADA VOWEL SIGN E + {0x0CC7, 0x0CC8, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI + {0x0CCA, 0x0CCB, prSpacingMark}, // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO + {0x0CCC, 0x0CCD, prExtend}, // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA + {0x0CD5, 0x0CD6, prExtend}, // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK + {0x0CE2, 0x0CE3, prExtend}, // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL + {0x0D00, 0x0D01, prExtend}, // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU + {0x0D02, 0x0D03, prSpacingMark}, // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA + {0x0D3B, 0x0D3C, prExtend}, // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA + {0x0D3E, 0x0D3E, prExtend}, // Mc MALAYALAM VOWEL SIGN AA + {0x0D3F, 0x0D40, prSpacingMark}, // Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II + {0x0D41, 0x0D44, prExtend}, // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR + {0x0D46, 0x0D48, prSpacingMark}, // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI + {0x0D4A, 0x0D4C, prSpacingMark}, // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU + {0x0D4D, 0x0D4D, prExtend}, // Mn MALAYALAM SIGN VIRAMA + {0x0D4E, 0x0D4E, prPreprend}, // Lo MALAYALAM LETTER DOT REPH + {0x0D57, 0x0D57, prExtend}, // Mc MALAYALAM AU LENGTH MARK + {0x0D62, 0x0D63, prExtend}, // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL + {0x0D82, 0x0D83, prSpacingMark}, // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA + {0x0DCA, 0x0DCA, prExtend}, // Mn SINHALA SIGN AL-LAKUNA + {0x0DCF, 0x0DCF, prExtend}, // Mc SINHALA VOWEL SIGN AELA-PILLA + {0x0DD0, 0x0DD1, prSpacingMark}, // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA + {0x0DD2, 0x0DD4, prExtend}, // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA + {0x0DD6, 0x0DD6, prExtend}, // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA + {0x0DD8, 0x0DDE, prSpacingMark}, // Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA + {0x0DDF, 0x0DDF, prExtend}, // Mc SINHALA VOWEL SIGN GAYANUKITTA + {0x0DF2, 0x0DF3, prSpacingMark}, // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA + {0x0E31, 0x0E31, prExtend}, // Mn THAI CHARACTER MAI HAN-AKAT + {0x0E33, 0x0E33, prSpacingMark}, // Lo THAI CHARACTER SARA AM + {0x0E34, 0x0E3A, prExtend}, // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU + {0x0E47, 0x0E4E, prExtend}, // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN + {0x0EB1, 0x0EB1, prExtend}, // Mn LAO VOWEL SIGN MAI KAN + {0x0EB3, 0x0EB3, prSpacingMark}, // Lo LAO VOWEL SIGN AM + {0x0EB4, 0x0EBC, prExtend}, // Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO + {0x0EC8, 0x0ECD, prExtend}, // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA + {0x0F18, 0x0F19, prExtend}, // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS + {0x0F35, 0x0F35, prExtend}, // Mn TIBETAN MARK NGAS BZUNG NYI ZLA + {0x0F37, 0x0F37, prExtend}, // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS + {0x0F39, 0x0F39, prExtend}, // Mn TIBETAN MARK TSA -PHRU + {0x0F3E, 0x0F3F, prSpacingMark}, // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES + {0x0F71, 0x0F7E, prExtend}, // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO + {0x0F7F, 0x0F7F, prSpacingMark}, // Mc TIBETAN SIGN RNAM BCAD + {0x0F80, 0x0F84, prExtend}, // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA + {0x0F86, 0x0F87, prExtend}, // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS + {0x0F8D, 0x0F97, prExtend}, // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA + {0x0F99, 0x0FBC, prExtend}, // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA + {0x0FC6, 0x0FC6, prExtend}, // Mn TIBETAN SYMBOL PADMA GDAN + {0x102D, 0x1030, prExtend}, // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU + {0x1031, 0x1031, prSpacingMark}, // Mc MYANMAR VOWEL SIGN E + {0x1032, 0x1037, prExtend}, // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW + {0x1039, 0x103A, prExtend}, // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT + {0x103B, 0x103C, prSpacingMark}, // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA + {0x103D, 0x103E, prExtend}, // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA + {0x1056, 0x1057, prSpacingMark}, // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR + {0x1058, 0x1059, prExtend}, // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL + {0x105E, 0x1060, prExtend}, // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA + {0x1071, 0x1074, prExtend}, // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE + {0x1082, 0x1082, prExtend}, // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA + {0x1084, 0x1084, prSpacingMark}, // Mc MYANMAR VOWEL SIGN SHAN E + {0x1085, 0x1086, prExtend}, // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y + {0x108D, 0x108D, prExtend}, // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE + {0x109D, 0x109D, prExtend}, // Mn MYANMAR VOWEL SIGN AITON AI + {0x1100, 0x115F, prL}, // Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER + {0x1160, 0x11A7, prV}, // Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE + {0x11A8, 0x11FF, prT}, // Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN + {0x135D, 0x135F, prExtend}, // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK + {0x1712, 0x1714, prExtend}, // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA + {0x1732, 0x1734, prExtend}, // Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD + {0x1752, 0x1753, prExtend}, // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U + {0x1772, 0x1773, prExtend}, // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U + {0x17B4, 0x17B5, prExtend}, // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA + {0x17B6, 0x17B6, prSpacingMark}, // Mc KHMER VOWEL SIGN AA + {0x17B7, 0x17BD, prExtend}, // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA + {0x17BE, 0x17C5, prSpacingMark}, // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU + {0x17C6, 0x17C6, prExtend}, // Mn KHMER SIGN NIKAHIT + {0x17C7, 0x17C8, prSpacingMark}, // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU + {0x17C9, 0x17D3, prExtend}, // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT + {0x17DD, 0x17DD, prExtend}, // Mn KHMER SIGN ATTHACAN + {0x180B, 0x180D, prExtend}, // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE + {0x180E, 0x180E, prControl}, // Cf MONGOLIAN VOWEL SEPARATOR + {0x1885, 0x1886, prExtend}, // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA + {0x18A9, 0x18A9, prExtend}, // Mn MONGOLIAN LETTER ALI GALI DAGALGA + {0x1920, 0x1922, prExtend}, // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U + {0x1923, 0x1926, prSpacingMark}, // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU + {0x1927, 0x1928, prExtend}, // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O + {0x1929, 0x192B, prSpacingMark}, // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA + {0x1930, 0x1931, prSpacingMark}, // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA + {0x1932, 0x1932, prExtend}, // Mn LIMBU SMALL LETTER ANUSVARA + {0x1933, 0x1938, prSpacingMark}, // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA + {0x1939, 0x193B, prExtend}, // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I + {0x1A17, 0x1A18, prExtend}, // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U + {0x1A19, 0x1A1A, prSpacingMark}, // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O + {0x1A1B, 0x1A1B, prExtend}, // Mn BUGINESE VOWEL SIGN AE + {0x1A55, 0x1A55, prSpacingMark}, // Mc TAI THAM CONSONANT SIGN MEDIAL RA + {0x1A56, 0x1A56, prExtend}, // Mn TAI THAM CONSONANT SIGN MEDIAL LA + {0x1A57, 0x1A57, prSpacingMark}, // Mc TAI THAM CONSONANT SIGN LA TANG LAI + {0x1A58, 0x1A5E, prExtend}, // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA + {0x1A60, 0x1A60, prExtend}, // Mn TAI THAM SIGN SAKOT + {0x1A62, 0x1A62, prExtend}, // Mn TAI THAM VOWEL SIGN MAI SAT + {0x1A65, 0x1A6C, prExtend}, // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW + {0x1A6D, 0x1A72, prSpacingMark}, // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI + {0x1A73, 0x1A7C, prExtend}, // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN + {0x1A7F, 0x1A7F, prExtend}, // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT + {0x1AB0, 0x1ABD, prExtend}, // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW + {0x1ABE, 0x1ABE, prExtend}, // Me COMBINING PARENTHESES OVERLAY + {0x1B00, 0x1B03, prExtend}, // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG + {0x1B04, 0x1B04, prSpacingMark}, // Mc BALINESE SIGN BISAH + {0x1B34, 0x1B34, prExtend}, // Mn BALINESE SIGN REREKAN + {0x1B35, 0x1B35, prExtend}, // Mc BALINESE VOWEL SIGN TEDUNG + {0x1B36, 0x1B3A, prExtend}, // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA + {0x1B3B, 0x1B3B, prSpacingMark}, // Mc BALINESE VOWEL SIGN RA REPA TEDUNG + {0x1B3C, 0x1B3C, prExtend}, // Mn BALINESE VOWEL SIGN LA LENGA + {0x1B3D, 0x1B41, prSpacingMark}, // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG + {0x1B42, 0x1B42, prExtend}, // Mn BALINESE VOWEL SIGN PEPET + {0x1B43, 0x1B44, prSpacingMark}, // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG + {0x1B6B, 0x1B73, prExtend}, // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG + {0x1B80, 0x1B81, prExtend}, // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR + {0x1B82, 0x1B82, prSpacingMark}, // Mc SUNDANESE SIGN PANGWISAD + {0x1BA1, 0x1BA1, prSpacingMark}, // Mc SUNDANESE CONSONANT SIGN PAMINGKAL + {0x1BA2, 0x1BA5, prExtend}, // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU + {0x1BA6, 0x1BA7, prSpacingMark}, // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG + {0x1BA8, 0x1BA9, prExtend}, // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG + {0x1BAA, 0x1BAA, prSpacingMark}, // Mc SUNDANESE SIGN PAMAAEH + {0x1BAB, 0x1BAD, prExtend}, // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA + {0x1BE6, 0x1BE6, prExtend}, // Mn BATAK SIGN TOMPI + {0x1BE7, 0x1BE7, prSpacingMark}, // Mc BATAK VOWEL SIGN E + {0x1BE8, 0x1BE9, prExtend}, // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE + {0x1BEA, 0x1BEC, prSpacingMark}, // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O + {0x1BED, 0x1BED, prExtend}, // Mn BATAK VOWEL SIGN KARO O + {0x1BEE, 0x1BEE, prSpacingMark}, // Mc BATAK VOWEL SIGN U + {0x1BEF, 0x1BF1, prExtend}, // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H + {0x1BF2, 0x1BF3, prSpacingMark}, // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN + {0x1C24, 0x1C2B, prSpacingMark}, // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU + {0x1C2C, 0x1C33, prExtend}, // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T + {0x1C34, 0x1C35, prSpacingMark}, // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG + {0x1C36, 0x1C37, prExtend}, // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA + {0x1CD0, 0x1CD2, prExtend}, // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA + {0x1CD4, 0x1CE0, prExtend}, // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA + {0x1CE1, 0x1CE1, prSpacingMark}, // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA + {0x1CE2, 0x1CE8, prExtend}, // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL + {0x1CED, 0x1CED, prExtend}, // Mn VEDIC SIGN TIRYAK + {0x1CF4, 0x1CF4, prExtend}, // Mn VEDIC TONE CANDRA ABOVE + {0x1CF7, 0x1CF7, prSpacingMark}, // Mc VEDIC SIGN ATIKRAMA + {0x1CF8, 0x1CF9, prExtend}, // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE + {0x1DC0, 0x1DF9, prExtend}, // Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW + {0x1DFB, 0x1DFF, prExtend}, // Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW + {0x200B, 0x200B, prControl}, // Cf ZERO WIDTH SPACE + {0x200C, 0x200C, prExtend}, // Cf ZERO WIDTH NON-JOINER + {0x200D, 0x200D, prZWJ}, // Cf ZERO WIDTH JOINER + {0x200E, 0x200F, prControl}, // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK + {0x2028, 0x2028, prControl}, // Zl LINE SEPARATOR + {0x2029, 0x2029, prControl}, // Zp PARAGRAPH SEPARATOR + {0x202A, 0x202E, prControl}, // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE + {0x203C, 0x203C, prExtendedPictographic}, // 1.1 [1] (‼️) double exclamation mark + {0x2049, 0x2049, prExtendedPictographic}, // 3.0 [1] (⁉️) exclamation question mark + {0x2060, 0x2064, prControl}, // Cf [5] WORD JOINER..INVISIBLE PLUS + {0x2065, 0x2065, prControl}, // Cn + {0x2066, 0x206F, prControl}, // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES + {0x20D0, 0x20DC, prExtend}, // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE + {0x20DD, 0x20E0, prExtend}, // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH + {0x20E1, 0x20E1, prExtend}, // Mn COMBINING LEFT RIGHT ARROW ABOVE + {0x20E2, 0x20E4, prExtend}, // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE + {0x20E5, 0x20F0, prExtend}, // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE + {0x2122, 0x2122, prExtendedPictographic}, // 1.1 [1] (™️) trade mark + {0x2139, 0x2139, prExtendedPictographic}, // 3.0 [1] (ℹ️) information + {0x2194, 0x2199, prExtendedPictographic}, // 1.1 [6] (↔️..↙️) left-right arrow..down-left arrow + {0x21A9, 0x21AA, prExtendedPictographic}, // 1.1 [2] (↩️..↪️) right arrow curving left..left arrow curving right + {0x231A, 0x231B, prExtendedPictographic}, // 1.1 [2] (⌚..⌛) watch..hourglass done + {0x2328, 0x2328, prExtendedPictographic}, // 1.1 [1] (⌨️) keyboard + {0x2388, 0x2388, prExtendedPictographic}, // 3.0 [1] (⎈) HELM SYMBOL + {0x23CF, 0x23CF, prExtendedPictographic}, // 4.0 [1] (⏏️) eject button + {0x23E9, 0x23F3, prExtendedPictographic}, // 6.0 [11] (⏩..⏳) fast-forward button..hourglass not done + {0x23F8, 0x23FA, prExtendedPictographic}, // 7.0 [3] (⏸️..⏺️) pause button..record button + {0x24C2, 0x24C2, prExtendedPictographic}, // 1.1 [1] (Ⓜ️) circled M + {0x25AA, 0x25AB, prExtendedPictographic}, // 1.1 [2] (▪️..▫️) black small square..white small square + {0x25B6, 0x25B6, prExtendedPictographic}, // 1.1 [1] (▶️) play button + {0x25C0, 0x25C0, prExtendedPictographic}, // 1.1 [1] (◀️) reverse button + {0x25FB, 0x25FE, prExtendedPictographic}, // 3.2 [4] (◻️..◾) white medium square..black medium-small square + {0x2600, 0x2605, prExtendedPictographic}, // 1.1 [6] (☀️..★) sun..BLACK STAR + {0x2607, 0x2612, prExtendedPictographic}, // 1.1 [12] (☇..☒) LIGHTNING..BALLOT BOX WITH X + {0x2614, 0x2615, prExtendedPictographic}, // 4.0 [2] (☔..☕) umbrella with rain drops..hot beverage + {0x2616, 0x2617, prExtendedPictographic}, // 3.2 [2] (☖..☗) WHITE SHOGI PIECE..BLACK SHOGI PIECE + {0x2618, 0x2618, prExtendedPictographic}, // 4.1 [1] (☘️) shamrock + {0x2619, 0x2619, prExtendedPictographic}, // 3.0 [1] (☙) REVERSED ROTATED FLORAL HEART BULLET + {0x261A, 0x266F, prExtendedPictographic}, // 1.1 [86] (☚..♯) BLACK LEFT POINTING INDEX..MUSIC SHARP SIGN + {0x2670, 0x2671, prExtendedPictographic}, // 3.0 [2] (♰..♱) WEST SYRIAC CROSS..EAST SYRIAC CROSS + {0x2672, 0x267D, prExtendedPictographic}, // 3.2 [12] (♲..♽) UNIVERSAL RECYCLING SYMBOL..PARTIALLY-RECYCLED PAPER SYMBOL + {0x267E, 0x267F, prExtendedPictographic}, // 4.1 [2] (♾️..♿) infinity..wheelchair symbol + {0x2680, 0x2685, prExtendedPictographic}, // 3.2 [6] (⚀..⚅) DIE FACE-1..DIE FACE-6 + {0x2690, 0x2691, prExtendedPictographic}, // 4.0 [2] (⚐..⚑) WHITE FLAG..BLACK FLAG + {0x2692, 0x269C, prExtendedPictographic}, // 4.1 [11] (⚒️..⚜️) hammer and pick..fleur-de-lis + {0x269D, 0x269D, prExtendedPictographic}, // 5.1 [1] (⚝) OUTLINED WHITE STAR + {0x269E, 0x269F, prExtendedPictographic}, // 5.2 [2] (⚞..⚟) THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT + {0x26A0, 0x26A1, prExtendedPictographic}, // 4.0 [2] (⚠️..⚡) warning..high voltage + {0x26A2, 0x26B1, prExtendedPictographic}, // 4.1 [16] (⚢..⚱️) DOUBLED FEMALE SIGN..funeral urn + {0x26B2, 0x26B2, prExtendedPictographic}, // 5.0 [1] (⚲) NEUTER + {0x26B3, 0x26BC, prExtendedPictographic}, // 5.1 [10] (⚳..⚼) CERES..SESQUIQUADRATE + {0x26BD, 0x26BF, prExtendedPictographic}, // 5.2 [3] (⚽..⚿) soccer ball..SQUARED KEY + {0x26C0, 0x26C3, prExtendedPictographic}, // 5.1 [4] (⛀..⛃) WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING + {0x26C4, 0x26CD, prExtendedPictographic}, // 5.2 [10] (⛄..⛍) snowman without snow..DISABLED CAR + {0x26CE, 0x26CE, prExtendedPictographic}, // 6.0 [1] (⛎) Ophiuchus + {0x26CF, 0x26E1, prExtendedPictographic}, // 5.2 [19] (⛏️..⛡) pick..RESTRICTED LEFT ENTRY-2 + {0x26E2, 0x26E2, prExtendedPictographic}, // 6.0 [1] (⛢) ASTRONOMICAL SYMBOL FOR URANUS + {0x26E3, 0x26E3, prExtendedPictographic}, // 5.2 [1] (⛣) HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE + {0x26E4, 0x26E7, prExtendedPictographic}, // 6.0 [4] (⛤..⛧) PENTAGRAM..INVERTED PENTAGRAM + {0x26E8, 0x26FF, prExtendedPictographic}, // 5.2 [24] (⛨..⛿) BLACK CROSS ON SHIELD..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE + {0x2700, 0x2700, prExtendedPictographic}, // 7.0 [1] (✀) BLACK SAFETY SCISSORS + {0x2701, 0x2704, prExtendedPictographic}, // 1.1 [4] (✁..✄) UPPER BLADE SCISSORS..WHITE SCISSORS + {0x2705, 0x2705, prExtendedPictographic}, // 6.0 [1] (✅) check mark button + {0x2708, 0x2709, prExtendedPictographic}, // 1.1 [2] (✈️..✉️) airplane..envelope + {0x270A, 0x270B, prExtendedPictographic}, // 6.0 [2] (✊..✋) raised fist..raised hand + {0x270C, 0x2712, prExtendedPictographic}, // 1.1 [7] (✌️..✒️) victory hand..black nib + {0x2714, 0x2714, prExtendedPictographic}, // 1.1 [1] (✔️) check mark + {0x2716, 0x2716, prExtendedPictographic}, // 1.1 [1] (✖️) multiplication sign + {0x271D, 0x271D, prExtendedPictographic}, // 1.1 [1] (✝️) latin cross + {0x2721, 0x2721, prExtendedPictographic}, // 1.1 [1] (✡️) star of David + {0x2728, 0x2728, prExtendedPictographic}, // 6.0 [1] (✨) sparkles + {0x2733, 0x2734, prExtendedPictographic}, // 1.1 [2] (✳️..✴️) eight-spoked asterisk..eight-pointed star + {0x2744, 0x2744, prExtendedPictographic}, // 1.1 [1] (❄️) snowflake + {0x2747, 0x2747, prExtendedPictographic}, // 1.1 [1] (❇️) sparkle + {0x274C, 0x274C, prExtendedPictographic}, // 6.0 [1] (❌) cross mark + {0x274E, 0x274E, prExtendedPictographic}, // 6.0 [1] (❎) cross mark button + {0x2753, 0x2755, prExtendedPictographic}, // 6.0 [3] (❓..❕) question mark..white exclamation mark + {0x2757, 0x2757, prExtendedPictographic}, // 5.2 [1] (❗) exclamation mark + {0x2763, 0x2767, prExtendedPictographic}, // 1.1 [5] (❣️..❧) heart exclamation..ROTATED FLORAL HEART BULLET + {0x2795, 0x2797, prExtendedPictographic}, // 6.0 [3] (➕..➗) plus sign..division sign + {0x27A1, 0x27A1, prExtendedPictographic}, // 1.1 [1] (➡️) right arrow + {0x27B0, 0x27B0, prExtendedPictographic}, // 6.0 [1] (➰) curly loop + {0x27BF, 0x27BF, prExtendedPictographic}, // 6.0 [1] (➿) double curly loop + {0x2934, 0x2935, prExtendedPictographic}, // 3.2 [2] (⤴️..⤵️) right arrow curving up..right arrow curving down + {0x2B05, 0x2B07, prExtendedPictographic}, // 4.0 [3] (⬅️..⬇️) left arrow..down arrow + {0x2B1B, 0x2B1C, prExtendedPictographic}, // 5.1 [2] (⬛..⬜) black large square..white large square + {0x2B50, 0x2B50, prExtendedPictographic}, // 5.1 [1] (⭐) star + {0x2B55, 0x2B55, prExtendedPictographic}, // 5.2 [1] (⭕) hollow red circle + {0x2CEF, 0x2CF1, prExtend}, // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS + {0x2D7F, 0x2D7F, prExtend}, // Mn TIFINAGH CONSONANT JOINER + {0x2DE0, 0x2DFF, prExtend}, // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS + {0x302A, 0x302D, prExtend}, // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK + {0x302E, 0x302F, prExtend}, // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK + {0x3030, 0x3030, prExtendedPictographic}, // 1.1 [1] (〰️) wavy dash + {0x303D, 0x303D, prExtendedPictographic}, // 3.2 [1] (〽️) part alternation mark + {0x3099, 0x309A, prExtend}, // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + {0x3297, 0x3297, prExtendedPictographic}, // 1.1 [1] (㊗️) Japanese “congratulations” button + {0x3299, 0x3299, prExtendedPictographic}, // 1.1 [1] (㊙️) Japanese “secret” button + {0xA66F, 0xA66F, prExtend}, // Mn COMBINING CYRILLIC VZMET + {0xA670, 0xA672, prExtend}, // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN + {0xA674, 0xA67D, prExtend}, // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK + {0xA69E, 0xA69F, prExtend}, // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E + {0xA6F0, 0xA6F1, prExtend}, // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS + {0xA802, 0xA802, prExtend}, // Mn SYLOTI NAGRI SIGN DVISVARA + {0xA806, 0xA806, prExtend}, // Mn SYLOTI NAGRI SIGN HASANTA + {0xA80B, 0xA80B, prExtend}, // Mn SYLOTI NAGRI SIGN ANUSVARA + {0xA823, 0xA824, prSpacingMark}, // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I + {0xA825, 0xA826, prExtend}, // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E + {0xA827, 0xA827, prSpacingMark}, // Mc SYLOTI NAGRI VOWEL SIGN OO + {0xA880, 0xA881, prSpacingMark}, // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA + {0xA8B4, 0xA8C3, prSpacingMark}, // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU + {0xA8C4, 0xA8C5, prExtend}, // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU + {0xA8E0, 0xA8F1, prExtend}, // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA + {0xA8FF, 0xA8FF, prExtend}, // Mn DEVANAGARI VOWEL SIGN AY + {0xA926, 0xA92D, prExtend}, // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU + {0xA947, 0xA951, prExtend}, // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R + {0xA952, 0xA953, prSpacingMark}, // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA + {0xA960, 0xA97C, prL}, // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH + {0xA980, 0xA982, prExtend}, // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR + {0xA983, 0xA983, prSpacingMark}, // Mc JAVANESE SIGN WIGNYAN + {0xA9B3, 0xA9B3, prExtend}, // Mn JAVANESE SIGN CECAK TELU + {0xA9B4, 0xA9B5, prSpacingMark}, // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG + {0xA9B6, 0xA9B9, prExtend}, // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT + {0xA9BA, 0xA9BB, prSpacingMark}, // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE + {0xA9BC, 0xA9BD, prExtend}, // Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET + {0xA9BE, 0xA9C0, prSpacingMark}, // Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON + {0xA9E5, 0xA9E5, prExtend}, // Mn MYANMAR SIGN SHAN SAW + {0xAA29, 0xAA2E, prExtend}, // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE + {0xAA2F, 0xAA30, prSpacingMark}, // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI + {0xAA31, 0xAA32, prExtend}, // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE + {0xAA33, 0xAA34, prSpacingMark}, // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA + {0xAA35, 0xAA36, prExtend}, // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA + {0xAA43, 0xAA43, prExtend}, // Mn CHAM CONSONANT SIGN FINAL NG + {0xAA4C, 0xAA4C, prExtend}, // Mn CHAM CONSONANT SIGN FINAL M + {0xAA4D, 0xAA4D, prSpacingMark}, // Mc CHAM CONSONANT SIGN FINAL H + {0xAA7C, 0xAA7C, prExtend}, // Mn MYANMAR SIGN TAI LAING TONE-2 + {0xAAB0, 0xAAB0, prExtend}, // Mn TAI VIET MAI KANG + {0xAAB2, 0xAAB4, prExtend}, // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U + {0xAAB7, 0xAAB8, prExtend}, // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA + {0xAABE, 0xAABF, prExtend}, // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK + {0xAAC1, 0xAAC1, prExtend}, // Mn TAI VIET TONE MAI THO + {0xAAEB, 0xAAEB, prSpacingMark}, // Mc MEETEI MAYEK VOWEL SIGN II + {0xAAEC, 0xAAED, prExtend}, // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI + {0xAAEE, 0xAAEF, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU + {0xAAF5, 0xAAF5, prSpacingMark}, // Mc MEETEI MAYEK VOWEL SIGN VISARGA + {0xAAF6, 0xAAF6, prExtend}, // Mn MEETEI MAYEK VIRAMA + {0xABE3, 0xABE4, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP + {0xABE5, 0xABE5, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN ANAP + {0xABE6, 0xABE7, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP + {0xABE8, 0xABE8, prExtend}, // Mn MEETEI MAYEK VOWEL SIGN UNAP + {0xABE9, 0xABEA, prSpacingMark}, // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG + {0xABEC, 0xABEC, prSpacingMark}, // Mc MEETEI MAYEK LUM IYEK + {0xABED, 0xABED, prExtend}, // Mn MEETEI MAYEK APUN IYEK + {0xAC00, 0xAC00, prLV}, // Lo HANGUL SYLLABLE GA + {0xAC01, 0xAC1B, prLVT}, // Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH + {0xAC1C, 0xAC1C, prLV}, // Lo HANGUL SYLLABLE GAE + {0xAC1D, 0xAC37, prLVT}, // Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH + {0xAC38, 0xAC38, prLV}, // Lo HANGUL SYLLABLE GYA + {0xAC39, 0xAC53, prLVT}, // Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH + {0xAC54, 0xAC54, prLV}, // Lo HANGUL SYLLABLE GYAE + {0xAC55, 0xAC6F, prLVT}, // Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH + {0xAC70, 0xAC70, prLV}, // Lo HANGUL SYLLABLE GEO + {0xAC71, 0xAC8B, prLVT}, // Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH + {0xAC8C, 0xAC8C, prLV}, // Lo HANGUL SYLLABLE GE + {0xAC8D, 0xACA7, prLVT}, // Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH + {0xACA8, 0xACA8, prLV}, // Lo HANGUL SYLLABLE GYEO + {0xACA9, 0xACC3, prLVT}, // Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH + {0xACC4, 0xACC4, prLV}, // Lo HANGUL SYLLABLE GYE + {0xACC5, 0xACDF, prLVT}, // Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH + {0xACE0, 0xACE0, prLV}, // Lo HANGUL SYLLABLE GO + {0xACE1, 0xACFB, prLVT}, // Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH + {0xACFC, 0xACFC, prLV}, // Lo HANGUL SYLLABLE GWA + {0xACFD, 0xAD17, prLVT}, // Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH + {0xAD18, 0xAD18, prLV}, // Lo HANGUL SYLLABLE GWAE + {0xAD19, 0xAD33, prLVT}, // Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH + {0xAD34, 0xAD34, prLV}, // Lo HANGUL SYLLABLE GOE + {0xAD35, 0xAD4F, prLVT}, // Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH + {0xAD50, 0xAD50, prLV}, // Lo HANGUL SYLLABLE GYO + {0xAD51, 0xAD6B, prLVT}, // Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH + {0xAD6C, 0xAD6C, prLV}, // Lo HANGUL SYLLABLE GU + {0xAD6D, 0xAD87, prLVT}, // Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH + {0xAD88, 0xAD88, prLV}, // Lo HANGUL SYLLABLE GWEO + {0xAD89, 0xADA3, prLVT}, // Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH + {0xADA4, 0xADA4, prLV}, // Lo HANGUL SYLLABLE GWE + {0xADA5, 0xADBF, prLVT}, // Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH + {0xADC0, 0xADC0, prLV}, // Lo HANGUL SYLLABLE GWI + {0xADC1, 0xADDB, prLVT}, // Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH + {0xADDC, 0xADDC, prLV}, // Lo HANGUL SYLLABLE GYU + {0xADDD, 0xADF7, prLVT}, // Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH + {0xADF8, 0xADF8, prLV}, // Lo HANGUL SYLLABLE GEU + {0xADF9, 0xAE13, prLVT}, // Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH + {0xAE14, 0xAE14, prLV}, // Lo HANGUL SYLLABLE GYI + {0xAE15, 0xAE2F, prLVT}, // Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH + {0xAE30, 0xAE30, prLV}, // Lo HANGUL SYLLABLE GI + {0xAE31, 0xAE4B, prLVT}, // Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH + {0xAE4C, 0xAE4C, prLV}, // Lo HANGUL SYLLABLE GGA + {0xAE4D, 0xAE67, prLVT}, // Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH + {0xAE68, 0xAE68, prLV}, // Lo HANGUL SYLLABLE GGAE + {0xAE69, 0xAE83, prLVT}, // Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH + {0xAE84, 0xAE84, prLV}, // Lo HANGUL SYLLABLE GGYA + {0xAE85, 0xAE9F, prLVT}, // Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH + {0xAEA0, 0xAEA0, prLV}, // Lo HANGUL SYLLABLE GGYAE + {0xAEA1, 0xAEBB, prLVT}, // Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH + {0xAEBC, 0xAEBC, prLV}, // Lo HANGUL SYLLABLE GGEO + {0xAEBD, 0xAED7, prLVT}, // Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH + {0xAED8, 0xAED8, prLV}, // Lo HANGUL SYLLABLE GGE + {0xAED9, 0xAEF3, prLVT}, // Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH + {0xAEF4, 0xAEF4, prLV}, // Lo HANGUL SYLLABLE GGYEO + {0xAEF5, 0xAF0F, prLVT}, // Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH + {0xAF10, 0xAF10, prLV}, // Lo HANGUL SYLLABLE GGYE + {0xAF11, 0xAF2B, prLVT}, // Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH + {0xAF2C, 0xAF2C, prLV}, // Lo HANGUL SYLLABLE GGO + {0xAF2D, 0xAF47, prLVT}, // Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH + {0xAF48, 0xAF48, prLV}, // Lo HANGUL SYLLABLE GGWA + {0xAF49, 0xAF63, prLVT}, // Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH + {0xAF64, 0xAF64, prLV}, // Lo HANGUL SYLLABLE GGWAE + {0xAF65, 0xAF7F, prLVT}, // Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH + {0xAF80, 0xAF80, prLV}, // Lo HANGUL SYLLABLE GGOE + {0xAF81, 0xAF9B, prLVT}, // Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH + {0xAF9C, 0xAF9C, prLV}, // Lo HANGUL SYLLABLE GGYO + {0xAF9D, 0xAFB7, prLVT}, // Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH + {0xAFB8, 0xAFB8, prLV}, // Lo HANGUL SYLLABLE GGU + {0xAFB9, 0xAFD3, prLVT}, // Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH + {0xAFD4, 0xAFD4, prLV}, // Lo HANGUL SYLLABLE GGWEO + {0xAFD5, 0xAFEF, prLVT}, // Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH + {0xAFF0, 0xAFF0, prLV}, // Lo HANGUL SYLLABLE GGWE + {0xAFF1, 0xB00B, prLVT}, // Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH + {0xB00C, 0xB00C, prLV}, // Lo HANGUL SYLLABLE GGWI + {0xB00D, 0xB027, prLVT}, // Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH + {0xB028, 0xB028, prLV}, // Lo HANGUL SYLLABLE GGYU + {0xB029, 0xB043, prLVT}, // Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH + {0xB044, 0xB044, prLV}, // Lo HANGUL SYLLABLE GGEU + {0xB045, 0xB05F, prLVT}, // Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH + {0xB060, 0xB060, prLV}, // Lo HANGUL SYLLABLE GGYI + {0xB061, 0xB07B, prLVT}, // Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH + {0xB07C, 0xB07C, prLV}, // Lo HANGUL SYLLABLE GGI + {0xB07D, 0xB097, prLVT}, // Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH + {0xB098, 0xB098, prLV}, // Lo HANGUL SYLLABLE NA + {0xB099, 0xB0B3, prLVT}, // Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH + {0xB0B4, 0xB0B4, prLV}, // Lo HANGUL SYLLABLE NAE + {0xB0B5, 0xB0CF, prLVT}, // Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH + {0xB0D0, 0xB0D0, prLV}, // Lo HANGUL SYLLABLE NYA + {0xB0D1, 0xB0EB, prLVT}, // Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH + {0xB0EC, 0xB0EC, prLV}, // Lo HANGUL SYLLABLE NYAE + {0xB0ED, 0xB107, prLVT}, // Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH + {0xB108, 0xB108, prLV}, // Lo HANGUL SYLLABLE NEO + {0xB109, 0xB123, prLVT}, // Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH + {0xB124, 0xB124, prLV}, // Lo HANGUL SYLLABLE NE + {0xB125, 0xB13F, prLVT}, // Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH + {0xB140, 0xB140, prLV}, // Lo HANGUL SYLLABLE NYEO + {0xB141, 0xB15B, prLVT}, // Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH + {0xB15C, 0xB15C, prLV}, // Lo HANGUL SYLLABLE NYE + {0xB15D, 0xB177, prLVT}, // Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH + {0xB178, 0xB178, prLV}, // Lo HANGUL SYLLABLE NO + {0xB179, 0xB193, prLVT}, // Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH + {0xB194, 0xB194, prLV}, // Lo HANGUL SYLLABLE NWA + {0xB195, 0xB1AF, prLVT}, // Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH + {0xB1B0, 0xB1B0, prLV}, // Lo HANGUL SYLLABLE NWAE + {0xB1B1, 0xB1CB, prLVT}, // Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH + {0xB1CC, 0xB1CC, prLV}, // Lo HANGUL SYLLABLE NOE + {0xB1CD, 0xB1E7, prLVT}, // Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH + {0xB1E8, 0xB1E8, prLV}, // Lo HANGUL SYLLABLE NYO + {0xB1E9, 0xB203, prLVT}, // Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH + {0xB204, 0xB204, prLV}, // Lo HANGUL SYLLABLE NU + {0xB205, 0xB21F, prLVT}, // Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH + {0xB220, 0xB220, prLV}, // Lo HANGUL SYLLABLE NWEO + {0xB221, 0xB23B, prLVT}, // Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH + {0xB23C, 0xB23C, prLV}, // Lo HANGUL SYLLABLE NWE + {0xB23D, 0xB257, prLVT}, // Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH + {0xB258, 0xB258, prLV}, // Lo HANGUL SYLLABLE NWI + {0xB259, 0xB273, prLVT}, // Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH + {0xB274, 0xB274, prLV}, // Lo HANGUL SYLLABLE NYU + {0xB275, 0xB28F, prLVT}, // Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH + {0xB290, 0xB290, prLV}, // Lo HANGUL SYLLABLE NEU + {0xB291, 0xB2AB, prLVT}, // Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH + {0xB2AC, 0xB2AC, prLV}, // Lo HANGUL SYLLABLE NYI + {0xB2AD, 0xB2C7, prLVT}, // Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH + {0xB2C8, 0xB2C8, prLV}, // Lo HANGUL SYLLABLE NI + {0xB2C9, 0xB2E3, prLVT}, // Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH + {0xB2E4, 0xB2E4, prLV}, // Lo HANGUL SYLLABLE DA + {0xB2E5, 0xB2FF, prLVT}, // Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH + {0xB300, 0xB300, prLV}, // Lo HANGUL SYLLABLE DAE + {0xB301, 0xB31B, prLVT}, // Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH + {0xB31C, 0xB31C, prLV}, // Lo HANGUL SYLLABLE DYA + {0xB31D, 0xB337, prLVT}, // Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH + {0xB338, 0xB338, prLV}, // Lo HANGUL SYLLABLE DYAE + {0xB339, 0xB353, prLVT}, // Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH + {0xB354, 0xB354, prLV}, // Lo HANGUL SYLLABLE DEO + {0xB355, 0xB36F, prLVT}, // Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH + {0xB370, 0xB370, prLV}, // Lo HANGUL SYLLABLE DE + {0xB371, 0xB38B, prLVT}, // Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH + {0xB38C, 0xB38C, prLV}, // Lo HANGUL SYLLABLE DYEO + {0xB38D, 0xB3A7, prLVT}, // Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH + {0xB3A8, 0xB3A8, prLV}, // Lo HANGUL SYLLABLE DYE + {0xB3A9, 0xB3C3, prLVT}, // Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH + {0xB3C4, 0xB3C4, prLV}, // Lo HANGUL SYLLABLE DO + {0xB3C5, 0xB3DF, prLVT}, // Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH + {0xB3E0, 0xB3E0, prLV}, // Lo HANGUL SYLLABLE DWA + {0xB3E1, 0xB3FB, prLVT}, // Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH + {0xB3FC, 0xB3FC, prLV}, // Lo HANGUL SYLLABLE DWAE + {0xB3FD, 0xB417, prLVT}, // Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH + {0xB418, 0xB418, prLV}, // Lo HANGUL SYLLABLE DOE + {0xB419, 0xB433, prLVT}, // Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH + {0xB434, 0xB434, prLV}, // Lo HANGUL SYLLABLE DYO + {0xB435, 0xB44F, prLVT}, // Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH + {0xB450, 0xB450, prLV}, // Lo HANGUL SYLLABLE DU + {0xB451, 0xB46B, prLVT}, // Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH + {0xB46C, 0xB46C, prLV}, // Lo HANGUL SYLLABLE DWEO + {0xB46D, 0xB487, prLVT}, // Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH + {0xB488, 0xB488, prLV}, // Lo HANGUL SYLLABLE DWE + {0xB489, 0xB4A3, prLVT}, // Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH + {0xB4A4, 0xB4A4, prLV}, // Lo HANGUL SYLLABLE DWI + {0xB4A5, 0xB4BF, prLVT}, // Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH + {0xB4C0, 0xB4C0, prLV}, // Lo HANGUL SYLLABLE DYU + {0xB4C1, 0xB4DB, prLVT}, // Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH + {0xB4DC, 0xB4DC, prLV}, // Lo HANGUL SYLLABLE DEU + {0xB4DD, 0xB4F7, prLVT}, // Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH + {0xB4F8, 0xB4F8, prLV}, // Lo HANGUL SYLLABLE DYI + {0xB4F9, 0xB513, prLVT}, // Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH + {0xB514, 0xB514, prLV}, // Lo HANGUL SYLLABLE DI + {0xB515, 0xB52F, prLVT}, // Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH + {0xB530, 0xB530, prLV}, // Lo HANGUL SYLLABLE DDA + {0xB531, 0xB54B, prLVT}, // Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH + {0xB54C, 0xB54C, prLV}, // Lo HANGUL SYLLABLE DDAE + {0xB54D, 0xB567, prLVT}, // Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH + {0xB568, 0xB568, prLV}, // Lo HANGUL SYLLABLE DDYA + {0xB569, 0xB583, prLVT}, // Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH + {0xB584, 0xB584, prLV}, // Lo HANGUL SYLLABLE DDYAE + {0xB585, 0xB59F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH + {0xB5A0, 0xB5A0, prLV}, // Lo HANGUL SYLLABLE DDEO + {0xB5A1, 0xB5BB, prLVT}, // Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH + {0xB5BC, 0xB5BC, prLV}, // Lo HANGUL SYLLABLE DDE + {0xB5BD, 0xB5D7, prLVT}, // Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH + {0xB5D8, 0xB5D8, prLV}, // Lo HANGUL SYLLABLE DDYEO + {0xB5D9, 0xB5F3, prLVT}, // Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH + {0xB5F4, 0xB5F4, prLV}, // Lo HANGUL SYLLABLE DDYE + {0xB5F5, 0xB60F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH + {0xB610, 0xB610, prLV}, // Lo HANGUL SYLLABLE DDO + {0xB611, 0xB62B, prLVT}, // Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH + {0xB62C, 0xB62C, prLV}, // Lo HANGUL SYLLABLE DDWA + {0xB62D, 0xB647, prLVT}, // Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH + {0xB648, 0xB648, prLV}, // Lo HANGUL SYLLABLE DDWAE + {0xB649, 0xB663, prLVT}, // Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH + {0xB664, 0xB664, prLV}, // Lo HANGUL SYLLABLE DDOE + {0xB665, 0xB67F, prLVT}, // Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH + {0xB680, 0xB680, prLV}, // Lo HANGUL SYLLABLE DDYO + {0xB681, 0xB69B, prLVT}, // Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH + {0xB69C, 0xB69C, prLV}, // Lo HANGUL SYLLABLE DDU + {0xB69D, 0xB6B7, prLVT}, // Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH + {0xB6B8, 0xB6B8, prLV}, // Lo HANGUL SYLLABLE DDWEO + {0xB6B9, 0xB6D3, prLVT}, // Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH + {0xB6D4, 0xB6D4, prLV}, // Lo HANGUL SYLLABLE DDWE + {0xB6D5, 0xB6EF, prLVT}, // Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH + {0xB6F0, 0xB6F0, prLV}, // Lo HANGUL SYLLABLE DDWI + {0xB6F1, 0xB70B, prLVT}, // Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH + {0xB70C, 0xB70C, prLV}, // Lo HANGUL SYLLABLE DDYU + {0xB70D, 0xB727, prLVT}, // Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH + {0xB728, 0xB728, prLV}, // Lo HANGUL SYLLABLE DDEU + {0xB729, 0xB743, prLVT}, // Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH + {0xB744, 0xB744, prLV}, // Lo HANGUL SYLLABLE DDYI + {0xB745, 0xB75F, prLVT}, // Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH + {0xB760, 0xB760, prLV}, // Lo HANGUL SYLLABLE DDI + {0xB761, 0xB77B, prLVT}, // Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH + {0xB77C, 0xB77C, prLV}, // Lo HANGUL SYLLABLE RA + {0xB77D, 0xB797, prLVT}, // Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH + {0xB798, 0xB798, prLV}, // Lo HANGUL SYLLABLE RAE + {0xB799, 0xB7B3, prLVT}, // Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH + {0xB7B4, 0xB7B4, prLV}, // Lo HANGUL SYLLABLE RYA + {0xB7B5, 0xB7CF, prLVT}, // Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH + {0xB7D0, 0xB7D0, prLV}, // Lo HANGUL SYLLABLE RYAE + {0xB7D1, 0xB7EB, prLVT}, // Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH + {0xB7EC, 0xB7EC, prLV}, // Lo HANGUL SYLLABLE REO + {0xB7ED, 0xB807, prLVT}, // Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH + {0xB808, 0xB808, prLV}, // Lo HANGUL SYLLABLE RE + {0xB809, 0xB823, prLVT}, // Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH + {0xB824, 0xB824, prLV}, // Lo HANGUL SYLLABLE RYEO + {0xB825, 0xB83F, prLVT}, // Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH + {0xB840, 0xB840, prLV}, // Lo HANGUL SYLLABLE RYE + {0xB841, 0xB85B, prLVT}, // Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH + {0xB85C, 0xB85C, prLV}, // Lo HANGUL SYLLABLE RO + {0xB85D, 0xB877, prLVT}, // Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH + {0xB878, 0xB878, prLV}, // Lo HANGUL SYLLABLE RWA + {0xB879, 0xB893, prLVT}, // Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH + {0xB894, 0xB894, prLV}, // Lo HANGUL SYLLABLE RWAE + {0xB895, 0xB8AF, prLVT}, // Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH + {0xB8B0, 0xB8B0, prLV}, // Lo HANGUL SYLLABLE ROE + {0xB8B1, 0xB8CB, prLVT}, // Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH + {0xB8CC, 0xB8CC, prLV}, // Lo HANGUL SYLLABLE RYO + {0xB8CD, 0xB8E7, prLVT}, // Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH + {0xB8E8, 0xB8E8, prLV}, // Lo HANGUL SYLLABLE RU + {0xB8E9, 0xB903, prLVT}, // Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH + {0xB904, 0xB904, prLV}, // Lo HANGUL SYLLABLE RWEO + {0xB905, 0xB91F, prLVT}, // Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH + {0xB920, 0xB920, prLV}, // Lo HANGUL SYLLABLE RWE + {0xB921, 0xB93B, prLVT}, // Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH + {0xB93C, 0xB93C, prLV}, // Lo HANGUL SYLLABLE RWI + {0xB93D, 0xB957, prLVT}, // Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH + {0xB958, 0xB958, prLV}, // Lo HANGUL SYLLABLE RYU + {0xB959, 0xB973, prLVT}, // Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH + {0xB974, 0xB974, prLV}, // Lo HANGUL SYLLABLE REU + {0xB975, 0xB98F, prLVT}, // Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH + {0xB990, 0xB990, prLV}, // Lo HANGUL SYLLABLE RYI + {0xB991, 0xB9AB, prLVT}, // Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH + {0xB9AC, 0xB9AC, prLV}, // Lo HANGUL SYLLABLE RI + {0xB9AD, 0xB9C7, prLVT}, // Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH + {0xB9C8, 0xB9C8, prLV}, // Lo HANGUL SYLLABLE MA + {0xB9C9, 0xB9E3, prLVT}, // Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH + {0xB9E4, 0xB9E4, prLV}, // Lo HANGUL SYLLABLE MAE + {0xB9E5, 0xB9FF, prLVT}, // Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH + {0xBA00, 0xBA00, prLV}, // Lo HANGUL SYLLABLE MYA + {0xBA01, 0xBA1B, prLVT}, // Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH + {0xBA1C, 0xBA1C, prLV}, // Lo HANGUL SYLLABLE MYAE + {0xBA1D, 0xBA37, prLVT}, // Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH + {0xBA38, 0xBA38, prLV}, // Lo HANGUL SYLLABLE MEO + {0xBA39, 0xBA53, prLVT}, // Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH + {0xBA54, 0xBA54, prLV}, // Lo HANGUL SYLLABLE ME + {0xBA55, 0xBA6F, prLVT}, // Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH + {0xBA70, 0xBA70, prLV}, // Lo HANGUL SYLLABLE MYEO + {0xBA71, 0xBA8B, prLVT}, // Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH + {0xBA8C, 0xBA8C, prLV}, // Lo HANGUL SYLLABLE MYE + {0xBA8D, 0xBAA7, prLVT}, // Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH + {0xBAA8, 0xBAA8, prLV}, // Lo HANGUL SYLLABLE MO + {0xBAA9, 0xBAC3, prLVT}, // Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH + {0xBAC4, 0xBAC4, prLV}, // Lo HANGUL SYLLABLE MWA + {0xBAC5, 0xBADF, prLVT}, // Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH + {0xBAE0, 0xBAE0, prLV}, // Lo HANGUL SYLLABLE MWAE + {0xBAE1, 0xBAFB, prLVT}, // Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH + {0xBAFC, 0xBAFC, prLV}, // Lo HANGUL SYLLABLE MOE + {0xBAFD, 0xBB17, prLVT}, // Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH + {0xBB18, 0xBB18, prLV}, // Lo HANGUL SYLLABLE MYO + {0xBB19, 0xBB33, prLVT}, // Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH + {0xBB34, 0xBB34, prLV}, // Lo HANGUL SYLLABLE MU + {0xBB35, 0xBB4F, prLVT}, // Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH + {0xBB50, 0xBB50, prLV}, // Lo HANGUL SYLLABLE MWEO + {0xBB51, 0xBB6B, prLVT}, // Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH + {0xBB6C, 0xBB6C, prLV}, // Lo HANGUL SYLLABLE MWE + {0xBB6D, 0xBB87, prLVT}, // Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH + {0xBB88, 0xBB88, prLV}, // Lo HANGUL SYLLABLE MWI + {0xBB89, 0xBBA3, prLVT}, // Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH + {0xBBA4, 0xBBA4, prLV}, // Lo HANGUL SYLLABLE MYU + {0xBBA5, 0xBBBF, prLVT}, // Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH + {0xBBC0, 0xBBC0, prLV}, // Lo HANGUL SYLLABLE MEU + {0xBBC1, 0xBBDB, prLVT}, // Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH + {0xBBDC, 0xBBDC, prLV}, // Lo HANGUL SYLLABLE MYI + {0xBBDD, 0xBBF7, prLVT}, // Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH + {0xBBF8, 0xBBF8, prLV}, // Lo HANGUL SYLLABLE MI + {0xBBF9, 0xBC13, prLVT}, // Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH + {0xBC14, 0xBC14, prLV}, // Lo HANGUL SYLLABLE BA + {0xBC15, 0xBC2F, prLVT}, // Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH + {0xBC30, 0xBC30, prLV}, // Lo HANGUL SYLLABLE BAE + {0xBC31, 0xBC4B, prLVT}, // Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH + {0xBC4C, 0xBC4C, prLV}, // Lo HANGUL SYLLABLE BYA + {0xBC4D, 0xBC67, prLVT}, // Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH + {0xBC68, 0xBC68, prLV}, // Lo HANGUL SYLLABLE BYAE + {0xBC69, 0xBC83, prLVT}, // Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH + {0xBC84, 0xBC84, prLV}, // Lo HANGUL SYLLABLE BEO + {0xBC85, 0xBC9F, prLVT}, // Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH + {0xBCA0, 0xBCA0, prLV}, // Lo HANGUL SYLLABLE BE + {0xBCA1, 0xBCBB, prLVT}, // Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH + {0xBCBC, 0xBCBC, prLV}, // Lo HANGUL SYLLABLE BYEO + {0xBCBD, 0xBCD7, prLVT}, // Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH + {0xBCD8, 0xBCD8, prLV}, // Lo HANGUL SYLLABLE BYE + {0xBCD9, 0xBCF3, prLVT}, // Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH + {0xBCF4, 0xBCF4, prLV}, // Lo HANGUL SYLLABLE BO + {0xBCF5, 0xBD0F, prLVT}, // Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH + {0xBD10, 0xBD10, prLV}, // Lo HANGUL SYLLABLE BWA + {0xBD11, 0xBD2B, prLVT}, // Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH + {0xBD2C, 0xBD2C, prLV}, // Lo HANGUL SYLLABLE BWAE + {0xBD2D, 0xBD47, prLVT}, // Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH + {0xBD48, 0xBD48, prLV}, // Lo HANGUL SYLLABLE BOE + {0xBD49, 0xBD63, prLVT}, // Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH + {0xBD64, 0xBD64, prLV}, // Lo HANGUL SYLLABLE BYO + {0xBD65, 0xBD7F, prLVT}, // Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH + {0xBD80, 0xBD80, prLV}, // Lo HANGUL SYLLABLE BU + {0xBD81, 0xBD9B, prLVT}, // Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH + {0xBD9C, 0xBD9C, prLV}, // Lo HANGUL SYLLABLE BWEO + {0xBD9D, 0xBDB7, prLVT}, // Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH + {0xBDB8, 0xBDB8, prLV}, // Lo HANGUL SYLLABLE BWE + {0xBDB9, 0xBDD3, prLVT}, // Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH + {0xBDD4, 0xBDD4, prLV}, // Lo HANGUL SYLLABLE BWI + {0xBDD5, 0xBDEF, prLVT}, // Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH + {0xBDF0, 0xBDF0, prLV}, // Lo HANGUL SYLLABLE BYU + {0xBDF1, 0xBE0B, prLVT}, // Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH + {0xBE0C, 0xBE0C, prLV}, // Lo HANGUL SYLLABLE BEU + {0xBE0D, 0xBE27, prLVT}, // Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH + {0xBE28, 0xBE28, prLV}, // Lo HANGUL SYLLABLE BYI + {0xBE29, 0xBE43, prLVT}, // Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH + {0xBE44, 0xBE44, prLV}, // Lo HANGUL SYLLABLE BI + {0xBE45, 0xBE5F, prLVT}, // Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH + {0xBE60, 0xBE60, prLV}, // Lo HANGUL SYLLABLE BBA + {0xBE61, 0xBE7B, prLVT}, // Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH + {0xBE7C, 0xBE7C, prLV}, // Lo HANGUL SYLLABLE BBAE + {0xBE7D, 0xBE97, prLVT}, // Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH + {0xBE98, 0xBE98, prLV}, // Lo HANGUL SYLLABLE BBYA + {0xBE99, 0xBEB3, prLVT}, // Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH + {0xBEB4, 0xBEB4, prLV}, // Lo HANGUL SYLLABLE BBYAE + {0xBEB5, 0xBECF, prLVT}, // Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH + {0xBED0, 0xBED0, prLV}, // Lo HANGUL SYLLABLE BBEO + {0xBED1, 0xBEEB, prLVT}, // Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH + {0xBEEC, 0xBEEC, prLV}, // Lo HANGUL SYLLABLE BBE + {0xBEED, 0xBF07, prLVT}, // Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH + {0xBF08, 0xBF08, prLV}, // Lo HANGUL SYLLABLE BBYEO + {0xBF09, 0xBF23, prLVT}, // Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH + {0xBF24, 0xBF24, prLV}, // Lo HANGUL SYLLABLE BBYE + {0xBF25, 0xBF3F, prLVT}, // Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH + {0xBF40, 0xBF40, prLV}, // Lo HANGUL SYLLABLE BBO + {0xBF41, 0xBF5B, prLVT}, // Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH + {0xBF5C, 0xBF5C, prLV}, // Lo HANGUL SYLLABLE BBWA + {0xBF5D, 0xBF77, prLVT}, // Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH + {0xBF78, 0xBF78, prLV}, // Lo HANGUL SYLLABLE BBWAE + {0xBF79, 0xBF93, prLVT}, // Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH + {0xBF94, 0xBF94, prLV}, // Lo HANGUL SYLLABLE BBOE + {0xBF95, 0xBFAF, prLVT}, // Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH + {0xBFB0, 0xBFB0, prLV}, // Lo HANGUL SYLLABLE BBYO + {0xBFB1, 0xBFCB, prLVT}, // Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH + {0xBFCC, 0xBFCC, prLV}, // Lo HANGUL SYLLABLE BBU + {0xBFCD, 0xBFE7, prLVT}, // Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH + {0xBFE8, 0xBFE8, prLV}, // Lo HANGUL SYLLABLE BBWEO + {0xBFE9, 0xC003, prLVT}, // Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH + {0xC004, 0xC004, prLV}, // Lo HANGUL SYLLABLE BBWE + {0xC005, 0xC01F, prLVT}, // Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH + {0xC020, 0xC020, prLV}, // Lo HANGUL SYLLABLE BBWI + {0xC021, 0xC03B, prLVT}, // Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH + {0xC03C, 0xC03C, prLV}, // Lo HANGUL SYLLABLE BBYU + {0xC03D, 0xC057, prLVT}, // Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH + {0xC058, 0xC058, prLV}, // Lo HANGUL SYLLABLE BBEU + {0xC059, 0xC073, prLVT}, // Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH + {0xC074, 0xC074, prLV}, // Lo HANGUL SYLLABLE BBYI + {0xC075, 0xC08F, prLVT}, // Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH + {0xC090, 0xC090, prLV}, // Lo HANGUL SYLLABLE BBI + {0xC091, 0xC0AB, prLVT}, // Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH + {0xC0AC, 0xC0AC, prLV}, // Lo HANGUL SYLLABLE SA + {0xC0AD, 0xC0C7, prLVT}, // Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH + {0xC0C8, 0xC0C8, prLV}, // Lo HANGUL SYLLABLE SAE + {0xC0C9, 0xC0E3, prLVT}, // Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH + {0xC0E4, 0xC0E4, prLV}, // Lo HANGUL SYLLABLE SYA + {0xC0E5, 0xC0FF, prLVT}, // Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH + {0xC100, 0xC100, prLV}, // Lo HANGUL SYLLABLE SYAE + {0xC101, 0xC11B, prLVT}, // Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH + {0xC11C, 0xC11C, prLV}, // Lo HANGUL SYLLABLE SEO + {0xC11D, 0xC137, prLVT}, // Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH + {0xC138, 0xC138, prLV}, // Lo HANGUL SYLLABLE SE + {0xC139, 0xC153, prLVT}, // Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH + {0xC154, 0xC154, prLV}, // Lo HANGUL SYLLABLE SYEO + {0xC155, 0xC16F, prLVT}, // Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH + {0xC170, 0xC170, prLV}, // Lo HANGUL SYLLABLE SYE + {0xC171, 0xC18B, prLVT}, // Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH + {0xC18C, 0xC18C, prLV}, // Lo HANGUL SYLLABLE SO + {0xC18D, 0xC1A7, prLVT}, // Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH + {0xC1A8, 0xC1A8, prLV}, // Lo HANGUL SYLLABLE SWA + {0xC1A9, 0xC1C3, prLVT}, // Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH + {0xC1C4, 0xC1C4, prLV}, // Lo HANGUL SYLLABLE SWAE + {0xC1C5, 0xC1DF, prLVT}, // Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH + {0xC1E0, 0xC1E0, prLV}, // Lo HANGUL SYLLABLE SOE + {0xC1E1, 0xC1FB, prLVT}, // Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH + {0xC1FC, 0xC1FC, prLV}, // Lo HANGUL SYLLABLE SYO + {0xC1FD, 0xC217, prLVT}, // Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH + {0xC218, 0xC218, prLV}, // Lo HANGUL SYLLABLE SU + {0xC219, 0xC233, prLVT}, // Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH + {0xC234, 0xC234, prLV}, // Lo HANGUL SYLLABLE SWEO + {0xC235, 0xC24F, prLVT}, // Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH + {0xC250, 0xC250, prLV}, // Lo HANGUL SYLLABLE SWE + {0xC251, 0xC26B, prLVT}, // Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH + {0xC26C, 0xC26C, prLV}, // Lo HANGUL SYLLABLE SWI + {0xC26D, 0xC287, prLVT}, // Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH + {0xC288, 0xC288, prLV}, // Lo HANGUL SYLLABLE SYU + {0xC289, 0xC2A3, prLVT}, // Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH + {0xC2A4, 0xC2A4, prLV}, // Lo HANGUL SYLLABLE SEU + {0xC2A5, 0xC2BF, prLVT}, // Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH + {0xC2C0, 0xC2C0, prLV}, // Lo HANGUL SYLLABLE SYI + {0xC2C1, 0xC2DB, prLVT}, // Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH + {0xC2DC, 0xC2DC, prLV}, // Lo HANGUL SYLLABLE SI + {0xC2DD, 0xC2F7, prLVT}, // Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH + {0xC2F8, 0xC2F8, prLV}, // Lo HANGUL SYLLABLE SSA + {0xC2F9, 0xC313, prLVT}, // Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH + {0xC314, 0xC314, prLV}, // Lo HANGUL SYLLABLE SSAE + {0xC315, 0xC32F, prLVT}, // Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH + {0xC330, 0xC330, prLV}, // Lo HANGUL SYLLABLE SSYA + {0xC331, 0xC34B, prLVT}, // Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH + {0xC34C, 0xC34C, prLV}, // Lo HANGUL SYLLABLE SSYAE + {0xC34D, 0xC367, prLVT}, // Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH + {0xC368, 0xC368, prLV}, // Lo HANGUL SYLLABLE SSEO + {0xC369, 0xC383, prLVT}, // Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH + {0xC384, 0xC384, prLV}, // Lo HANGUL SYLLABLE SSE + {0xC385, 0xC39F, prLVT}, // Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH + {0xC3A0, 0xC3A0, prLV}, // Lo HANGUL SYLLABLE SSYEO + {0xC3A1, 0xC3BB, prLVT}, // Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH + {0xC3BC, 0xC3BC, prLV}, // Lo HANGUL SYLLABLE SSYE + {0xC3BD, 0xC3D7, prLVT}, // Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH + {0xC3D8, 0xC3D8, prLV}, // Lo HANGUL SYLLABLE SSO + {0xC3D9, 0xC3F3, prLVT}, // Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH + {0xC3F4, 0xC3F4, prLV}, // Lo HANGUL SYLLABLE SSWA + {0xC3F5, 0xC40F, prLVT}, // Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH + {0xC410, 0xC410, prLV}, // Lo HANGUL SYLLABLE SSWAE + {0xC411, 0xC42B, prLVT}, // Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH + {0xC42C, 0xC42C, prLV}, // Lo HANGUL SYLLABLE SSOE + {0xC42D, 0xC447, prLVT}, // Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH + {0xC448, 0xC448, prLV}, // Lo HANGUL SYLLABLE SSYO + {0xC449, 0xC463, prLVT}, // Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH + {0xC464, 0xC464, prLV}, // Lo HANGUL SYLLABLE SSU + {0xC465, 0xC47F, prLVT}, // Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH + {0xC480, 0xC480, prLV}, // Lo HANGUL SYLLABLE SSWEO + {0xC481, 0xC49B, prLVT}, // Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH + {0xC49C, 0xC49C, prLV}, // Lo HANGUL SYLLABLE SSWE + {0xC49D, 0xC4B7, prLVT}, // Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH + {0xC4B8, 0xC4B8, prLV}, // Lo HANGUL SYLLABLE SSWI + {0xC4B9, 0xC4D3, prLVT}, // Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH + {0xC4D4, 0xC4D4, prLV}, // Lo HANGUL SYLLABLE SSYU + {0xC4D5, 0xC4EF, prLVT}, // Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH + {0xC4F0, 0xC4F0, prLV}, // Lo HANGUL SYLLABLE SSEU + {0xC4F1, 0xC50B, prLVT}, // Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH + {0xC50C, 0xC50C, prLV}, // Lo HANGUL SYLLABLE SSYI + {0xC50D, 0xC527, prLVT}, // Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH + {0xC528, 0xC528, prLV}, // Lo HANGUL SYLLABLE SSI + {0xC529, 0xC543, prLVT}, // Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH + {0xC544, 0xC544, prLV}, // Lo HANGUL SYLLABLE A + {0xC545, 0xC55F, prLVT}, // Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH + {0xC560, 0xC560, prLV}, // Lo HANGUL SYLLABLE AE + {0xC561, 0xC57B, prLVT}, // Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH + {0xC57C, 0xC57C, prLV}, // Lo HANGUL SYLLABLE YA + {0xC57D, 0xC597, prLVT}, // Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH + {0xC598, 0xC598, prLV}, // Lo HANGUL SYLLABLE YAE + {0xC599, 0xC5B3, prLVT}, // Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH + {0xC5B4, 0xC5B4, prLV}, // Lo HANGUL SYLLABLE EO + {0xC5B5, 0xC5CF, prLVT}, // Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH + {0xC5D0, 0xC5D0, prLV}, // Lo HANGUL SYLLABLE E + {0xC5D1, 0xC5EB, prLVT}, // Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH + {0xC5EC, 0xC5EC, prLV}, // Lo HANGUL SYLLABLE YEO + {0xC5ED, 0xC607, prLVT}, // Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH + {0xC608, 0xC608, prLV}, // Lo HANGUL SYLLABLE YE + {0xC609, 0xC623, prLVT}, // Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH + {0xC624, 0xC624, prLV}, // Lo HANGUL SYLLABLE O + {0xC625, 0xC63F, prLVT}, // Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH + {0xC640, 0xC640, prLV}, // Lo HANGUL SYLLABLE WA + {0xC641, 0xC65B, prLVT}, // Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH + {0xC65C, 0xC65C, prLV}, // Lo HANGUL SYLLABLE WAE + {0xC65D, 0xC677, prLVT}, // Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH + {0xC678, 0xC678, prLV}, // Lo HANGUL SYLLABLE OE + {0xC679, 0xC693, prLVT}, // Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH + {0xC694, 0xC694, prLV}, // Lo HANGUL SYLLABLE YO + {0xC695, 0xC6AF, prLVT}, // Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH + {0xC6B0, 0xC6B0, prLV}, // Lo HANGUL SYLLABLE U + {0xC6B1, 0xC6CB, prLVT}, // Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH + {0xC6CC, 0xC6CC, prLV}, // Lo HANGUL SYLLABLE WEO + {0xC6CD, 0xC6E7, prLVT}, // Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH + {0xC6E8, 0xC6E8, prLV}, // Lo HANGUL SYLLABLE WE + {0xC6E9, 0xC703, prLVT}, // Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH + {0xC704, 0xC704, prLV}, // Lo HANGUL SYLLABLE WI + {0xC705, 0xC71F, prLVT}, // Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH + {0xC720, 0xC720, prLV}, // Lo HANGUL SYLLABLE YU + {0xC721, 0xC73B, prLVT}, // Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH + {0xC73C, 0xC73C, prLV}, // Lo HANGUL SYLLABLE EU + {0xC73D, 0xC757, prLVT}, // Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH + {0xC758, 0xC758, prLV}, // Lo HANGUL SYLLABLE YI + {0xC759, 0xC773, prLVT}, // Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH + {0xC774, 0xC774, prLV}, // Lo HANGUL SYLLABLE I + {0xC775, 0xC78F, prLVT}, // Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH + {0xC790, 0xC790, prLV}, // Lo HANGUL SYLLABLE JA + {0xC791, 0xC7AB, prLVT}, // Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH + {0xC7AC, 0xC7AC, prLV}, // Lo HANGUL SYLLABLE JAE + {0xC7AD, 0xC7C7, prLVT}, // Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH + {0xC7C8, 0xC7C8, prLV}, // Lo HANGUL SYLLABLE JYA + {0xC7C9, 0xC7E3, prLVT}, // Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH + {0xC7E4, 0xC7E4, prLV}, // Lo HANGUL SYLLABLE JYAE + {0xC7E5, 0xC7FF, prLVT}, // Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH + {0xC800, 0xC800, prLV}, // Lo HANGUL SYLLABLE JEO + {0xC801, 0xC81B, prLVT}, // Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH + {0xC81C, 0xC81C, prLV}, // Lo HANGUL SYLLABLE JE + {0xC81D, 0xC837, prLVT}, // Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH + {0xC838, 0xC838, prLV}, // Lo HANGUL SYLLABLE JYEO + {0xC839, 0xC853, prLVT}, // Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH + {0xC854, 0xC854, prLV}, // Lo HANGUL SYLLABLE JYE + {0xC855, 0xC86F, prLVT}, // Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH + {0xC870, 0xC870, prLV}, // Lo HANGUL SYLLABLE JO + {0xC871, 0xC88B, prLVT}, // Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH + {0xC88C, 0xC88C, prLV}, // Lo HANGUL SYLLABLE JWA + {0xC88D, 0xC8A7, prLVT}, // Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH + {0xC8A8, 0xC8A8, prLV}, // Lo HANGUL SYLLABLE JWAE + {0xC8A9, 0xC8C3, prLVT}, // Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH + {0xC8C4, 0xC8C4, prLV}, // Lo HANGUL SYLLABLE JOE + {0xC8C5, 0xC8DF, prLVT}, // Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH + {0xC8E0, 0xC8E0, prLV}, // Lo HANGUL SYLLABLE JYO + {0xC8E1, 0xC8FB, prLVT}, // Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH + {0xC8FC, 0xC8FC, prLV}, // Lo HANGUL SYLLABLE JU + {0xC8FD, 0xC917, prLVT}, // Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH + {0xC918, 0xC918, prLV}, // Lo HANGUL SYLLABLE JWEO + {0xC919, 0xC933, prLVT}, // Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH + {0xC934, 0xC934, prLV}, // Lo HANGUL SYLLABLE JWE + {0xC935, 0xC94F, prLVT}, // Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH + {0xC950, 0xC950, prLV}, // Lo HANGUL SYLLABLE JWI + {0xC951, 0xC96B, prLVT}, // Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH + {0xC96C, 0xC96C, prLV}, // Lo HANGUL SYLLABLE JYU + {0xC96D, 0xC987, prLVT}, // Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH + {0xC988, 0xC988, prLV}, // Lo HANGUL SYLLABLE JEU + {0xC989, 0xC9A3, prLVT}, // Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH + {0xC9A4, 0xC9A4, prLV}, // Lo HANGUL SYLLABLE JYI + {0xC9A5, 0xC9BF, prLVT}, // Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH + {0xC9C0, 0xC9C0, prLV}, // Lo HANGUL SYLLABLE JI + {0xC9C1, 0xC9DB, prLVT}, // Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH + {0xC9DC, 0xC9DC, prLV}, // Lo HANGUL SYLLABLE JJA + {0xC9DD, 0xC9F7, prLVT}, // Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH + {0xC9F8, 0xC9F8, prLV}, // Lo HANGUL SYLLABLE JJAE + {0xC9F9, 0xCA13, prLVT}, // Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH + {0xCA14, 0xCA14, prLV}, // Lo HANGUL SYLLABLE JJYA + {0xCA15, 0xCA2F, prLVT}, // Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH + {0xCA30, 0xCA30, prLV}, // Lo HANGUL SYLLABLE JJYAE + {0xCA31, 0xCA4B, prLVT}, // Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH + {0xCA4C, 0xCA4C, prLV}, // Lo HANGUL SYLLABLE JJEO + {0xCA4D, 0xCA67, prLVT}, // Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH + {0xCA68, 0xCA68, prLV}, // Lo HANGUL SYLLABLE JJE + {0xCA69, 0xCA83, prLVT}, // Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH + {0xCA84, 0xCA84, prLV}, // Lo HANGUL SYLLABLE JJYEO + {0xCA85, 0xCA9F, prLVT}, // Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH + {0xCAA0, 0xCAA0, prLV}, // Lo HANGUL SYLLABLE JJYE + {0xCAA1, 0xCABB, prLVT}, // Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH + {0xCABC, 0xCABC, prLV}, // Lo HANGUL SYLLABLE JJO + {0xCABD, 0xCAD7, prLVT}, // Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH + {0xCAD8, 0xCAD8, prLV}, // Lo HANGUL SYLLABLE JJWA + {0xCAD9, 0xCAF3, prLVT}, // Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH + {0xCAF4, 0xCAF4, prLV}, // Lo HANGUL SYLLABLE JJWAE + {0xCAF5, 0xCB0F, prLVT}, // Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH + {0xCB10, 0xCB10, prLV}, // Lo HANGUL SYLLABLE JJOE + {0xCB11, 0xCB2B, prLVT}, // Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH + {0xCB2C, 0xCB2C, prLV}, // Lo HANGUL SYLLABLE JJYO + {0xCB2D, 0xCB47, prLVT}, // Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH + {0xCB48, 0xCB48, prLV}, // Lo HANGUL SYLLABLE JJU + {0xCB49, 0xCB63, prLVT}, // Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH + {0xCB64, 0xCB64, prLV}, // Lo HANGUL SYLLABLE JJWEO + {0xCB65, 0xCB7F, prLVT}, // Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH + {0xCB80, 0xCB80, prLV}, // Lo HANGUL SYLLABLE JJWE + {0xCB81, 0xCB9B, prLVT}, // Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH + {0xCB9C, 0xCB9C, prLV}, // Lo HANGUL SYLLABLE JJWI + {0xCB9D, 0xCBB7, prLVT}, // Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH + {0xCBB8, 0xCBB8, prLV}, // Lo HANGUL SYLLABLE JJYU + {0xCBB9, 0xCBD3, prLVT}, // Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH + {0xCBD4, 0xCBD4, prLV}, // Lo HANGUL SYLLABLE JJEU + {0xCBD5, 0xCBEF, prLVT}, // Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH + {0xCBF0, 0xCBF0, prLV}, // Lo HANGUL SYLLABLE JJYI + {0xCBF1, 0xCC0B, prLVT}, // Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH + {0xCC0C, 0xCC0C, prLV}, // Lo HANGUL SYLLABLE JJI + {0xCC0D, 0xCC27, prLVT}, // Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH + {0xCC28, 0xCC28, prLV}, // Lo HANGUL SYLLABLE CA + {0xCC29, 0xCC43, prLVT}, // Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH + {0xCC44, 0xCC44, prLV}, // Lo HANGUL SYLLABLE CAE + {0xCC45, 0xCC5F, prLVT}, // Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH + {0xCC60, 0xCC60, prLV}, // Lo HANGUL SYLLABLE CYA + {0xCC61, 0xCC7B, prLVT}, // Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH + {0xCC7C, 0xCC7C, prLV}, // Lo HANGUL SYLLABLE CYAE + {0xCC7D, 0xCC97, prLVT}, // Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH + {0xCC98, 0xCC98, prLV}, // Lo HANGUL SYLLABLE CEO + {0xCC99, 0xCCB3, prLVT}, // Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH + {0xCCB4, 0xCCB4, prLV}, // Lo HANGUL SYLLABLE CE + {0xCCB5, 0xCCCF, prLVT}, // Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH + {0xCCD0, 0xCCD0, prLV}, // Lo HANGUL SYLLABLE CYEO + {0xCCD1, 0xCCEB, prLVT}, // Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH + {0xCCEC, 0xCCEC, prLV}, // Lo HANGUL SYLLABLE CYE + {0xCCED, 0xCD07, prLVT}, // Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH + {0xCD08, 0xCD08, prLV}, // Lo HANGUL SYLLABLE CO + {0xCD09, 0xCD23, prLVT}, // Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH + {0xCD24, 0xCD24, prLV}, // Lo HANGUL SYLLABLE CWA + {0xCD25, 0xCD3F, prLVT}, // Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH + {0xCD40, 0xCD40, prLV}, // Lo HANGUL SYLLABLE CWAE + {0xCD41, 0xCD5B, prLVT}, // Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH + {0xCD5C, 0xCD5C, prLV}, // Lo HANGUL SYLLABLE COE + {0xCD5D, 0xCD77, prLVT}, // Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH + {0xCD78, 0xCD78, prLV}, // Lo HANGUL SYLLABLE CYO + {0xCD79, 0xCD93, prLVT}, // Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH + {0xCD94, 0xCD94, prLV}, // Lo HANGUL SYLLABLE CU + {0xCD95, 0xCDAF, prLVT}, // Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH + {0xCDB0, 0xCDB0, prLV}, // Lo HANGUL SYLLABLE CWEO + {0xCDB1, 0xCDCB, prLVT}, // Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH + {0xCDCC, 0xCDCC, prLV}, // Lo HANGUL SYLLABLE CWE + {0xCDCD, 0xCDE7, prLVT}, // Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH + {0xCDE8, 0xCDE8, prLV}, // Lo HANGUL SYLLABLE CWI + {0xCDE9, 0xCE03, prLVT}, // Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH + {0xCE04, 0xCE04, prLV}, // Lo HANGUL SYLLABLE CYU + {0xCE05, 0xCE1F, prLVT}, // Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH + {0xCE20, 0xCE20, prLV}, // Lo HANGUL SYLLABLE CEU + {0xCE21, 0xCE3B, prLVT}, // Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH + {0xCE3C, 0xCE3C, prLV}, // Lo HANGUL SYLLABLE CYI + {0xCE3D, 0xCE57, prLVT}, // Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH + {0xCE58, 0xCE58, prLV}, // Lo HANGUL SYLLABLE CI + {0xCE59, 0xCE73, prLVT}, // Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH + {0xCE74, 0xCE74, prLV}, // Lo HANGUL SYLLABLE KA + {0xCE75, 0xCE8F, prLVT}, // Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH + {0xCE90, 0xCE90, prLV}, // Lo HANGUL SYLLABLE KAE + {0xCE91, 0xCEAB, prLVT}, // Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH + {0xCEAC, 0xCEAC, prLV}, // Lo HANGUL SYLLABLE KYA + {0xCEAD, 0xCEC7, prLVT}, // Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH + {0xCEC8, 0xCEC8, prLV}, // Lo HANGUL SYLLABLE KYAE + {0xCEC9, 0xCEE3, prLVT}, // Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH + {0xCEE4, 0xCEE4, prLV}, // Lo HANGUL SYLLABLE KEO + {0xCEE5, 0xCEFF, prLVT}, // Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH + {0xCF00, 0xCF00, prLV}, // Lo HANGUL SYLLABLE KE + {0xCF01, 0xCF1B, prLVT}, // Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH + {0xCF1C, 0xCF1C, prLV}, // Lo HANGUL SYLLABLE KYEO + {0xCF1D, 0xCF37, prLVT}, // Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH + {0xCF38, 0xCF38, prLV}, // Lo HANGUL SYLLABLE KYE + {0xCF39, 0xCF53, prLVT}, // Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH + {0xCF54, 0xCF54, prLV}, // Lo HANGUL SYLLABLE KO + {0xCF55, 0xCF6F, prLVT}, // Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH + {0xCF70, 0xCF70, prLV}, // Lo HANGUL SYLLABLE KWA + {0xCF71, 0xCF8B, prLVT}, // Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH + {0xCF8C, 0xCF8C, prLV}, // Lo HANGUL SYLLABLE KWAE + {0xCF8D, 0xCFA7, prLVT}, // Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH + {0xCFA8, 0xCFA8, prLV}, // Lo HANGUL SYLLABLE KOE + {0xCFA9, 0xCFC3, prLVT}, // Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH + {0xCFC4, 0xCFC4, prLV}, // Lo HANGUL SYLLABLE KYO + {0xCFC5, 0xCFDF, prLVT}, // Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH + {0xCFE0, 0xCFE0, prLV}, // Lo HANGUL SYLLABLE KU + {0xCFE1, 0xCFFB, prLVT}, // Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH + {0xCFFC, 0xCFFC, prLV}, // Lo HANGUL SYLLABLE KWEO + {0xCFFD, 0xD017, prLVT}, // Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH + {0xD018, 0xD018, prLV}, // Lo HANGUL SYLLABLE KWE + {0xD019, 0xD033, prLVT}, // Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH + {0xD034, 0xD034, prLV}, // Lo HANGUL SYLLABLE KWI + {0xD035, 0xD04F, prLVT}, // Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH + {0xD050, 0xD050, prLV}, // Lo HANGUL SYLLABLE KYU + {0xD051, 0xD06B, prLVT}, // Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH + {0xD06C, 0xD06C, prLV}, // Lo HANGUL SYLLABLE KEU + {0xD06D, 0xD087, prLVT}, // Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH + {0xD088, 0xD088, prLV}, // Lo HANGUL SYLLABLE KYI + {0xD089, 0xD0A3, prLVT}, // Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH + {0xD0A4, 0xD0A4, prLV}, // Lo HANGUL SYLLABLE KI + {0xD0A5, 0xD0BF, prLVT}, // Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH + {0xD0C0, 0xD0C0, prLV}, // Lo HANGUL SYLLABLE TA + {0xD0C1, 0xD0DB, prLVT}, // Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH + {0xD0DC, 0xD0DC, prLV}, // Lo HANGUL SYLLABLE TAE + {0xD0DD, 0xD0F7, prLVT}, // Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH + {0xD0F8, 0xD0F8, prLV}, // Lo HANGUL SYLLABLE TYA + {0xD0F9, 0xD113, prLVT}, // Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH + {0xD114, 0xD114, prLV}, // Lo HANGUL SYLLABLE TYAE + {0xD115, 0xD12F, prLVT}, // Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH + {0xD130, 0xD130, prLV}, // Lo HANGUL SYLLABLE TEO + {0xD131, 0xD14B, prLVT}, // Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH + {0xD14C, 0xD14C, prLV}, // Lo HANGUL SYLLABLE TE + {0xD14D, 0xD167, prLVT}, // Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH + {0xD168, 0xD168, prLV}, // Lo HANGUL SYLLABLE TYEO + {0xD169, 0xD183, prLVT}, // Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH + {0xD184, 0xD184, prLV}, // Lo HANGUL SYLLABLE TYE + {0xD185, 0xD19F, prLVT}, // Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH + {0xD1A0, 0xD1A0, prLV}, // Lo HANGUL SYLLABLE TO + {0xD1A1, 0xD1BB, prLVT}, // Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH + {0xD1BC, 0xD1BC, prLV}, // Lo HANGUL SYLLABLE TWA + {0xD1BD, 0xD1D7, prLVT}, // Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH + {0xD1D8, 0xD1D8, prLV}, // Lo HANGUL SYLLABLE TWAE + {0xD1D9, 0xD1F3, prLVT}, // Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH + {0xD1F4, 0xD1F4, prLV}, // Lo HANGUL SYLLABLE TOE + {0xD1F5, 0xD20F, prLVT}, // Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH + {0xD210, 0xD210, prLV}, // Lo HANGUL SYLLABLE TYO + {0xD211, 0xD22B, prLVT}, // Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH + {0xD22C, 0xD22C, prLV}, // Lo HANGUL SYLLABLE TU + {0xD22D, 0xD247, prLVT}, // Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH + {0xD248, 0xD248, prLV}, // Lo HANGUL SYLLABLE TWEO + {0xD249, 0xD263, prLVT}, // Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH + {0xD264, 0xD264, prLV}, // Lo HANGUL SYLLABLE TWE + {0xD265, 0xD27F, prLVT}, // Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH + {0xD280, 0xD280, prLV}, // Lo HANGUL SYLLABLE TWI + {0xD281, 0xD29B, prLVT}, // Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH + {0xD29C, 0xD29C, prLV}, // Lo HANGUL SYLLABLE TYU + {0xD29D, 0xD2B7, prLVT}, // Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH + {0xD2B8, 0xD2B8, prLV}, // Lo HANGUL SYLLABLE TEU + {0xD2B9, 0xD2D3, prLVT}, // Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH + {0xD2D4, 0xD2D4, prLV}, // Lo HANGUL SYLLABLE TYI + {0xD2D5, 0xD2EF, prLVT}, // Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH + {0xD2F0, 0xD2F0, prLV}, // Lo HANGUL SYLLABLE TI + {0xD2F1, 0xD30B, prLVT}, // Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH + {0xD30C, 0xD30C, prLV}, // Lo HANGUL SYLLABLE PA + {0xD30D, 0xD327, prLVT}, // Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH + {0xD328, 0xD328, prLV}, // Lo HANGUL SYLLABLE PAE + {0xD329, 0xD343, prLVT}, // Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH + {0xD344, 0xD344, prLV}, // Lo HANGUL SYLLABLE PYA + {0xD345, 0xD35F, prLVT}, // Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH + {0xD360, 0xD360, prLV}, // Lo HANGUL SYLLABLE PYAE + {0xD361, 0xD37B, prLVT}, // Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH + {0xD37C, 0xD37C, prLV}, // Lo HANGUL SYLLABLE PEO + {0xD37D, 0xD397, prLVT}, // Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH + {0xD398, 0xD398, prLV}, // Lo HANGUL SYLLABLE PE + {0xD399, 0xD3B3, prLVT}, // Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH + {0xD3B4, 0xD3B4, prLV}, // Lo HANGUL SYLLABLE PYEO + {0xD3B5, 0xD3CF, prLVT}, // Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH + {0xD3D0, 0xD3D0, prLV}, // Lo HANGUL SYLLABLE PYE + {0xD3D1, 0xD3EB, prLVT}, // Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH + {0xD3EC, 0xD3EC, prLV}, // Lo HANGUL SYLLABLE PO + {0xD3ED, 0xD407, prLVT}, // Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH + {0xD408, 0xD408, prLV}, // Lo HANGUL SYLLABLE PWA + {0xD409, 0xD423, prLVT}, // Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH + {0xD424, 0xD424, prLV}, // Lo HANGUL SYLLABLE PWAE + {0xD425, 0xD43F, prLVT}, // Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH + {0xD440, 0xD440, prLV}, // Lo HANGUL SYLLABLE POE + {0xD441, 0xD45B, prLVT}, // Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH + {0xD45C, 0xD45C, prLV}, // Lo HANGUL SYLLABLE PYO + {0xD45D, 0xD477, prLVT}, // Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH + {0xD478, 0xD478, prLV}, // Lo HANGUL SYLLABLE PU + {0xD479, 0xD493, prLVT}, // Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH + {0xD494, 0xD494, prLV}, // Lo HANGUL SYLLABLE PWEO + {0xD495, 0xD4AF, prLVT}, // Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH + {0xD4B0, 0xD4B0, prLV}, // Lo HANGUL SYLLABLE PWE + {0xD4B1, 0xD4CB, prLVT}, // Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH + {0xD4CC, 0xD4CC, prLV}, // Lo HANGUL SYLLABLE PWI + {0xD4CD, 0xD4E7, prLVT}, // Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH + {0xD4E8, 0xD4E8, prLV}, // Lo HANGUL SYLLABLE PYU + {0xD4E9, 0xD503, prLVT}, // Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH + {0xD504, 0xD504, prLV}, // Lo HANGUL SYLLABLE PEU + {0xD505, 0xD51F, prLVT}, // Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH + {0xD520, 0xD520, prLV}, // Lo HANGUL SYLLABLE PYI + {0xD521, 0xD53B, prLVT}, // Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH + {0xD53C, 0xD53C, prLV}, // Lo HANGUL SYLLABLE PI + {0xD53D, 0xD557, prLVT}, // Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH + {0xD558, 0xD558, prLV}, // Lo HANGUL SYLLABLE HA + {0xD559, 0xD573, prLVT}, // Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH + {0xD574, 0xD574, prLV}, // Lo HANGUL SYLLABLE HAE + {0xD575, 0xD58F, prLVT}, // Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH + {0xD590, 0xD590, prLV}, // Lo HANGUL SYLLABLE HYA + {0xD591, 0xD5AB, prLVT}, // Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH + {0xD5AC, 0xD5AC, prLV}, // Lo HANGUL SYLLABLE HYAE + {0xD5AD, 0xD5C7, prLVT}, // Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH + {0xD5C8, 0xD5C8, prLV}, // Lo HANGUL SYLLABLE HEO + {0xD5C9, 0xD5E3, prLVT}, // Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH + {0xD5E4, 0xD5E4, prLV}, // Lo HANGUL SYLLABLE HE + {0xD5E5, 0xD5FF, prLVT}, // Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH + {0xD600, 0xD600, prLV}, // Lo HANGUL SYLLABLE HYEO + {0xD601, 0xD61B, prLVT}, // Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH + {0xD61C, 0xD61C, prLV}, // Lo HANGUL SYLLABLE HYE + {0xD61D, 0xD637, prLVT}, // Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH + {0xD638, 0xD638, prLV}, // Lo HANGUL SYLLABLE HO + {0xD639, 0xD653, prLVT}, // Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH + {0xD654, 0xD654, prLV}, // Lo HANGUL SYLLABLE HWA + {0xD655, 0xD66F, prLVT}, // Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH + {0xD670, 0xD670, prLV}, // Lo HANGUL SYLLABLE HWAE + {0xD671, 0xD68B, prLVT}, // Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH + {0xD68C, 0xD68C, prLV}, // Lo HANGUL SYLLABLE HOE + {0xD68D, 0xD6A7, prLVT}, // Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH + {0xD6A8, 0xD6A8, prLV}, // Lo HANGUL SYLLABLE HYO + {0xD6A9, 0xD6C3, prLVT}, // Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH + {0xD6C4, 0xD6C4, prLV}, // Lo HANGUL SYLLABLE HU + {0xD6C5, 0xD6DF, prLVT}, // Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH + {0xD6E0, 0xD6E0, prLV}, // Lo HANGUL SYLLABLE HWEO + {0xD6E1, 0xD6FB, prLVT}, // Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH + {0xD6FC, 0xD6FC, prLV}, // Lo HANGUL SYLLABLE HWE + {0xD6FD, 0xD717, prLVT}, // Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH + {0xD718, 0xD718, prLV}, // Lo HANGUL SYLLABLE HWI + {0xD719, 0xD733, prLVT}, // Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH + {0xD734, 0xD734, prLV}, // Lo HANGUL SYLLABLE HYU + {0xD735, 0xD74F, prLVT}, // Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH + {0xD750, 0xD750, prLV}, // Lo HANGUL SYLLABLE HEU + {0xD751, 0xD76B, prLVT}, // Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH + {0xD76C, 0xD76C, prLV}, // Lo HANGUL SYLLABLE HYI + {0xD76D, 0xD787, prLVT}, // Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH + {0xD788, 0xD788, prLV}, // Lo HANGUL SYLLABLE HI + {0xD789, 0xD7A3, prLVT}, // Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH + {0xD7B0, 0xD7C6, prV}, // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E + {0xD7CB, 0xD7FB, prT}, // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH + {0xFB1E, 0xFB1E, prExtend}, // Mn HEBREW POINT JUDEO-SPANISH VARIKA + {0xFE00, 0xFE0F, prExtend}, // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 + {0xFE20, 0xFE2F, prExtend}, // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF + {0xFEFF, 0xFEFF, prControl}, // Cf ZERO WIDTH NO-BREAK SPACE + {0xFF9E, 0xFF9F, prExtend}, // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK + {0xFFF0, 0xFFF8, prControl}, // Cn [9] .. + {0xFFF9, 0xFFFB, prControl}, // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR + {0x101FD, 0x101FD, prExtend}, // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE + {0x102E0, 0x102E0, prExtend}, // Mn COPTIC EPACT THOUSANDS MARK + {0x10376, 0x1037A, prExtend}, // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII + {0x10A01, 0x10A03, prExtend}, // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R + {0x10A05, 0x10A06, prExtend}, // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O + {0x10A0C, 0x10A0F, prExtend}, // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA + {0x10A38, 0x10A3A, prExtend}, // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW + {0x10A3F, 0x10A3F, prExtend}, // Mn KHAROSHTHI VIRAMA + {0x10AE5, 0x10AE6, prExtend}, // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW + {0x10D24, 0x10D27, prExtend}, // Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI + {0x10F46, 0x10F50, prExtend}, // Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW + {0x11000, 0x11000, prSpacingMark}, // Mc BRAHMI SIGN CANDRABINDU + {0x11001, 0x11001, prExtend}, // Mn BRAHMI SIGN ANUSVARA + {0x11002, 0x11002, prSpacingMark}, // Mc BRAHMI SIGN VISARGA + {0x11038, 0x11046, prExtend}, // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA + {0x1107F, 0x11081, prExtend}, // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA + {0x11082, 0x11082, prSpacingMark}, // Mc KAITHI SIGN VISARGA + {0x110B0, 0x110B2, prSpacingMark}, // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II + {0x110B3, 0x110B6, prExtend}, // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI + {0x110B7, 0x110B8, prSpacingMark}, // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU + {0x110B9, 0x110BA, prExtend}, // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA + {0x110BD, 0x110BD, prPreprend}, // Cf KAITHI NUMBER SIGN + {0x110CD, 0x110CD, prPreprend}, // Cf KAITHI NUMBER SIGN ABOVE + {0x11100, 0x11102, prExtend}, // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA + {0x11127, 0x1112B, prExtend}, // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU + {0x1112C, 0x1112C, prSpacingMark}, // Mc CHAKMA VOWEL SIGN E + {0x1112D, 0x11134, prExtend}, // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA + {0x11145, 0x11146, prSpacingMark}, // Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI + {0x11173, 0x11173, prExtend}, // Mn MAHAJANI SIGN NUKTA + {0x11180, 0x11181, prExtend}, // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA + {0x11182, 0x11182, prSpacingMark}, // Mc SHARADA SIGN VISARGA + {0x111B3, 0x111B5, prSpacingMark}, // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II + {0x111B6, 0x111BE, prExtend}, // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O + {0x111BF, 0x111C0, prSpacingMark}, // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA + {0x111C2, 0x111C3, prPreprend}, // Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA + {0x111C9, 0x111CC, prExtend}, // Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK + {0x1122C, 0x1122E, prSpacingMark}, // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II + {0x1122F, 0x11231, prExtend}, // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI + {0x11232, 0x11233, prSpacingMark}, // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU + {0x11234, 0x11234, prExtend}, // Mn KHOJKI SIGN ANUSVARA + {0x11235, 0x11235, prSpacingMark}, // Mc KHOJKI SIGN VIRAMA + {0x11236, 0x11237, prExtend}, // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA + {0x1123E, 0x1123E, prExtend}, // Mn KHOJKI SIGN SUKUN + {0x112DF, 0x112DF, prExtend}, // Mn KHUDAWADI SIGN ANUSVARA + {0x112E0, 0x112E2, prSpacingMark}, // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II + {0x112E3, 0x112EA, prExtend}, // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA + {0x11300, 0x11301, prExtend}, // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU + {0x11302, 0x11303, prSpacingMark}, // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA + {0x1133B, 0x1133C, prExtend}, // Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA + {0x1133E, 0x1133E, prExtend}, // Mc GRANTHA VOWEL SIGN AA + {0x1133F, 0x1133F, prSpacingMark}, // Mc GRANTHA VOWEL SIGN I + {0x11340, 0x11340, prExtend}, // Mn GRANTHA VOWEL SIGN II + {0x11341, 0x11344, prSpacingMark}, // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR + {0x11347, 0x11348, prSpacingMark}, // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI + {0x1134B, 0x1134D, prSpacingMark}, // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA + {0x11357, 0x11357, prExtend}, // Mc GRANTHA AU LENGTH MARK + {0x11362, 0x11363, prSpacingMark}, // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL + {0x11366, 0x1136C, prExtend}, // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX + {0x11370, 0x11374, prExtend}, // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA + {0x11435, 0x11437, prSpacingMark}, // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II + {0x11438, 0x1143F, prExtend}, // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI + {0x11440, 0x11441, prSpacingMark}, // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU + {0x11442, 0x11444, prExtend}, // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA + {0x11445, 0x11445, prSpacingMark}, // Mc NEWA SIGN VISARGA + {0x11446, 0x11446, prExtend}, // Mn NEWA SIGN NUKTA + {0x1145E, 0x1145E, prExtend}, // Mn NEWA SANDHI MARK + {0x114B0, 0x114B0, prExtend}, // Mc TIRHUTA VOWEL SIGN AA + {0x114B1, 0x114B2, prSpacingMark}, // Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II + {0x114B3, 0x114B8, prExtend}, // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL + {0x114B9, 0x114B9, prSpacingMark}, // Mc TIRHUTA VOWEL SIGN E + {0x114BA, 0x114BA, prExtend}, // Mn TIRHUTA VOWEL SIGN SHORT E + {0x114BB, 0x114BC, prSpacingMark}, // Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O + {0x114BD, 0x114BD, prExtend}, // Mc TIRHUTA VOWEL SIGN SHORT O + {0x114BE, 0x114BE, prSpacingMark}, // Mc TIRHUTA VOWEL SIGN AU + {0x114BF, 0x114C0, prExtend}, // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA + {0x114C1, 0x114C1, prSpacingMark}, // Mc TIRHUTA SIGN VISARGA + {0x114C2, 0x114C3, prExtend}, // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA + {0x115AF, 0x115AF, prExtend}, // Mc SIDDHAM VOWEL SIGN AA + {0x115B0, 0x115B1, prSpacingMark}, // Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II + {0x115B2, 0x115B5, prExtend}, // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR + {0x115B8, 0x115BB, prSpacingMark}, // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU + {0x115BC, 0x115BD, prExtend}, // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA + {0x115BE, 0x115BE, prSpacingMark}, // Mc SIDDHAM SIGN VISARGA + {0x115BF, 0x115C0, prExtend}, // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA + {0x115DC, 0x115DD, prExtend}, // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU + {0x11630, 0x11632, prSpacingMark}, // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II + {0x11633, 0x1163A, prExtend}, // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI + {0x1163B, 0x1163C, prSpacingMark}, // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU + {0x1163D, 0x1163D, prExtend}, // Mn MODI SIGN ANUSVARA + {0x1163E, 0x1163E, prSpacingMark}, // Mc MODI SIGN VISARGA + {0x1163F, 0x11640, prExtend}, // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA + {0x116AB, 0x116AB, prExtend}, // Mn TAKRI SIGN ANUSVARA + {0x116AC, 0x116AC, prSpacingMark}, // Mc TAKRI SIGN VISARGA + {0x116AD, 0x116AD, prExtend}, // Mn TAKRI VOWEL SIGN AA + {0x116AE, 0x116AF, prSpacingMark}, // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II + {0x116B0, 0x116B5, prExtend}, // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU + {0x116B6, 0x116B6, prSpacingMark}, // Mc TAKRI SIGN VIRAMA + {0x116B7, 0x116B7, prExtend}, // Mn TAKRI SIGN NUKTA + {0x1171D, 0x1171F, prExtend}, // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA + {0x11720, 0x11721, prSpacingMark}, // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA + {0x11722, 0x11725, prExtend}, // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU + {0x11726, 0x11726, prSpacingMark}, // Mc AHOM VOWEL SIGN E + {0x11727, 0x1172B, prExtend}, // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER + {0x1182C, 0x1182E, prSpacingMark}, // Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II + {0x1182F, 0x11837, prExtend}, // Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA + {0x11838, 0x11838, prSpacingMark}, // Mc DOGRA SIGN VISARGA + {0x11839, 0x1183A, prExtend}, // Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA + {0x119D1, 0x119D3, prSpacingMark}, // Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II + {0x119D4, 0x119D7, prExtend}, // Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR + {0x119DA, 0x119DB, prExtend}, // Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI + {0x119DC, 0x119DF, prSpacingMark}, // Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA + {0x119E0, 0x119E0, prExtend}, // Mn NANDINAGARI SIGN VIRAMA + {0x119E4, 0x119E4, prSpacingMark}, // Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E + {0x11A01, 0x11A0A, prExtend}, // Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK + {0x11A33, 0x11A38, prExtend}, // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA + {0x11A39, 0x11A39, prSpacingMark}, // Mc ZANABAZAR SQUARE SIGN VISARGA + {0x11A3A, 0x11A3A, prPreprend}, // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA + {0x11A3B, 0x11A3E, prExtend}, // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA + {0x11A47, 0x11A47, prExtend}, // Mn ZANABAZAR SQUARE SUBJOINER + {0x11A51, 0x11A56, prExtend}, // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE + {0x11A57, 0x11A58, prSpacingMark}, // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU + {0x11A59, 0x11A5B, prExtend}, // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK + {0x11A84, 0x11A89, prPreprend}, // Lo [6] SOYOMBO SIGN JIHVAMULIYA..SOYOMBO CLUSTER-INITIAL LETTER SA + {0x11A8A, 0x11A96, prExtend}, // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA + {0x11A97, 0x11A97, prSpacingMark}, // Mc SOYOMBO SIGN VISARGA + {0x11A98, 0x11A99, prExtend}, // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER + {0x11C2F, 0x11C2F, prSpacingMark}, // Mc BHAIKSUKI VOWEL SIGN AA + {0x11C30, 0x11C36, prExtend}, // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L + {0x11C38, 0x11C3D, prExtend}, // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA + {0x11C3E, 0x11C3E, prSpacingMark}, // Mc BHAIKSUKI SIGN VISARGA + {0x11C3F, 0x11C3F, prExtend}, // Mn BHAIKSUKI SIGN VIRAMA + {0x11C92, 0x11CA7, prExtend}, // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA + {0x11CA9, 0x11CA9, prSpacingMark}, // Mc MARCHEN SUBJOINED LETTER YA + {0x11CAA, 0x11CB0, prExtend}, // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA + {0x11CB1, 0x11CB1, prSpacingMark}, // Mc MARCHEN VOWEL SIGN I + {0x11CB2, 0x11CB3, prExtend}, // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E + {0x11CB4, 0x11CB4, prSpacingMark}, // Mc MARCHEN VOWEL SIGN O + {0x11CB5, 0x11CB6, prExtend}, // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU + {0x11D31, 0x11D36, prExtend}, // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R + {0x11D3A, 0x11D3A, prExtend}, // Mn MASARAM GONDI VOWEL SIGN E + {0x11D3C, 0x11D3D, prExtend}, // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O + {0x11D3F, 0x11D45, prExtend}, // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA + {0x11D46, 0x11D46, prPreprend}, // Lo MASARAM GONDI REPHA + {0x11D47, 0x11D47, prExtend}, // Mn MASARAM GONDI RA-KARA + {0x11D8A, 0x11D8E, prSpacingMark}, // Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU + {0x11D90, 0x11D91, prExtend}, // Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI + {0x11D93, 0x11D94, prSpacingMark}, // Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU + {0x11D95, 0x11D95, prExtend}, // Mn GUNJALA GONDI SIGN ANUSVARA + {0x11D96, 0x11D96, prSpacingMark}, // Mc GUNJALA GONDI SIGN VISARGA + {0x11D97, 0x11D97, prExtend}, // Mn GUNJALA GONDI VIRAMA + {0x11EF3, 0x11EF4, prExtend}, // Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U + {0x11EF5, 0x11EF6, prSpacingMark}, // Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O + {0x13430, 0x13438, prControl}, // Cf [9] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT + {0x16AF0, 0x16AF4, prExtend}, // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE + {0x16B30, 0x16B36, prExtend}, // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM + {0x16F4F, 0x16F4F, prExtend}, // Mn MIAO SIGN CONSONANT MODIFIER BAR + {0x16F51, 0x16F87, prSpacingMark}, // Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI + {0x16F8F, 0x16F92, prExtend}, // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW + {0x1BC9D, 0x1BC9E, prExtend}, // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK + {0x1BCA0, 0x1BCA3, prControl}, // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP + {0x1D165, 0x1D165, prExtend}, // Mc MUSICAL SYMBOL COMBINING STEM + {0x1D166, 0x1D166, prSpacingMark}, // Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM + {0x1D167, 0x1D169, prExtend}, // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 + {0x1D16D, 0x1D16D, prSpacingMark}, // Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT + {0x1D16E, 0x1D172, prExtend}, // Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 + {0x1D173, 0x1D17A, prControl}, // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE + {0x1D17B, 0x1D182, prExtend}, // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE + {0x1D185, 0x1D18B, prExtend}, // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE + {0x1D1AA, 0x1D1AD, prExtend}, // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO + {0x1D242, 0x1D244, prExtend}, // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME + {0x1DA00, 0x1DA36, prExtend}, // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN + {0x1DA3B, 0x1DA6C, prExtend}, // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT + {0x1DA75, 0x1DA75, prExtend}, // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS + {0x1DA84, 0x1DA84, prExtend}, // Mn SIGNWRITING LOCATION HEAD NECK + {0x1DA9B, 0x1DA9F, prExtend}, // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 + {0x1DAA1, 0x1DAAF, prExtend}, // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 + {0x1E000, 0x1E006, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE + {0x1E008, 0x1E018, prExtend}, // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU + {0x1E01B, 0x1E021, prExtend}, // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI + {0x1E023, 0x1E024, prExtend}, // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS + {0x1E026, 0x1E02A, prExtend}, // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA + {0x1E130, 0x1E136, prExtend}, // Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D + {0x1E2EC, 0x1E2EF, prExtend}, // Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI + {0x1E8D0, 0x1E8D6, prExtend}, // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS + {0x1E944, 0x1E94A, prExtend}, // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA + {0x1F000, 0x1F02B, prExtendedPictographic}, // 5.1 [44] (🀀..🀫) MAHJONG TILE EAST WIND..MAHJONG TILE BACK + {0x1F02C, 0x1F02F, prExtendedPictographic}, // NA [4] (🀬..🀯) .. + {0x1F030, 0x1F093, prExtendedPictographic}, // 5.1[100] (🀰..🂓) DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 + {0x1F094, 0x1F09F, prExtendedPictographic}, // NA [12] (🂔..🂟) .. + {0x1F0A0, 0x1F0AE, prExtendedPictographic}, // 6.0 [15] (🂠..🂮) PLAYING CARD BACK..PLAYING CARD KING OF SPADES + {0x1F0AF, 0x1F0B0, prExtendedPictographic}, // NA [2] (🂯..🂰) .. + {0x1F0B1, 0x1F0BE, prExtendedPictographic}, // 6.0 [14] (🂱..🂾) PLAYING CARD ACE OF HEARTS..PLAYING CARD KING OF HEARTS + {0x1F0BF, 0x1F0BF, prExtendedPictographic}, // 7.0 [1] (🂿) PLAYING CARD RED JOKER + {0x1F0C0, 0x1F0C0, prExtendedPictographic}, // NA [1] (🃀) + {0x1F0C1, 0x1F0CF, prExtendedPictographic}, // 6.0 [15] (🃁..🃏) PLAYING CARD ACE OF DIAMONDS..joker + {0x1F0D0, 0x1F0D0, prExtendedPictographic}, // NA [1] (🃐) + {0x1F0D1, 0x1F0DF, prExtendedPictographic}, // 6.0 [15] (🃑..🃟) PLAYING CARD ACE OF CLUBS..PLAYING CARD WHITE JOKER + {0x1F0E0, 0x1F0F5, prExtendedPictographic}, // 7.0 [22] (🃠..🃵) PLAYING CARD FOOL..PLAYING CARD TRUMP-21 + {0x1F0F6, 0x1F0FF, prExtendedPictographic}, // NA [10] (🃶..🃿) .. + {0x1F10D, 0x1F10F, prExtendedPictographic}, // NA [3] (🄍..🄏) .. + {0x1F12F, 0x1F12F, prExtendedPictographic}, // 11.0 [1] (🄯) COPYLEFT SYMBOL + {0x1F16C, 0x1F16C, prExtendedPictographic}, // 12.0 [1] (🅬) RAISED MR SIGN + {0x1F16D, 0x1F16F, prExtendedPictographic}, // NA [3] (🅭..🅯) .. + {0x1F170, 0x1F171, prExtendedPictographic}, // 6.0 [2] (🅰️..🅱️) A button (blood type)..B button (blood type) + {0x1F17E, 0x1F17E, prExtendedPictographic}, // 6.0 [1] (🅾️) O button (blood type) + {0x1F17F, 0x1F17F, prExtendedPictographic}, // 5.2 [1] (🅿️) P button + {0x1F18E, 0x1F18E, prExtendedPictographic}, // 6.0 [1] (🆎) AB button (blood type) + {0x1F191, 0x1F19A, prExtendedPictographic}, // 6.0 [10] (🆑..🆚) CL button..VS button + {0x1F1AD, 0x1F1E5, prExtendedPictographic}, // NA [57] (🆭..🇥) .. + {0x1F1E6, 0x1F1FF, prRegionalIndicator}, // So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z + {0x1F201, 0x1F202, prExtendedPictographic}, // 6.0 [2] (🈁..🈂️) Japanese “here” button..Japanese “service charge” button + {0x1F203, 0x1F20F, prExtendedPictographic}, // NA [13] (🈃..🈏) .. + {0x1F21A, 0x1F21A, prExtendedPictographic}, // 5.2 [1] (🈚) Japanese “free of charge” button + {0x1F22F, 0x1F22F, prExtendedPictographic}, // 5.2 [1] (🈯) Japanese “reserved” button + {0x1F232, 0x1F23A, prExtendedPictographic}, // 6.0 [9] (🈲..🈺) Japanese “prohibited” button..Japanese “open for business” button + {0x1F23C, 0x1F23F, prExtendedPictographic}, // NA [4] (🈼..🈿) .. + {0x1F249, 0x1F24F, prExtendedPictographic}, // NA [7] (🉉..🉏) .. + {0x1F250, 0x1F251, prExtendedPictographic}, // 6.0 [2] (🉐..🉑) Japanese “bargain” button..Japanese “acceptable” button + {0x1F252, 0x1F25F, prExtendedPictographic}, // NA [14] (🉒..🉟) .. + {0x1F260, 0x1F265, prExtendedPictographic}, // 10.0 [6] (🉠..🉥) ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI + {0x1F266, 0x1F2FF, prExtendedPictographic}, // NA[154] (🉦..🋿) .. + {0x1F300, 0x1F320, prExtendedPictographic}, // 6.0 [33] (🌀..🌠) cyclone..shooting star + {0x1F321, 0x1F32C, prExtendedPictographic}, // 7.0 [12] (🌡️..🌬️) thermometer..wind face + {0x1F32D, 0x1F32F, prExtendedPictographic}, // 8.0 [3] (🌭..🌯) hot dog..burrito + {0x1F330, 0x1F335, prExtendedPictographic}, // 6.0 [6] (🌰..🌵) chestnut..cactus + {0x1F336, 0x1F336, prExtendedPictographic}, // 7.0 [1] (🌶️) hot pepper + {0x1F337, 0x1F37C, prExtendedPictographic}, // 6.0 [70] (🌷..🍼) tulip..baby bottle + {0x1F37D, 0x1F37D, prExtendedPictographic}, // 7.0 [1] (🍽️) fork and knife with plate + {0x1F37E, 0x1F37F, prExtendedPictographic}, // 8.0 [2] (🍾..🍿) bottle with popping cork..popcorn + {0x1F380, 0x1F393, prExtendedPictographic}, // 6.0 [20] (🎀..🎓) ribbon..graduation cap + {0x1F394, 0x1F39F, prExtendedPictographic}, // 7.0 [12] (🎔..🎟️) HEART WITH TIP ON THE LEFT..admission tickets + {0x1F3A0, 0x1F3C4, prExtendedPictographic}, // 6.0 [37] (🎠..🏄) carousel horse..person surfing + {0x1F3C5, 0x1F3C5, prExtendedPictographic}, // 7.0 [1] (🏅) sports medal + {0x1F3C6, 0x1F3CA, prExtendedPictographic}, // 6.0 [5] (🏆..🏊) trophy..person swimming + {0x1F3CB, 0x1F3CE, prExtendedPictographic}, // 7.0 [4] (🏋️..🏎️) person lifting weights..racing car + {0x1F3CF, 0x1F3D3, prExtendedPictographic}, // 8.0 [5] (🏏..🏓) cricket game..ping pong + {0x1F3D4, 0x1F3DF, prExtendedPictographic}, // 7.0 [12] (🏔️..🏟️) snow-capped mountain..stadium + {0x1F3E0, 0x1F3F0, prExtendedPictographic}, // 6.0 [17] (🏠..🏰) house..castle + {0x1F3F1, 0x1F3F7, prExtendedPictographic}, // 7.0 [7] (🏱..🏷️) WHITE PENNANT..label + {0x1F3F8, 0x1F3FA, prExtendedPictographic}, // 8.0 [3] (🏸..🏺) badminton..amphora + {0x1F3FB, 0x1F3FF, prExtend}, // Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 + {0x1F400, 0x1F43E, prExtendedPictographic}, // 6.0 [63] (🐀..🐾) rat..paw prints + {0x1F43F, 0x1F43F, prExtendedPictographic}, // 7.0 [1] (🐿️) chipmunk + {0x1F440, 0x1F440, prExtendedPictographic}, // 6.0 [1] (👀) eyes + {0x1F441, 0x1F441, prExtendedPictographic}, // 7.0 [1] (👁️) eye + {0x1F442, 0x1F4F7, prExtendedPictographic}, // 6.0[182] (👂..📷) ear..camera + {0x1F4F8, 0x1F4F8, prExtendedPictographic}, // 7.0 [1] (📸) camera with flash + {0x1F4F9, 0x1F4FC, prExtendedPictographic}, // 6.0 [4] (📹..📼) video camera..videocassette + {0x1F4FD, 0x1F4FE, prExtendedPictographic}, // 7.0 [2] (📽️..📾) film projector..PORTABLE STEREO + {0x1F4FF, 0x1F4FF, prExtendedPictographic}, // 8.0 [1] (📿) prayer beads + {0x1F500, 0x1F53D, prExtendedPictographic}, // 6.0 [62] (🔀..🔽) shuffle tracks button..downwards button + {0x1F546, 0x1F54A, prExtendedPictographic}, // 7.0 [5] (🕆..🕊️) WHITE LATIN CROSS..dove + {0x1F54B, 0x1F54F, prExtendedPictographic}, // 8.0 [5] (🕋..🕏) kaaba..BOWL OF HYGIEIA + {0x1F550, 0x1F567, prExtendedPictographic}, // 6.0 [24] (🕐..🕧) one o’clock..twelve-thirty + {0x1F568, 0x1F579, prExtendedPictographic}, // 7.0 [18] (🕨..🕹️) RIGHT SPEAKER..joystick + {0x1F57A, 0x1F57A, prExtendedPictographic}, // 9.0 [1] (🕺) man dancing + {0x1F57B, 0x1F5A3, prExtendedPictographic}, // 7.0 [41] (🕻..🖣) LEFT HAND TELEPHONE RECEIVER..BLACK DOWN POINTING BACKHAND INDEX + {0x1F5A4, 0x1F5A4, prExtendedPictographic}, // 9.0 [1] (🖤) black heart + {0x1F5A5, 0x1F5FA, prExtendedPictographic}, // 7.0 [86] (🖥️..🗺️) desktop computer..world map + {0x1F5FB, 0x1F5FF, prExtendedPictographic}, // 6.0 [5] (🗻..🗿) mount fuji..moai + {0x1F600, 0x1F600, prExtendedPictographic}, // 6.1 [1] (😀) grinning face + {0x1F601, 0x1F610, prExtendedPictographic}, // 6.0 [16] (😁..😐) beaming face with smiling eyes..neutral face + {0x1F611, 0x1F611, prExtendedPictographic}, // 6.1 [1] (😑) expressionless face + {0x1F612, 0x1F614, prExtendedPictographic}, // 6.0 [3] (😒..😔) unamused face..pensive face + {0x1F615, 0x1F615, prExtendedPictographic}, // 6.1 [1] (😕) confused face + {0x1F616, 0x1F616, prExtendedPictographic}, // 6.0 [1] (😖) confounded face + {0x1F617, 0x1F617, prExtendedPictographic}, // 6.1 [1] (😗) kissing face + {0x1F618, 0x1F618, prExtendedPictographic}, // 6.0 [1] (😘) face blowing a kiss + {0x1F619, 0x1F619, prExtendedPictographic}, // 6.1 [1] (😙) kissing face with smiling eyes + {0x1F61A, 0x1F61A, prExtendedPictographic}, // 6.0 [1] (😚) kissing face with closed eyes + {0x1F61B, 0x1F61B, prExtendedPictographic}, // 6.1 [1] (😛) face with tongue + {0x1F61C, 0x1F61E, prExtendedPictographic}, // 6.0 [3] (😜..😞) winking face with tongue..disappointed face + {0x1F61F, 0x1F61F, prExtendedPictographic}, // 6.1 [1] (😟) worried face + {0x1F620, 0x1F625, prExtendedPictographic}, // 6.0 [6] (😠..😥) angry face..sad but relieved face + {0x1F626, 0x1F627, prExtendedPictographic}, // 6.1 [2] (😦..😧) frowning face with open mouth..anguished face + {0x1F628, 0x1F62B, prExtendedPictographic}, // 6.0 [4] (😨..😫) fearful face..tired face + {0x1F62C, 0x1F62C, prExtendedPictographic}, // 6.1 [1] (😬) grimacing face + {0x1F62D, 0x1F62D, prExtendedPictographic}, // 6.0 [1] (😭) loudly crying face + {0x1F62E, 0x1F62F, prExtendedPictographic}, // 6.1 [2] (😮..😯) face with open mouth..hushed face + {0x1F630, 0x1F633, prExtendedPictographic}, // 6.0 [4] (😰..😳) anxious face with sweat..flushed face + {0x1F634, 0x1F634, prExtendedPictographic}, // 6.1 [1] (😴) sleeping face + {0x1F635, 0x1F640, prExtendedPictographic}, // 6.0 [12] (😵..🙀) dizzy face..weary cat + {0x1F641, 0x1F642, prExtendedPictographic}, // 7.0 [2] (🙁..🙂) slightly frowning face..slightly smiling face + {0x1F643, 0x1F644, prExtendedPictographic}, // 8.0 [2] (🙃..🙄) upside-down face..face with rolling eyes + {0x1F645, 0x1F64F, prExtendedPictographic}, // 6.0 [11] (🙅..🙏) person gesturing NO..folded hands + {0x1F680, 0x1F6C5, prExtendedPictographic}, // 6.0 [70] (🚀..🛅) rocket..left luggage + {0x1F6C6, 0x1F6CF, prExtendedPictographic}, // 7.0 [10] (🛆..🛏️) TRIANGLE WITH ROUNDED CORNERS..bed + {0x1F6D0, 0x1F6D0, prExtendedPictographic}, // 8.0 [1] (🛐) place of worship + {0x1F6D1, 0x1F6D2, prExtendedPictographic}, // 9.0 [2] (🛑..🛒) stop sign..shopping cart + {0x1F6D3, 0x1F6D4, prExtendedPictographic}, // 10.0 [2] (🛓..🛔) STUPA..PAGODA + {0x1F6D5, 0x1F6D5, prExtendedPictographic}, // 12.0 [1] (🛕) hindu temple + {0x1F6D6, 0x1F6DF, prExtendedPictographic}, // NA [10] (🛖..🛟) .. + {0x1F6E0, 0x1F6EC, prExtendedPictographic}, // 7.0 [13] (🛠️..🛬) hammer and wrench..airplane arrival + {0x1F6ED, 0x1F6EF, prExtendedPictographic}, // NA [3] (🛭..🛯) .. + {0x1F6F0, 0x1F6F3, prExtendedPictographic}, // 7.0 [4] (🛰️..🛳️) satellite..passenger ship + {0x1F6F4, 0x1F6F6, prExtendedPictographic}, // 9.0 [3] (🛴..🛶) kick scooter..canoe + {0x1F6F7, 0x1F6F8, prExtendedPictographic}, // 10.0 [2] (🛷..🛸) sled..flying saucer + {0x1F6F9, 0x1F6F9, prExtendedPictographic}, // 11.0 [1] (🛹) skateboard + {0x1F6FA, 0x1F6FA, prExtendedPictographic}, // 12.0 [1] (🛺) auto rickshaw + {0x1F6FB, 0x1F6FF, prExtendedPictographic}, // NA [5] (🛻..🛿) .. + {0x1F774, 0x1F77F, prExtendedPictographic}, // NA [12] (🝴..🝿) .. + {0x1F7D5, 0x1F7D8, prExtendedPictographic}, // 11.0 [4] (🟕..🟘) CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE + {0x1F7D9, 0x1F7DF, prExtendedPictographic}, // NA [7] (🟙..🟟) .. + {0x1F7E0, 0x1F7EB, prExtendedPictographic}, // 12.0 [12] (🟠..🟫) orange circle..brown square + {0x1F7EC, 0x1F7FF, prExtendedPictographic}, // NA [20] (🟬..🟿) .. + {0x1F80C, 0x1F80F, prExtendedPictographic}, // NA [4] (🠌..🠏) .. + {0x1F848, 0x1F84F, prExtendedPictographic}, // NA [8] (🡈..🡏) .. + {0x1F85A, 0x1F85F, prExtendedPictographic}, // NA [6] (🡚..🡟) .. + {0x1F888, 0x1F88F, prExtendedPictographic}, // NA [8] (🢈..🢏) .. + {0x1F8AE, 0x1F8FF, prExtendedPictographic}, // NA [82] (🢮..🣿) .. + {0x1F90C, 0x1F90C, prExtendedPictographic}, // NA [1] (🤌) + {0x1F90D, 0x1F90F, prExtendedPictographic}, // 12.0 [3] (🤍..🤏) white heart..pinching hand + {0x1F910, 0x1F918, prExtendedPictographic}, // 8.0 [9] (🤐..🤘) zipper-mouth face..sign of the horns + {0x1F919, 0x1F91E, prExtendedPictographic}, // 9.0 [6] (🤙..🤞) call me hand..crossed fingers + {0x1F91F, 0x1F91F, prExtendedPictographic}, // 10.0 [1] (🤟) love-you gesture + {0x1F920, 0x1F927, prExtendedPictographic}, // 9.0 [8] (🤠..🤧) cowboy hat face..sneezing face + {0x1F928, 0x1F92F, prExtendedPictographic}, // 10.0 [8] (🤨..🤯) face with raised eyebrow..exploding head + {0x1F930, 0x1F930, prExtendedPictographic}, // 9.0 [1] (🤰) pregnant woman + {0x1F931, 0x1F932, prExtendedPictographic}, // 10.0 [2] (🤱..🤲) breast-feeding..palms up together + {0x1F933, 0x1F93A, prExtendedPictographic}, // 9.0 [8] (🤳..🤺) selfie..person fencing + {0x1F93C, 0x1F93E, prExtendedPictographic}, // 9.0 [3] (🤼..🤾) people wrestling..person playing handball + {0x1F93F, 0x1F93F, prExtendedPictographic}, // 12.0 [1] (🤿) diving mask + {0x1F940, 0x1F945, prExtendedPictographic}, // 9.0 [6] (🥀..🥅) wilted flower..goal net + {0x1F947, 0x1F94B, prExtendedPictographic}, // 9.0 [5] (🥇..🥋) 1st place medal..martial arts uniform + {0x1F94C, 0x1F94C, prExtendedPictographic}, // 10.0 [1] (🥌) curling stone + {0x1F94D, 0x1F94F, prExtendedPictographic}, // 11.0 [3] (🥍..🥏) lacrosse..flying disc + {0x1F950, 0x1F95E, prExtendedPictographic}, // 9.0 [15] (🥐..🥞) croissant..pancakes + {0x1F95F, 0x1F96B, prExtendedPictographic}, // 10.0 [13] (🥟..🥫) dumpling..canned food + {0x1F96C, 0x1F970, prExtendedPictographic}, // 11.0 [5] (🥬..🥰) leafy green..smiling face with hearts + {0x1F971, 0x1F971, prExtendedPictographic}, // 12.0 [1] (🥱) yawning face + {0x1F972, 0x1F972, prExtendedPictographic}, // NA [1] (🥲) + {0x1F973, 0x1F976, prExtendedPictographic}, // 11.0 [4] (🥳..🥶) partying face..cold face + {0x1F977, 0x1F979, prExtendedPictographic}, // NA [3] (🥷..🥹) .. + {0x1F97A, 0x1F97A, prExtendedPictographic}, // 11.0 [1] (🥺) pleading face + {0x1F97B, 0x1F97B, prExtendedPictographic}, // 12.0 [1] (🥻) sari + {0x1F97C, 0x1F97F, prExtendedPictographic}, // 11.0 [4] (🥼..🥿) lab coat..flat shoe + {0x1F980, 0x1F984, prExtendedPictographic}, // 8.0 [5] (🦀..🦄) crab..unicorn + {0x1F985, 0x1F991, prExtendedPictographic}, // 9.0 [13] (🦅..🦑) eagle..squid + {0x1F992, 0x1F997, prExtendedPictographic}, // 10.0 [6] (🦒..🦗) giraffe..cricket + {0x1F998, 0x1F9A2, prExtendedPictographic}, // 11.0 [11] (🦘..🦢) kangaroo..swan + {0x1F9A3, 0x1F9A4, prExtendedPictographic}, // NA [2] (🦣..🦤) .. + {0x1F9A5, 0x1F9AA, prExtendedPictographic}, // 12.0 [6] (🦥..🦪) sloth..oyster + {0x1F9AB, 0x1F9AD, prExtendedPictographic}, // NA [3] (🦫..🦭) .. + {0x1F9AE, 0x1F9AF, prExtendedPictographic}, // 12.0 [2] (🦮..🦯) guide dog..probing cane + {0x1F9B0, 0x1F9B9, prExtendedPictographic}, // 11.0 [10] (🦰..🦹) red hair..supervillain + {0x1F9BA, 0x1F9BF, prExtendedPictographic}, // 12.0 [6] (🦺..🦿) safety vest..mechanical leg + {0x1F9C0, 0x1F9C0, prExtendedPictographic}, // 8.0 [1] (🧀) cheese wedge + {0x1F9C1, 0x1F9C2, prExtendedPictographic}, // 11.0 [2] (🧁..🧂) cupcake..salt + {0x1F9C3, 0x1F9CA, prExtendedPictographic}, // 12.0 [8] (🧃..🧊) beverage box..ice cube + {0x1F9CB, 0x1F9CC, prExtendedPictographic}, // NA [2] (🧋..🧌) .. + {0x1F9CD, 0x1F9CF, prExtendedPictographic}, // 12.0 [3] (🧍..🧏) person standing..deaf person + {0x1F9D0, 0x1F9E6, prExtendedPictographic}, // 10.0 [23] (🧐..🧦) face with monocle..socks + {0x1F9E7, 0x1F9FF, prExtendedPictographic}, // 11.0 [25] (🧧..🧿) red envelope..nazar amulet + {0x1FA00, 0x1FA53, prExtendedPictographic}, // 12.0 [84] (🨀..🩓) NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP + {0x1FA54, 0x1FA5F, prExtendedPictographic}, // NA [12] (🩔..🩟) .. + {0x1FA60, 0x1FA6D, prExtendedPictographic}, // 11.0 [14] (🩠..🩭) XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER + {0x1FA6E, 0x1FA6F, prExtendedPictographic}, // NA [2] (🩮..🩯) .. + {0x1FA70, 0x1FA73, prExtendedPictographic}, // 12.0 [4] (🩰..🩳) ballet shoes..shorts + {0x1FA74, 0x1FA77, prExtendedPictographic}, // NA [4] (🩴..🩷) .. + {0x1FA78, 0x1FA7A, prExtendedPictographic}, // 12.0 [3] (🩸..🩺) drop of blood..stethoscope + {0x1FA7B, 0x1FA7F, prExtendedPictographic}, // NA [5] (🩻..🩿) .. + {0x1FA80, 0x1FA82, prExtendedPictographic}, // 12.0 [3] (🪀..🪂) yo-yo..parachute + {0x1FA83, 0x1FA8F, prExtendedPictographic}, // NA [13] (🪃..🪏) .. + {0x1FA90, 0x1FA95, prExtendedPictographic}, // 12.0 [6] (🪐..🪕) ringed planet..banjo + {0x1FA96, 0x1FFFD, prExtendedPictographic}, // NA[1384] (🪖..🿽) .. + {0xE0000, 0xE0000, prControl}, // Cn + {0xE0001, 0xE0001, prControl}, // Cf LANGUAGE TAG + {0xE0002, 0xE001F, prControl}, // Cn [30] .. + {0xE0020, 0xE007F, prExtend}, // Cf [96] TAG SPACE..CANCEL TAG + {0xE0080, 0xE00FF, prControl}, // Cn [128] .. + {0xE0100, 0xE01EF, prExtend}, // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + {0xE01F0, 0xE0FFF, prControl}, // Cn [3600] .. +} + +// property returns the Unicode property value (see constants above) of the +// given code point. +func property(r rune) int { + // Run a binary search. + from := 0 + to := len(codePoints) + for to > from { + middle := (from + to) / 2 + cpRange := codePoints[middle] + if int(r) < cpRange[0] { + to = middle + continue + } + if int(r) > cpRange[1] { + from = middle + 1 + continue + } + return cpRange[2] + } + return prAny +} diff --git a/vendor/github.com/thoas/go-funk/.gitignore b/vendor/github.com/thoas/go-funk/.gitignore index daf913b1b3..7b4c598b0b 100644 --- a/vendor/github.com/thoas/go-funk/.gitignore +++ b/vendor/github.com/thoas/go-funk/.gitignore @@ -22,3 +22,6 @@ _testmain.go *.exe *.test *.prof + +#GoLand +.idea \ No newline at end of file diff --git a/vendor/github.com/thoas/go-funk/.travis.yml b/vendor/github.com/thoas/go-funk/.travis.yml index 4ff44324ca..dbc0f7267f 100644 --- a/vendor/github.com/thoas/go-funk/.travis.yml +++ b/vendor/github.com/thoas/go-funk/.travis.yml @@ -3,5 +3,5 @@ before_install: - go get golang.org/x/tools/cmd/cover - go get github.com/stretchr/testify go: - - 1.7 + - "1.14" script: make test diff --git a/vendor/github.com/thoas/go-funk/README.rst b/vendor/github.com/thoas/go-funk/README.rst index 4af1445fb3..2f6b539874 100644 --- a/vendor/github.com/thoas/go-funk/README.rst +++ b/vendor/github.com/thoas/go-funk/README.rst @@ -7,7 +7,7 @@ go-funk .. image:: https://godoc.org/github.com/thoas/go-funk?status.svg :alt: GoDoc - :target: https://godoc.org/github.com/thoas/go-funk + :target: https://pkg.go.dev/github.com/thoas/go-funk .. image:: https://goreportcard.com/badge/github.com/thoas/go-funk :alt: Go report @@ -17,8 +17,8 @@ go-funk Generic helpers rely on reflect_, be careful this code runs exclusively on runtime so you must have a good test suite. -These helpers have started as an experiment to learn reflect_. It may looks like lodash_ in some aspects but -it will have its own roadmap, lodash_ is an awesome library with a lot of works behind it, all features included in +These helpers have started as an experiment to learn reflect_. It may look like lodash_ in some aspects but +it will have its own roadmap. lodash_ is an awesome library with a lot of work behind it, all features included in ``go-funk`` come from internal use cases. You can also find typesafe implementation in the godoc_. @@ -87,7 +87,7 @@ funk.Contains Returns true if an element is present in a iteratee (slice, map, string). -One frustrating thing in Go is to implement ``contains`` methods for each types, for example: +One frustrating thing in Go is to implement ``contains`` methods for each type, for example: .. code-block:: go @@ -109,6 +109,9 @@ this can be replaced by ``funk.Contains``: // slice of Foo ptr funk.Contains([]*Foo{f}, f) // true + funk.Contains([]*Foo{f}, func (foo *Foo) bool { + return foo.ID == f.ID + }) // true funk.Contains([]*Foo{f}, nil) // false b := &Foo{ @@ -126,6 +129,9 @@ this can be replaced by ``funk.Contains``: // even map funk.Contains(map[int]string{1: "Florent"}, 1) // true + funk.Contains(map[int]string{1: "Florent"}, func(key int, name string) bool { + return key == 1 // or `name == "Florent"` for the value type + }) // true see also, typesafe implementations: ContainsInt_, ContainsInt64_, ContainsFloat32_, ContainsFloat64_, ContainsString_ @@ -135,16 +141,49 @@ see also, typesafe implementations: ContainsInt_, ContainsInt64_, ContainsFloat3 .. _ContainsInt64: https://godoc.org/github.com/thoas/go-funk#ContainsInt64 .. _ContainsString: https://godoc.org/github.com/thoas/go-funk#ContainsString +funk.Intersect +.............. + +Returns the intersection between two collections. + +.. code-block:: go + + funk.Intersect([]int{1, 2, 3, 4}, []int{2, 4, 6}) // []int{2, 4} + funk.Intersect([]string{"foo", "bar", "hello", "bar"}, []string{"foo", "bar"}) // []string{"foo", "bar"} + +see also, typesafe implementations: IntersectString + +.. IntersectString: https://godoc.org/github.com/thoas/go-funk#IntersectString + + +funk.Difference +.............. + +Returns the difference between two collections. + +.. code-block:: go + + funk.Difference([]int{1, 2, 3, 4}, []int{2, 4, 6}) // []int{1, 3}, []int{6} + funk.Difference([]string{"foo", "bar", "hello", "bar"}, []string{"foo", "bar"}) // []string{"hello"}, []string{} + +see also, typesafe implementations: DifferenceString + +.. DifferenceString: https://godoc.org/github.com/thoas/go-funk#DifferenceString + + funk.IndexOf ............ -Gets the index at which the first occurrence of value is found in array or return -1 +Gets the index at which the first occurrence of a value is found in an array or return -1 if the value cannot be found. .. code-block:: go // slice of string funk.IndexOf([]string{"foo", "bar"}, "bar") // 1 + funk.IndexOf([]string{"foo", "bar"}, func(value string) bool { + return value == "bar" + }) // 1 funk.IndexOf([]string{"foo", "bar"}, "gilles") // -1 see also, typesafe implementations: IndexOfInt_, IndexOfInt64_, IndexOfFloat32_, IndexOfFloat64_, IndexOfString_ @@ -158,13 +197,16 @@ see also, typesafe implementations: IndexOfInt_, IndexOfInt64_, IndexOfFloat32_, funk.LastIndexOf ................ -Gets the index at which the last occurrence of value is found in array or return -1 +Gets the index at which the last occurrence of a value is found in an array or return -1 if the value cannot be found. .. code-block:: go // slice of string funk.LastIndexOf([]string{"foo", "bar", "bar"}, "bar") // 2 + funk.LastIndexOf([]string{"foo", "bar"}, func(value string) bool { + return value == "bar" + }) // 2 funk.LastIndexOf([]string{"foo", "bar"}, "gilles") // -1 see also, typesafe implementations: LastIndexOfInt_, LastIndexOfInt64_, LastIndexOfFloat32_, LastIndexOfFloat64_, LastIndexOfString_ @@ -219,6 +261,26 @@ see also, typesafe implementations: FilterInt_, FilterInt64_, FilterFloat32_, Fi .. _FilterInt64: https://godoc.org/github.com/thoas/go-funk#FilterInt64 .. _FilterString: https://godoc.org/github.com/thoas/go-funk#FilterString +funk.Reduce +........... + +Reduces an iteratee based on an accumulator function or operation rune for numbers. + +.. code-block:: go + + // Using operation runes. '+' and '*' only supported. + r := funk.Reduce([]int{1, 2, 3, 4}, '+', float64(0)) // 10 + r := funk.Reduce([]int{1, 2, 3, 4}, '*', 1) // 24 + + // Using accumulator function + r := funk.Reduce([]int{1, 2, 3, 4}, func(acc float64, num int) float64 { + return acc + float64(num) + }, float64(0)) // 10 + + r := funk.Reduce([]int{1, 2, 3, 4}, func(acc string, num int) string { + return acc + fmt.Sprint(num) + }, "") // "1234" + funk.Find ......... @@ -275,10 +337,33 @@ Manipulates an iteratee (map, slice) and transforms it to another type: return fmt.Sprintf("%d", k), v }) // map[string]string{"1": "Florent", "2": "Gilles"} +funk.FlatMap +............ + +Manipulates an iteratee (map, slice) and transforms it to to a flattened collection of another type: + +* map -> slice +* slice -> slice + +.. code-block:: go + + r := funk.FlatMap([][]int{{1, 2}, {3, 4}}, func(x []int) []int { + return append(x, 0) + }) // []int{1, 2, 0, 3, 4, 0} + + mapping := map[string][]int{ + "Florent": {1, 2}, + "Gilles": {3, 4}, + } + + r = funk.FlatMap(mapping, func(k string, v []int) []int { + return v + }) // []int{1, 2, 3, 4} + funk.Get ........ -Retrieves the value at path of struct(s). +Retrieves the value at path of struct(s) or map(s). .. code-block:: go @@ -316,6 +401,34 @@ Retrieves the value at path of struct(s). funk.Get(foo, "Bar.Bars.Bar.Name") // []string{"Level2-1", "Level2-2"} funk.Get(foo, "Bar.Name") // Test +``funk.Get`` also support ``map`` values: + +.. code-block:: go + + bar := map[string]interface{}{ + "Name": "Test", + } + + foo1 := map[string]interface{}{ + "ID": 1, + "FirstName": "Dark", + "LastName": "Vador", + "Age": 30, + "Bar": bar, + } + + foo2 := &map[string]interface{}{ + "ID": 1, + "FirstName": "Dark", + "LastName": "Vador", + "Age": 30, + } // foo2.Bar is nil + + funk.Get(bar, "Name") // "Test" + funk.Get([]map[string]interface{}{foo1, foo2}, "Bar.Name") // []string{"Test"} + funk.Get(foo2, "Bar.Name") // nil + + ``funk.Get`` also handles ``nil`` values: .. code-block:: go @@ -342,6 +455,80 @@ Retrieves the value at path of struct(s). funk.Get([]*Foo{foo1, foo2}, "Bar.Name") // []string{"Test"} funk.Get(foo2, "Bar.Name") // nil + + +funk.GetOrElse +.............. + +Retrieves the value of the pointer or default. + +.. code-block:: go + + str := "hello world" + GetOrElse(&str, "foobar") // string{"hello world"} + GetOrElse(str, "foobar") // string{"hello world"} + GetOrElse(nil, "foobar") // string{"foobar"} + +funk.Set +........ +Set value at a path of a struct + +.. code-block:: go + + var bar Bar = Bar{ + Name: "level-0", + Bar: &Bar{ + Name: "level-1", + Bars: []*Bar{ + {Name: "level2-1"}, + {Name: "level2-2"}, + }, + }, + } + + _ = Set(&bar, "level-0-new", "Name") + fmt.Println(bar.Name) // "level-0-new" + + MustSet(&bar, "level-1-new", "Bar.Name") + fmt.Println(bar.Bar.Name) // "level-1-new" + + Set(&bar, "level-2-new", "Bar.Bars.Name") + fmt.Println(bar.Bar.Bars[0].Name) // "level-2-new" + fmt.Println(bar.Bar.Bars[1].Name) // "level-2-new" + +funk.MustSet +............ +Short hand for funk.Set if struct does not contain interface{} field type to discard errors. + +funk.Prune +.......... +Copy a struct with only selected fields. Slice is handled by pruning all elements. + +.. code-block:: go + + bar := &Bar{ + Name: "Test", + } + + foo1 := &Foo{ + ID: 1, + FirstName: "Dark", + LastName: "Vador", + Bar: bar, + } + + pruned, _ := Prune(foo1, []string{"FirstName", "Bar.Name"}) + // *Foo{ + // ID: 0, + // FirstName: "Dark", + // LastName: "", + // Bar: &Bar{Name: "Test}, + // } + +funk.PruneByTag +.......... +Same functionality as funk.Prune, but uses struct tags instead of struct field names. + funk.Keys ......... @@ -417,7 +604,7 @@ If array can't be split evenly, the final chunk will be the remaining element. funk.FlattenDeep ................ -Recursively flattens array. +Recursively flattens an array. .. code-block:: go @@ -440,6 +627,24 @@ see also, typesafe implementations: UniqInt_, UniqInt64_, UniqFloat32_, UniqFloa .. _UniqInt64: https://godoc.org/github.com/thoas/go-funk#UniqInt64 .. _UniqString: https://godoc.org/github.com/thoas/go-funk#UniqString +funk.Drop +......... + +Creates an array/slice with `n` elements dropped from the beginning. + +.. code-block:: go + + funk.Drop([]int{0, 0, 0, 0}, 3) // []int{0} + +see also, typesafe implementations: DropInt_, DropInt32_, DropInt64_, DropFloat32_, DropFloat64_, DropString_ + +.. _DropInt: https://godoc.org/github.com/thoas/go-funk#DropInt +.. _DropInt32: https://godoc.org/github.com/thoas/go-funk#DropInt64 +.. _DropInt64: https://godoc.org/github.com/thoas/go-funk#DropInt64 +.. _DropFloat32: https://godoc.org/github.com/thoas/go-funk#DropFloat32 +.. _DropFloat64: https://godoc.org/github.com/thoas/go-funk#DropFloat64 +.. _DropString: https://godoc.org/github.com/thoas/go-funk#DropString + funk.Initial ............ @@ -476,10 +681,25 @@ see also, typesafe implementations: ShuffleInt_, ShuffleInt64_, ShuffleFloat32_, .. _ShuffleInt64: https://godoc.org/github.com/thoas/go-funk#ShuffleInt64 .. _ShuffleString: https://godoc.org/github.com/thoas/go-funk#ShuffleString +funk.Subtract +............. + +Returns the subtraction between two collections. It preserve order. + +.. code-block:: go + + funk.Subtract([]int{0, 1, 2, 3, 4}, []int{0, 4}) // []int{1, 2, 3} + funk.Subtract([]int{0, 3, 2, 3, 4}, []int{0, 4}) // []int{3, 2, 3} + + +see also, typesafe implementations: SubtractString_ + +.. SubtractString: https://godoc.org/github.com/thoas/go-funk#SubtractString + funk.Sum ........ -Computes the sum of the values in array. +Computes the sum of the values in an array. .. code-block:: go @@ -496,7 +716,7 @@ see also, typesafe implementations: SumInt_, SumInt64_, SumFloat32_, SumFloat64_ funk.Reverse ............ -Transforms an array the first element will become the last, the second element +Transforms an array such that the first element will become the last, the second element will become the second to last, etc. .. code-block:: go @@ -550,12 +770,23 @@ Generates a sharded string with a fixed length and depth. funk.Shard("e89d66bdfdd4dd26b682cc77e23a86eb", 2, 2, false) // []string{"e8", "9d", "e89d66bdfdd4dd26b682cc77e23a86eb"} - funk.Shard("e89d66bdfdd4dd26b682cc77e23a86eb", 2, 2, true) // []string{"e8", "9d", "66", "bdfdd4dd26b682cc77e23a86eb"} + funk.Shard("e89d66bdfdd4dd26b682cc77e23a86eb", 2, 3, true) // []string{"e8", "9d", "66", "bdfdd4dd26b682cc77e23a86eb"} + +funk.Subset +............. + +Returns true if a collection is a subset of another + +.. code-block:: go + funk.Subset([]int{1, 2, 4}, []int{1, 2, 3, 4, 5}) // true + funk.Subset([]string{"foo", "bar"},[]string{"foo", "bar", "hello", "bar", "hi"}) //true + + Performance ----------- -``go-funk`` has currently an open issue about performance_, don't hesitate to participate in the discussion +``go-funk`` currently has an open issue about performance_, don't hesitate to participate in the discussion to enhance the generic helpers implementations. Let's stop beating around the bush, a typesafe implementation in pure Go of ``funk.Contains``, let's say for example: @@ -574,7 +805,7 @@ Let's stop beating around the bush, a typesafe implementation in pure Go of ``fu will always outperform an implementation based on reflect_ in terms of speed and allocs because of how it's implemented in the language. -If you want a similarity gorm_ will always be slower than sqlx_ (which is very low level btw) and will uses more allocs. +If you want a similarity, gorm_ will always be slower than sqlx_ (which is very low level btw) and will use more allocs. You must not think generic helpers of ``go-funk`` as a replacement when you are dealing with performance in your codebase, you should use typesafe implementations instead. @@ -582,7 +813,7 @@ you should use typesafe implementations instead. Contributing ------------ -* Ping me on twitter `@thoas `_ +* Ping me on twitter `@thoas `_ (DMs, mentions, whatever :)) * Fork the `project `_ * Fix `open issues `_ or request new features @@ -593,6 +824,8 @@ Authors * Florent Messa * Gilles Fabio +* Alexey Pokhozhaev +* Alexandre Nicolaie .. _reflect: https://golang.org/pkg/reflect/ .. _lodash: https://lodash.com/ diff --git a/vendor/github.com/thoas/go-funk/assign.go b/vendor/github.com/thoas/go-funk/assign.go new file mode 100644 index 0000000000..e35c750000 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/assign.go @@ -0,0 +1,129 @@ +package funk + +import ( + "errors" + "fmt" + "reflect" + "strings" +) + +// Set assigns in at path with value val. i.e. in.path = val +// in accepts types of ptr to struct, ptr to variable, slice and ptr to slice. +// Along the path, interface{} is supported and nil ptr is initialized to ptr to zero value +// of the type until the variable to be set is obtained. +// It returns errors when encountering along the path unknown types, uninitialized +// interface{} or interface{} containing struct directly (not ptr to struct). +// +// Slice is resolved the same way in funk.Get(), by traversing each element of the slice, +// so that each element of the slice's corresponding field are going to be set to the same provided val. +// If Set is called on slice with empty path "", it behaves the same as funk.Fill() +// +// If in is well formed, i.e. do not expect above descripted errors to happen, funk.MustSet() +// is a short hand wrapper to discard error return +func Set(in interface{}, val interface{}, path string) error { + if in == nil { + return errors.New("Cannot Set nil") + } + parts := []string{} + if path != "" { + parts = strings.Split(path, ".") + } + return setByParts(in, val, parts) +} + +// we need this layer to handle interface{} type +func setByParts(in interface{}, val interface{}, parts []string) error { + + if in == nil { + // nil interface can happen during traversing the path + return errors.New("Cannot traverse nil/uninitialized interface{}") + } + + inValue := reflect.ValueOf(in) + inKind := inValue.Type().Kind() + + // Note: if interface contains a struct (not ptr to struct) then the content of the struct cannot be set. + // I.e. it is not CanAddr() or CanSet() + // So we require in interface{} to be a ptr, slice or array + if inKind == reflect.Ptr { + inValue = inValue.Elem() // if it is ptr we set its content not ptr its self + } else if inKind != reflect.Array && inKind != reflect.Slice { + return fmt.Errorf("Type %s not supported by Set", inValue.Type().String()) + } + + return set(inValue, reflect.ValueOf(val), parts) +} + +// traverse inValue using path in parts and set the dst to be setValue +func set(inValue reflect.Value, setValue reflect.Value, parts []string) error { + + // traverse the path to get the inValue we need to set + i := 0 + for i < len(parts) { + + kind := inValue.Kind() + + switch kind { + case reflect.Invalid: + // do not expect this case to happen + return errors.New("nil pointer found along the path") + case reflect.Struct: + fValue := inValue.FieldByName(parts[i]) + if !fValue.IsValid() { + return fmt.Errorf("field name %v is not found in struct %v", parts[i], inValue.Type().String()) + } + if !fValue.CanSet() { + return fmt.Errorf("field name %v is not exported in struct %v", parts[i], inValue.Type().String()) + } + inValue = fValue + i++ + case reflect.Slice | reflect.Array: + // set all its elements + length := inValue.Len() + for j := 0; j < length; j++ { + err := set(inValue.Index(j), setValue, parts[i:]) + if err != nil { + return err + } + } + return nil + case reflect.Ptr: + // only traverse down one level + if inValue.IsNil() { + // we initialize nil ptr to ptr to zero value of the type + // and continue traversing + inValue.Set(reflect.New(inValue.Type().Elem())) + } + // traverse the ptr until it is not pointer any more or is nil again + inValue = redirectValue(inValue) + case reflect.Interface: + // Note: if interface contains a struct (not ptr to struct) then the content of the struct cannot be set. + // I.e. it is not CanAddr() or CanSet(). This is why setByParts has a nil ptr check. + // we treat this as a new call to setByParts, and it will do proper check of the types + return setByParts(inValue.Interface(), setValue.Interface(), parts[i:]) + default: + return fmt.Errorf("kind %v in path %v is not supported", kind, parts[i]) + } + + } + // here inValue holds the value we need to set + + // interface{} can be set to any val + // other types we ensure the type matches + if inValue.Kind() != setValue.Kind() && inValue.Kind() != reflect.Interface { + return fmt.Errorf("cannot set target of type %v with type %v", inValue.Kind(), setValue.Kind()) + } + inValue.Set(setValue) + + return nil +} + +// MustSet is functionally the same as Set. +// It panics instead of returning error. +// It is safe to use if the in value is well formed. +func MustSet(in interface{}, val interface{}, path string) { + err := Set(in, val, path) + if err != nil { + panic(err) + } +} diff --git a/vendor/github.com/thoas/go-funk/builder.go b/vendor/github.com/thoas/go-funk/builder.go new file mode 100644 index 0000000000..6dfc814d73 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/builder.go @@ -0,0 +1,110 @@ +package funk + +import ( + "fmt" + "reflect" +) + +// Builder contains all tools which can be chained. +type Builder interface { + Chunk(size int) Builder + Compact() Builder + Drop(n int) Builder + Filter(predicate interface{}) Builder + Flatten() Builder + FlattenDeep() Builder + Initial() Builder + Intersect(y interface{}) Builder + Join(rarr interface{}, fnc JoinFnc) Builder + Map(mapFunc interface{}) Builder + FlatMap(mapFunc interface{}) Builder + Reverse() Builder + Shuffle() Builder + Tail() Builder + Uniq() Builder + Without(values ...interface{}) Builder + + All() bool + Any() bool + Contains(elem interface{}) bool + Every(elements ...interface{}) bool + Find(predicate interface{}) interface{} + ForEach(predicate interface{}) + ForEachRight(predicate interface{}) + Head() interface{} + Keys() interface{} + IndexOf(elem interface{}) int + IsEmpty() bool + Last() interface{} + LastIndexOf(elem interface{}) int + NotEmpty() bool + Product() float64 + Reduce(reduceFunc, acc interface{}) interface{} + Sum() float64 + Type() reflect.Type + Value() interface{} + Values() interface{} +} + +// Chain creates a simple new go-funk.Builder from a collection. Each method +// call generate a new builder containing the previous result. +func Chain(v interface{}) Builder { + isNotNil(v, "Chain") + + valueType := reflect.TypeOf(v) + if isValidBuilderEntry(valueType) || + (valueType.Kind() == reflect.Ptr && isValidBuilderEntry(valueType.Elem())) { + return &chainBuilder{v} + } + + panic(fmt.Sprintf("Type %s is not supported by Chain", valueType.String())) +} + +// LazyChain creates a lazy go-funk.Builder from a collection. Each method call +// generate a new builder containing a method generating the previous value. +// With that, all data are only generated when we call a tailling method like All or Find. +func LazyChain(v interface{}) Builder { + isNotNil(v, "LazyChain") + + valueType := reflect.TypeOf(v) + if isValidBuilderEntry(valueType) || + (valueType.Kind() == reflect.Ptr && isValidBuilderEntry(valueType.Elem())) { + return &lazyBuilder{func() interface{} { return v }} + } + + panic(fmt.Sprintf("Type %s is not supported by LazyChain", valueType.String())) + +} + +// LazyChainWith creates a lazy go-funk.Builder from a generator. Like LazyChain, each +// method call generate a new builder containing a method generating the previous value. +// But, instead of using a collection, it takes a generator which can generate values. +// With LazyChainWith, to can create a generic pipeline of collection transformation and, +// throw the generator, sending different collection. +func LazyChainWith(generator func() interface{}) Builder { + isNotNil(generator, "LazyChainWith") + return &lazyBuilder{func() interface{} { + isNotNil(generator, "LazyChainWith") + + v := generator() + valueType := reflect.TypeOf(v) + if isValidBuilderEntry(valueType) || + (valueType.Kind() == reflect.Ptr && isValidBuilderEntry(valueType.Elem())) { + return v + } + + panic(fmt.Sprintf("Type %s is not supported by LazyChainWith generator", valueType.String())) + }} +} + +func isNotNil(v interface{}, from string) { + if v == nil { + panic(fmt.Sprintf("nil value is not supported by %s", from)) + } +} + +func isValidBuilderEntry(valueType reflect.Type) bool { + return valueType.Kind() == reflect.Slice || valueType.Kind() == reflect.Array || + valueType.Kind() == reflect.Map || + valueType.Kind() == reflect.String +} diff --git a/vendor/github.com/thoas/go-funk/chain_builder.go b/vendor/github.com/thoas/go-funk/chain_builder.go new file mode 100644 index 0000000000..18226ab573 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/chain_builder.go @@ -0,0 +1,142 @@ +package funk + +import ( + "fmt" + "reflect" +) + +type chainBuilder struct { + collection interface{} +} + +func (b *chainBuilder) Chunk(size int) Builder { + return &chainBuilder{Chunk(b.collection, size)} +} +func (b *chainBuilder) Compact() Builder { + return &chainBuilder{Compact(b.collection)} +} +func (b *chainBuilder) Drop(n int) Builder { + return &chainBuilder{Drop(b.collection, n)} +} +func (b *chainBuilder) Filter(predicate interface{}) Builder { + return &chainBuilder{Filter(b.collection, predicate)} +} +func (b *chainBuilder) Flatten() Builder { + return &chainBuilder{Flatten(b.collection)} +} +func (b *chainBuilder) FlattenDeep() Builder { + return &chainBuilder{FlattenDeep(b.collection)} +} +func (b *chainBuilder) Initial() Builder { + return &chainBuilder{Initial(b.collection)} +} +func (b *chainBuilder) Intersect(y interface{}) Builder { + return &chainBuilder{Intersect(b.collection, y)} +} +func (b *chainBuilder) Join(rarr interface{}, fnc JoinFnc) Builder { + return &chainBuilder{Join(b.collection, rarr, fnc)} +} +func (b *chainBuilder) Map(mapFunc interface{}) Builder { + return &chainBuilder{Map(b.collection, mapFunc)} +} +func (b *chainBuilder) FlatMap(mapFunc interface{}) Builder { + return &chainBuilder{FlatMap(b.collection, mapFunc)} +} +func (b *chainBuilder) Reverse() Builder { + return &chainBuilder{Reverse(b.collection)} +} +func (b *chainBuilder) Shuffle() Builder { + return &chainBuilder{Shuffle(b.collection)} +} +func (b *chainBuilder) Tail() Builder { + return &chainBuilder{Tail(b.collection)} +} +func (b *chainBuilder) Uniq() Builder { + return &chainBuilder{Uniq(b.collection)} +} +func (b *chainBuilder) Without(values ...interface{}) Builder { + return &chainBuilder{Without(b.collection, values...)} +} + +func (b *chainBuilder) All() bool { + v := reflect.ValueOf(b.collection) + t := v.Type() + + if t.Kind() != reflect.Array && t.Kind() != reflect.Slice { + panic(fmt.Sprintf("Type %s is not supported by Chain.All", t.String())) + } + + c := make([]interface{}, v.Len()) + for i := 0; i < v.Len(); i++ { + c[i] = v.Index(i).Interface() + } + return All(c...) +} +func (b *chainBuilder) Any() bool { + v := reflect.ValueOf(b.collection) + t := v.Type() + + if t.Kind() != reflect.Array && t.Kind() != reflect.Slice { + panic(fmt.Sprintf("Type %s is not supported by Chain.Any", t.String())) + } + + c := make([]interface{}, v.Len()) + for i := 0; i < v.Len(); i++ { + c[i] = v.Index(i).Interface() + } + return Any(c...) +} +func (b *chainBuilder) Contains(elem interface{}) bool { + return Contains(b.collection, elem) +} +func (b *chainBuilder) Every(elements ...interface{}) bool { + return Every(b.collection, elements...) +} +func (b *chainBuilder) Find(predicate interface{}) interface{} { + return Find(b.collection, predicate) +} +func (b *chainBuilder) ForEach(predicate interface{}) { + ForEach(b.collection, predicate) +} +func (b *chainBuilder) ForEachRight(predicate interface{}) { + ForEachRight(b.collection, predicate) +} +func (b *chainBuilder) Head() interface{} { + return Head(b.collection) +} +func (b *chainBuilder) Keys() interface{} { + return Keys(b.collection) +} +func (b *chainBuilder) IndexOf(elem interface{}) int { + return IndexOf(b.collection, elem) +} +func (b *chainBuilder) IsEmpty() bool { + return IsEmpty(b.collection) +} +func (b *chainBuilder) Last() interface{} { + return Last(b.collection) +} +func (b *chainBuilder) LastIndexOf(elem interface{}) int { + return LastIndexOf(b.collection, elem) +} +func (b *chainBuilder) NotEmpty() bool { + return NotEmpty(b.collection) +} +func (b *chainBuilder) Product() float64 { + return Product(b.collection) +} +func (b *chainBuilder) Reduce(reduceFunc, acc interface{}) interface{} { + return Reduce(b.collection, reduceFunc, acc) +} +func (b *chainBuilder) Sum() float64 { + return Sum(b.collection) +} +func (b *chainBuilder) Type() reflect.Type { + return reflect.TypeOf(b.collection) +} +func (b *chainBuilder) Value() interface{} { + return b.collection +} +func (b *chainBuilder) Values() interface{} { + return Values(b.collection) +} diff --git a/vendor/github.com/thoas/go-funk/compact.go b/vendor/github.com/thoas/go-funk/compact.go new file mode 100644 index 0000000000..ba151aa9c2 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/compact.go @@ -0,0 +1,50 @@ +package funk + +import ( + "reflect" +) + +// Compact creates a slice with all empty/zero values removed. +func Compact(value interface{}) interface{} { + arr := redirectValue(reflect.ValueOf(value)) + + if arr.Kind() != reflect.Slice && arr.Kind() != reflect.Array { + panic("First parameter must be array or slice") + } + + sliceElemType := sliceElem(arr.Type()) + resultSliceType := reflect.SliceOf(sliceElemType) + result := reflect.MakeSlice(resultSliceType, 0, 0) + + for i := 0; i < arr.Len(); i++ { + elemVal := arr.Index(i) + + if elemVal.Kind() == reflect.Interface { + elemVal = elemVal.Elem() + } + + redirectedElemVal := redirectValue(elemVal) + + switch redirectedElemVal.Kind() { + case reflect.Invalid: + continue + case reflect.Func: + if redirectedElemVal.IsNil() { + continue + } + case reflect.Map, reflect.Slice, reflect.Chan: + if redirectedElemVal.Len() == 0 { + continue + } + default: + defaultValue := reflect.Zero(redirectedElemVal.Type()).Interface() + if redirectedElemVal.Interface() == defaultValue { + continue + } + } + + result = reflect.Append(result, elemVal) + } + + return result.Interface() +} diff --git a/vendor/github.com/thoas/go-funk/fill.go b/vendor/github.com/thoas/go-funk/fill.go new file mode 100644 index 0000000000..6af5cfa77f --- /dev/null +++ b/vendor/github.com/thoas/go-funk/fill.go @@ -0,0 +1,34 @@ +package funk + +import ( + "errors" + "fmt" + "reflect" +) + +// Fill fills elements of array with value +func Fill(in interface{}, fillValue interface{}) (interface{}, error) { + inValue := reflect.ValueOf(in) + inKind := inValue.Type().Kind() + if inKind != reflect.Slice && inKind != reflect.Array { + return nil, errors.New("Can only fill slices and arrays") + } + + inType := reflect.TypeOf(in).Elem() + value := reflect.ValueOf(fillValue) + if inType != value.Type() { + return nil, fmt.Errorf( + "Cannot fill '%s' with '%s'", reflect.TypeOf(in), value.Type(), + ) + } + + length := inValue.Len() + newSlice := reflect.SliceOf(reflect.TypeOf(fillValue)) + in = reflect.MakeSlice(newSlice, length, length).Interface() + inValue = reflect.ValueOf(in) + + for i := 0; i < length; i++ { + inValue.Index(i).Set(value) + } + return in, nil +} diff --git a/vendor/github.com/thoas/go-funk/helpers.go b/vendor/github.com/thoas/go-funk/helpers.go index 6c45800c74..da3f032a5d 100644 --- a/vendor/github.com/thoas/go-funk/helpers.go +++ b/vendor/github.com/thoas/go-funk/helpers.go @@ -4,7 +4,6 @@ import ( "bytes" "math/rand" "reflect" - "time" ) var numericZeros = []interface{}{ @@ -76,7 +75,7 @@ func PtrOf(itf interface{}) interface{} { func IsFunction(in interface{}, num ...int) bool { funcType := reflect.TypeOf(in) - result := funcType.Kind() == reflect.Func + result := funcType != nil && funcType.Kind() == reflect.Func if len(num) >= 1 { result = result && funcType.NumIn() == num[0] @@ -89,6 +88,27 @@ func IsFunction(in interface{}, num ...int) bool { return result } +// IsPredicate returns if the argument is a predicate function. +func IsPredicate(in interface{}, inTypes ...reflect.Type) bool { + if len(inTypes) == 0 { + inTypes = append(inTypes, nil) + } + + funcType := reflect.TypeOf(in) + + result := funcType != nil && funcType.Kind() == reflect.Func + + result = result && funcType.NumOut() == 1 && funcType.Out(0).Kind() == reflect.Bool + result = result && funcType.NumIn() == len(inTypes) + + for i := 0; result && i < len(inTypes); i++ { + inType := inTypes[i] + result = inType == nil || inType.ConvertibleTo(funcType.In(i)) + } + + return result +} + // IsEqual returns if the two objects are equal func IsEqual(expected interface{}, actual interface{}) bool { if expected == nil || actual == nil { @@ -129,6 +149,9 @@ func NotEqual(expected interface{}, actual interface{}) bool { // IsIteratee returns if the argument is an iteratee. func IsIteratee(in interface{}) bool { + if in == nil { + return false + } arrType := reflect.TypeOf(in) kind := arrType.Kind() @@ -136,6 +159,15 @@ func IsIteratee(in interface{}) bool { return kind == reflect.Array || kind == reflect.Slice || kind == reflect.Map } +// IsCollection returns if the argument is a collection. +func IsCollection(in interface{}) bool { + arrType := reflect.TypeOf(in) + + kind := arrType.Kind() + + return kind == reflect.Array || kind == reflect.Slice +} + // SliceOf returns a slice which contains the element. func SliceOf(in interface{}) interface{} { value := reflect.ValueOf(in) @@ -149,6 +181,36 @@ func SliceOf(in interface{}) interface{} { return slice.Elem().Interface() } +// Any returns true if any element of the iterable is not empty. If the iterable is empty, return False. +func Any(objs ...interface{}) bool { + if len(objs) == 0 { + return false + } + + for _, obj := range objs { + if !IsEmpty(obj) { + return true + } + } + + return false +} + +// All returns true if all elements of the iterable are not empty (or if the iterable is empty) +func All(objs ...interface{}) bool { + if len(objs) == 0 { + return true + } + + for _, obj := range objs { + if IsEmpty(obj) { + return false + } + } + + return true +} + // IsEmpty returns if the object is considered as empty or not. func IsEmpty(obj interface{}) bool { if obj == nil || obj == "" || obj == false { @@ -214,8 +276,6 @@ func ZeroOf(in interface{}) interface{} { // RandomInt generates a random int, based on a min and max values func RandomInt(min, max int) int { - rand.Seed(time.Now().UTC().UnixNano()) - return min + rand.Intn(max-min) } diff --git a/vendor/github.com/thoas/go-funk/intersection.go b/vendor/github.com/thoas/go-funk/intersection.go new file mode 100644 index 0000000000..17ec69e3ba --- /dev/null +++ b/vendor/github.com/thoas/go-funk/intersection.go @@ -0,0 +1,253 @@ +package funk + +import ( + "reflect" +) + +// Intersect returns the intersection between two collections. +// +// Deprecated: use Join(x, y, InnerJoin) instead of Intersect, InnerJoin +// implements deduplication mechanism, so verify your code behaviour +// before using it +func Intersect(x interface{}, y interface{}) interface{} { + if !IsCollection(x) { + panic("First parameter must be a collection") + } + if !IsCollection(y) { + panic("Second parameter must be a collection") + } + + hash := map[interface{}]struct{}{} + + xValue := reflect.ValueOf(x) + xType := xValue.Type() + + yValue := reflect.ValueOf(y) + yType := yValue.Type() + + if NotEqual(xType, yType) { + panic("Parameters must have the same type") + } + + zType := reflect.SliceOf(xType.Elem()) + zSlice := reflect.MakeSlice(zType, 0, 0) + + for i := 0; i < xValue.Len(); i++ { + v := xValue.Index(i).Interface() + hash[v] = struct{}{} + } + + for i := 0; i < yValue.Len(); i++ { + v := yValue.Index(i).Interface() + _, ok := hash[v] + if ok { + zSlice = reflect.Append(zSlice, yValue.Index(i)) + } + } + + return zSlice.Interface() +} + +// IntersectString returns the intersection between two collections of string. +func IntersectString(x []string, y []string) []string { + if len(x) == 0 || len(y) == 0 { + return []string{} + } + + set := []string{} + hash := map[string]struct{}{} + + for _, v := range x { + hash[v] = struct{}{} + } + + for _, v := range y { + _, ok := hash[v] + if ok { + set = append(set, v) + } + } + + return set +} + +// Difference returns the difference between two collections. +func Difference(x interface{}, y interface{}) (interface{}, interface{}) { + if !IsCollection(x) { + panic("First parameter must be a collection") + } + if !IsCollection(y) { + panic("Second parameter must be a collection") + } + + xValue := reflect.ValueOf(x) + xType := xValue.Type() + + yValue := reflect.ValueOf(y) + yType := yValue.Type() + + if NotEqual(xType, yType) { + panic("Parameters must have the same type") + } + + leftType := reflect.SliceOf(xType.Elem()) + leftSlice := reflect.MakeSlice(leftType, 0, 0) + rightType := reflect.SliceOf(yType.Elem()) + rightSlice := reflect.MakeSlice(rightType, 0, 0) + + for i := 0; i < xValue.Len(); i++ { + v := xValue.Index(i).Interface() + if Contains(y, v) == false { + leftSlice = reflect.Append(leftSlice, xValue.Index(i)) + } + } + + for i := 0; i < yValue.Len(); i++ { + v := yValue.Index(i).Interface() + if Contains(x, v) == false { + rightSlice = reflect.Append(rightSlice, yValue.Index(i)) + } + } + + return leftSlice.Interface(), rightSlice.Interface() +} + +// DifferenceString returns the difference between two collections of strings. +func DifferenceString(x []string, y []string) ([]string, []string) { + leftSlice := []string{} + rightSlice := []string{} + + for _, v := range x { + if ContainsString(y, v) == false { + leftSlice = append(leftSlice, v) + } + } + + for _, v := range y { + if ContainsString(x, v) == false { + rightSlice = append(rightSlice, v) + } + } + + return leftSlice, rightSlice +} + +// DifferenceInt64 returns the difference between two collections of int64s. +func DifferenceInt64(x []int64, y []int64) ([]int64, []int64) { + leftSlice := []int64{} + rightSlice := []int64{} + + for _, v := range x { + if ContainsInt64(y, v) == false { + leftSlice = append(leftSlice, v) + } + } + + for _, v := range y { + if ContainsInt64(x, v) == false { + rightSlice = append(rightSlice, v) + } + } + + return leftSlice, rightSlice +} + +// DifferenceInt32 returns the difference between two collections of ints32. +func DifferenceInt32(x []int32, y []int32) ([]int32, []int32) { + leftSlice := []int32{} + rightSlice := []int32{} + + for _, v := range x { + if !ContainsInt32(y, v) { + leftSlice = append(leftSlice, v) + } + } + + for _, v := range y { + if !ContainsInt32(x, v) { + rightSlice = append(rightSlice, v) + } + } + + return leftSlice, rightSlice +} + +// DifferenceInt returns the difference between two collections of ints. +func DifferenceInt(x []int, y []int) ([]int, []int) { + leftSlice := []int{} + rightSlice := []int{} + + for _, v := range x { + if ContainsInt(y, v) == false { + leftSlice = append(leftSlice, v) + } + } + + for _, v := range y { + if ContainsInt(x, v) == false { + rightSlice = append(rightSlice, v) + } + } + + return leftSlice, rightSlice +} + +// DifferenceUInt returns the difference between two collections of uints. +func DifferenceUInt(x []uint, y []uint) ([]uint, []uint) { + leftSlice := []uint{} + rightSlice := []uint{} + + for _, v := range x { + if !ContainsUInt(y, v) { + leftSlice = append(leftSlice, v) + } + } + + for _, v := range y { + if !ContainsUInt(x, v) { + rightSlice = append(rightSlice, v) + } + } + + return leftSlice, rightSlice +} + +// DifferenceUInt32 returns the difference between two collections of uints32. +func DifferenceUInt32(x []uint32, y []uint32) ([]uint32, []uint32) { + leftSlice := []uint32{} + rightSlice := []uint32{} + + for _, v := range x { + if !ContainsUInt32(y, v) { + leftSlice = append(leftSlice, v) + } + } + + for _, v := range y { + if !ContainsUInt32(x, v) { + rightSlice = append(rightSlice, v) + } + } + + return leftSlice, rightSlice +} + +// DifferenceUInt64 returns the difference between two collections of uints64. +func DifferenceUInt64(x []uint64, y []uint64) ([]uint64, []uint64) { + leftSlice := []uint64{} + rightSlice := []uint64{} + + for _, v := range x { + if !ContainsUInt64(y, v) { + leftSlice = append(leftSlice, v) + } + } + + for _, v := range y { + if !ContainsUInt64(x, v) { + rightSlice = append(rightSlice, v) + } + } + + return leftSlice, rightSlice +} diff --git a/vendor/github.com/thoas/go-funk/join.go b/vendor/github.com/thoas/go-funk/join.go new file mode 100644 index 0000000000..6d0e287777 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/join.go @@ -0,0 +1,86 @@ +package funk + +import ( + "reflect" +) + +type JoinFnc func(lx, rx reflect.Value) reflect.Value + +// Join combines two collections using the given join method. +func Join(larr, rarr interface{}, fnc JoinFnc) interface{} { + if !IsCollection(larr) { + panic("First parameter must be a collection") + } + if !IsCollection(rarr) { + panic("Second parameter must be a collection") + } + + lvalue := reflect.ValueOf(larr) + rvalue := reflect.ValueOf(rarr) + if NotEqual(lvalue.Type(), rvalue.Type()) { + panic("Parameters must have the same type") + } + + return fnc(lvalue, rvalue).Interface() +} + +// InnerJoin finds and returns matching data from two collections. +func InnerJoin(lx, rx reflect.Value) reflect.Value { + result := reflect.MakeSlice(reflect.SliceOf(lx.Type().Elem()), 0, lx.Len()+rx.Len()) + rhash := hashSlice(rx) + lhash := make(map[interface{}]struct{}, lx.Len()) + + for i := 0; i < lx.Len(); i++ { + v := lx.Index(i) + _, ok := rhash[v.Interface()] + _, alreadyExists := lhash[v.Interface()] + if ok && !alreadyExists { + lhash[v.Interface()] = struct{}{} + result = reflect.Append(result, v) + } + } + return result +} + +// OuterJoin finds and returns dissimilar data from two collections. +func OuterJoin(lx, rx reflect.Value) reflect.Value { + ljoin := LeftJoin(lx, rx) + rjoin := RightJoin(lx, rx) + + result := reflect.MakeSlice(reflect.SliceOf(lx.Type().Elem()), ljoin.Len()+rjoin.Len(), ljoin.Len()+rjoin.Len()) + for i := 0; i < ljoin.Len(); i++ { + result.Index(i).Set(ljoin.Index(i)) + } + for i := 0; i < rjoin.Len(); i++ { + result.Index(ljoin.Len() + i).Set(rjoin.Index(i)) + } + + return result +} + +// LeftJoin finds and returns dissimilar data from the first collection (left). +func LeftJoin(lx, rx reflect.Value) reflect.Value { + result := reflect.MakeSlice(reflect.SliceOf(lx.Type().Elem()), 0, lx.Len()) + rhash := hashSlice(rx) + + for i := 0; i < lx.Len(); i++ { + v := lx.Index(i) + _, ok := rhash[v.Interface()] + if !ok { + result = reflect.Append(result, v) + } + } + return result +} + +// LeftJoin finds and returns dissimilar data from the second collection (right). +func RightJoin(lx, rx reflect.Value) reflect.Value { return LeftJoin(rx, lx) } + +func hashSlice(arr reflect.Value) map[interface{}]struct{} { + hash := map[interface{}]struct{}{} + for i := 0; i < arr.Len(); i++ { + v := arr.Index(i).Interface() + hash[v] = struct{}{} + } + return hash +} diff --git a/vendor/github.com/thoas/go-funk/join_primitives.go b/vendor/github.com/thoas/go-funk/join_primitives.go new file mode 100644 index 0000000000..1e449833ba --- /dev/null +++ b/vendor/github.com/thoas/go-funk/join_primitives.go @@ -0,0 +1,385 @@ +package funk + +type JoinIntFnc func(lx, rx []int) []int + +// JoinInt combines two int collections using the given join method. +func JoinInt(larr, rarr []int, fnc JoinIntFnc) []int { + return fnc(larr, rarr) +} + +// InnerJoinInt finds and returns matching data from two int collections. +func InnerJoinInt(lx, rx []int) []int { + result := make([]int, 0, len(lx)+len(rx)) + rhash := hashSliceInt(rx) + lhash := make(map[int]struct{}, len(lx)) + + for _, v := range lx { + _, ok := rhash[v] + _, alreadyExists := lhash[v] + if ok && !alreadyExists { + lhash[v] = struct{}{} + result = append(result, v) + } + } + return result +} + +// OuterJoinInt finds and returns dissimilar data from two int collections. +func OuterJoinInt(lx, rx []int) []int { + ljoin := LeftJoinInt(lx, rx) + rjoin := RightJoinInt(lx, rx) + + result := make([]int, len(ljoin)+len(rjoin)) + for i, v := range ljoin { + result[i] = v + } + for i, v := range rjoin { + result[len(ljoin)+i] = v + } + return result +} + +// LeftJoinInt finds and returns dissimilar data from the first int collection (left). +func LeftJoinInt(lx, rx []int) []int { + result := make([]int, 0, len(lx)) + rhash := hashSliceInt(rx) + + for _, v := range lx { + _, ok := rhash[v] + if !ok { + result = append(result, v) + } + } + return result +} + +// LeftJoinInt finds and returns dissimilar data from the second int collection (right). +func RightJoinInt(lx, rx []int) []int { return LeftJoinInt(rx, lx) } + +func hashSliceInt(arr []int) map[int]struct{} { + hash := make(map[int]struct{}, len(arr)) + for _, i := range arr { + hash[i] = struct{}{} + } + return hash +} + +type JoinInt32Fnc func(lx, rx []int32) []int32 + +// JoinInt32 combines two int32 collections using the given join method. +func JoinInt32(larr, rarr []int32, fnc JoinInt32Fnc) []int32 { + return fnc(larr, rarr) +} + +// InnerJoinInt32 finds and returns matching data from two int32 collections. +func InnerJoinInt32(lx, rx []int32) []int32 { + result := make([]int32, 0, len(lx)+len(rx)) + rhash := hashSliceInt32(rx) + lhash := make(map[int32]struct{}, len(lx)) + + for _, v := range lx { + _, ok := rhash[v] + _, alreadyExists := lhash[v] + if ok && !alreadyExists { + lhash[v] = struct{}{} + result = append(result, v) + } + } + return result +} + +// OuterJoinInt32 finds and returns dissimilar data from two int32 collections. +func OuterJoinInt32(lx, rx []int32) []int32 { + ljoin := LeftJoinInt32(lx, rx) + rjoin := RightJoinInt32(lx, rx) + + result := make([]int32, len(ljoin)+len(rjoin)) + for i, v := range ljoin { + result[i] = v + } + for i, v := range rjoin { + result[len(ljoin)+i] = v + } + return result +} + +// LeftJoinInt32 finds and returns dissimilar data from the first int32 collection (left). +func LeftJoinInt32(lx, rx []int32) []int32 { + result := make([]int32, 0, len(lx)) + rhash := hashSliceInt32(rx) + + for _, v := range lx { + _, ok := rhash[v] + if !ok { + result = append(result, v) + } + } + return result +} + +// LeftJoinInt32 finds and returns dissimilar data from the second int32 collection (right). +func RightJoinInt32(lx, rx []int32) []int32 { return LeftJoinInt32(rx, lx) } + +func hashSliceInt32(arr []int32) map[int32]struct{} { + hash := make(map[int32]struct{}, len(arr)) + for _, i := range arr { + hash[i] = struct{}{} + } + return hash +} + +type JoinInt64Fnc func(lx, rx []int64) []int64 + +// JoinInt64 combines two int64 collections using the given join method. +func JoinInt64(larr, rarr []int64, fnc JoinInt64Fnc) []int64 { + return fnc(larr, rarr) +} + +// InnerJoinInt64 finds and returns matching data from two int64 collections. +func InnerJoinInt64(lx, rx []int64) []int64 { + result := make([]int64, 0, len(lx)+len(rx)) + rhash := hashSliceInt64(rx) + lhash := make(map[int64]struct{}, len(lx)) + + for _, v := range lx { + _, ok := rhash[v] + _, alreadyExists := lhash[v] + if ok && !alreadyExists { + lhash[v] = struct{}{} + result = append(result, v) + } + } + return result +} + +// OuterJoinInt64 finds and returns dissimilar data from two int64 collections. +func OuterJoinInt64(lx, rx []int64) []int64 { + ljoin := LeftJoinInt64(lx, rx) + rjoin := RightJoinInt64(lx, rx) + + result := make([]int64, len(ljoin)+len(rjoin)) + for i, v := range ljoin { + result[i] = v + } + for i, v := range rjoin { + result[len(ljoin)+i] = v + } + return result +} + +// LeftJoinInt64 finds and returns dissimilar data from the first int64 collection (left). +func LeftJoinInt64(lx, rx []int64) []int64 { + result := make([]int64, 0, len(lx)) + rhash := hashSliceInt64(rx) + + for _, v := range lx { + _, ok := rhash[v] + if !ok { + result = append(result, v) + } + } + return result +} + +// LeftJoinInt64 finds and returns dissimilar data from the second int64 collection (right). +func RightJoinInt64(lx, rx []int64) []int64 { return LeftJoinInt64(rx, lx) } + +func hashSliceInt64(arr []int64) map[int64]struct{} { + hash := make(map[int64]struct{}, len(arr)) + for _, i := range arr { + hash[i] = struct{}{} + } + return hash +} + +type JoinStringFnc func(lx, rx []string) []string + +// JoinString combines two string collections using the given join method. +func JoinString(larr, rarr []string, fnc JoinStringFnc) []string { + return fnc(larr, rarr) +} + +// InnerJoinString finds and returns matching data from two string collections. +func InnerJoinString(lx, rx []string) []string { + result := make([]string, 0, len(lx)+len(rx)) + rhash := hashSliceString(rx) + lhash := make(map[string]struct{}, len(lx)) + + for _, v := range lx { + _, ok := rhash[v] + _, alreadyExists := lhash[v] + if ok && !alreadyExists { + lhash[v] = struct{}{} + result = append(result, v) + } + } + return result +} + +// OuterJoinString finds and returns dissimilar data from two string collections. +func OuterJoinString(lx, rx []string) []string { + ljoin := LeftJoinString(lx, rx) + rjoin := RightJoinString(lx, rx) + + result := make([]string, len(ljoin)+len(rjoin)) + for i, v := range ljoin { + result[i] = v + } + for i, v := range rjoin { + result[len(ljoin)+i] = v + } + return result +} + +// LeftJoinString finds and returns dissimilar data from the first string collection (left). +func LeftJoinString(lx, rx []string) []string { + result := make([]string, 0, len(lx)) + rhash := hashSliceString(rx) + + for _, v := range lx { + _, ok := rhash[v] + if !ok { + result = append(result, v) + } + } + return result +} + +// LeftJoinString finds and returns dissimilar data from the second string collection (right). +func RightJoinString(lx, rx []string) []string { return LeftJoinString(rx, lx) } + +func hashSliceString(arr []string) map[string]struct{} { + hash := make(map[string]struct{}, len(arr)) + for _, i := range arr { + hash[i] = struct{}{} + } + return hash +} + +type JoinFloat32Fnc func(lx, rx []float32) []float32 + +// JoinFloat32 combines two float32 collections using the given join method. +func JoinFloat32(larr, rarr []float32, fnc JoinFloat32Fnc) []float32 { + return fnc(larr, rarr) +} + +// InnerJoinFloat32 finds and returns matching data from two float32 collections. +func InnerJoinFloat32(lx, rx []float32) []float32 { + result := make([]float32, 0, len(lx)+len(rx)) + rhash := hashSliceFloat32(rx) + lhash := make(map[float32]struct{}, len(lx)) + + for _, v := range lx { + _, ok := rhash[v] + _, alreadyExists := lhash[v] + if ok && !alreadyExists { + lhash[v] = struct{}{} + result = append(result, v) + } + } + return result +} + +// OuterJoinFloat32 finds and returns dissimilar data from two float32 collections. +func OuterJoinFloat32(lx, rx []float32) []float32 { + ljoin := LeftJoinFloat32(lx, rx) + rjoin := RightJoinFloat32(lx, rx) + + result := make([]float32, len(ljoin)+len(rjoin)) + for i, v := range ljoin { + result[i] = v + } + for i, v := range rjoin { + result[len(ljoin)+i] = v + } + return result +} + +// LeftJoinFloat32 finds and returns dissimilar data from the first float32 collection (left). +func LeftJoinFloat32(lx, rx []float32) []float32 { + result := make([]float32, 0, len(lx)) + rhash := hashSliceFloat32(rx) + + for _, v := range lx { + _, ok := rhash[v] + if !ok { + result = append(result, v) + } + } + return result +} + +// LeftJoinFloat32 finds and returns dissimilar data from the second float32 collection (right). +func RightJoinFloat32(lx, rx []float32) []float32 { return LeftJoinFloat32(rx, lx) } + +func hashSliceFloat32(arr []float32) map[float32]struct{} { + hash := make(map[float32]struct{}, len(arr)) + for _, i := range arr { + hash[i] = struct{}{} + } + return hash +} + +type JoinFloat64Fnc func(lx, rx []float64) []float64 + +// JoinFloat64 combines two float64 collections using the given join method. +func JoinFloat64(larr, rarr []float64, fnc JoinFloat64Fnc) []float64 { + return fnc(larr, rarr) +} + +// InnerJoinFloat64 finds and returns matching data from two float64 collections. +func InnerJoinFloat64(lx, rx []float64) []float64 { + result := make([]float64, 0, len(lx)+len(rx)) + rhash := hashSliceFloat64(rx) + lhash := make(map[float64]struct{}, len(lx)) + + for _, v := range lx { + _, ok := rhash[v] + _, alreadyExists := lhash[v] + if ok && !alreadyExists { + lhash[v] = struct{}{} + result = append(result, v) + } + } + return result +} + +// OuterJoinFloat64 finds and returns dissimilar data from two float64 collections. +func OuterJoinFloat64(lx, rx []float64) []float64 { + ljoin := LeftJoinFloat64(lx, rx) + rjoin := RightJoinFloat64(lx, rx) + + result := make([]float64, len(ljoin)+len(rjoin)) + for i, v := range ljoin { + result[i] = v + } + for i, v := range rjoin { + result[len(ljoin)+i] = v + } + return result +} + +// LeftJoinFloat64 finds and returns dissimilar data from the first float64 collection (left). +func LeftJoinFloat64(lx, rx []float64) []float64 { + result := make([]float64, 0, len(lx)) + rhash := hashSliceFloat64(rx) + + for _, v := range lx { + _, ok := rhash[v] + if !ok { + result = append(result, v) + } + } + return result +} + +// LeftJoinFloat64 finds and returns dissimilar data from the second float64 collection (right). +func RightJoinFloat64(lx, rx []float64) []float64 { return LeftJoinFloat64(rx, lx) } + +func hashSliceFloat64(arr []float64) map[float64]struct{} { + hash := make(map[float64]struct{}, len(arr)) + for _, i := range arr { + hash[i] = struct{}{} + } + return hash +} diff --git a/vendor/github.com/thoas/go-funk/lazy_builder.go b/vendor/github.com/thoas/go-funk/lazy_builder.go new file mode 100644 index 0000000000..9ba1907ea1 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/lazy_builder.go @@ -0,0 +1,117 @@ +package funk + +import "reflect" + +type lazyBuilder struct { + exec func() interface{} +} + +func (b *lazyBuilder) Chunk(size int) Builder { + return &lazyBuilder{func() interface{} { return Chunk(b.exec(), size) }} +} +func (b *lazyBuilder) Compact() Builder { + return &lazyBuilder{func() interface{} { return Compact(b.exec()) }} +} +func (b *lazyBuilder) Drop(n int) Builder { + return &lazyBuilder{func() interface{} { return Drop(b.exec(), n) }} +} +func (b *lazyBuilder) Filter(predicate interface{}) Builder { + return &lazyBuilder{func() interface{} { return Filter(b.exec(), predicate) }} +} +func (b *lazyBuilder) Flatten() Builder { + return &lazyBuilder{func() interface{} { return Flatten(b.exec()) }} +} +func (b *lazyBuilder) FlattenDeep() Builder { + return &lazyBuilder{func() interface{} { return FlattenDeep(b.exec()) }} +} +func (b *lazyBuilder) Initial() Builder { + return &lazyBuilder{func() interface{} { return Initial(b.exec()) }} +} +func (b *lazyBuilder) Intersect(y interface{}) Builder { + return &lazyBuilder{func() interface{} { return Intersect(b.exec(), y) }} +} +func (b *lazyBuilder) Join(rarr interface{}, fnc JoinFnc) Builder { + return &lazyBuilder{func() interface{} { return Join(b.exec(), rarr, fnc) }} +} +func (b *lazyBuilder) Map(mapFunc interface{}) Builder { + return &lazyBuilder{func() interface{} { return Map(b.exec(), mapFunc) }} +} +func (b *lazyBuilder) FlatMap(mapFunc interface{}) Builder { + return &lazyBuilder{func() interface{} { return FlatMap(b.exec(), mapFunc) }} +} +func (b *lazyBuilder) Reverse() Builder { + return &lazyBuilder{func() interface{} { return Reverse(b.exec()) }} +} +func (b *lazyBuilder) Shuffle() Builder { + return &lazyBuilder{func() interface{} { return Shuffle(b.exec()) }} +} +func (b *lazyBuilder) Tail() Builder { + return &lazyBuilder{func() interface{} { return Tail(b.exec()) }} +} +func (b *lazyBuilder) Uniq() Builder { + return &lazyBuilder{func() interface{} { return Uniq(b.exec()) }} +} +func (b *lazyBuilder) Without(values ...interface{}) Builder { + return &lazyBuilder{func() interface{} { return Without(b.exec(), values...) }} +} + +func (b *lazyBuilder) All() bool { + return (&chainBuilder{b.exec()}).All() +} +func (b *lazyBuilder) Any() bool { + return (&chainBuilder{b.exec()}).Any() +} +func (b *lazyBuilder) Contains(elem interface{}) bool { + return Contains(b.exec(), elem) +} +func (b *lazyBuilder) Every(elements ...interface{}) bool { + return Every(b.exec(), elements...) +} +func (b *lazyBuilder) Find(predicate interface{}) interface{} { + return Find(b.exec(), predicate) +} +func (b *lazyBuilder) ForEach(predicate interface{}) { + ForEach(b.exec(), predicate) +} +func (b *lazyBuilder) ForEachRight(predicate interface{}) { + ForEachRight(b.exec(), predicate) +} +func (b *lazyBuilder) Head() interface{} { + return Head(b.exec()) +} +func (b *lazyBuilder) Keys() interface{} { + return Keys(b.exec()) +} +func (b *lazyBuilder) IndexOf(elem interface{}) int { + return IndexOf(b.exec(), elem) +} +func (b *lazyBuilder) IsEmpty() bool { + return IsEmpty(b.exec()) +} +func (b *lazyBuilder) Last() interface{} { + return Last(b.exec()) +} +func (b *lazyBuilder) LastIndexOf(elem interface{}) int { + return LastIndexOf(b.exec(), elem) +} +func (b *lazyBuilder) NotEmpty() bool { + return NotEmpty(b.exec()) +} +func (b *lazyBuilder) Product() float64 { + return Product(b.exec()) +} +func (b *lazyBuilder) Reduce(reduceFunc, acc interface{}) interface{} { + return Reduce(b.exec(), reduceFunc, acc) +} +func (b *lazyBuilder) Sum() float64 { + return Sum(b.exec()) +} +func (b *lazyBuilder) Type() reflect.Type { + return reflect.TypeOf(b.exec()) +} +func (b *lazyBuilder) Value() interface{} { + return b.exec() +} +func (b *lazyBuilder) Values() interface{} { + return Values(b.exec()) +} diff --git a/vendor/github.com/thoas/go-funk/max.go b/vendor/github.com/thoas/go-funk/max.go new file mode 100644 index 0000000000..4b3914fcd4 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/max.go @@ -0,0 +1,194 @@ +package funk + +import "strings" + +// MaxInt validates the input, compares the elements and returns the maximum element in an array/slice. +// It accepts []int +// It returns int or nil +// It returns nil for the following cases: +// - input is of length 0 +func MaxInt(i []int) interface{} { + if len(i) == 0 { + return nil + } + var max int + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + max = item + continue + } + if item > max { + max = item + } + } + return max +} + +// MaxInt8 validates the input, compares the elements and returns the maximum element in an array/slice. +// It accepts []int8 +// It returns int8 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MaxInt8(i []int8) interface{} { + if len(i) == 0 { + return nil + } + var max int8 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + max = item + continue + } + if item > max { + max = item + } + } + return max +} + +// MaxInt16 validates the input, compares the elements and returns the maximum element in an array/slice. +// It accepts []int16 +// It returns int16 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MaxInt16(i []int16) interface{} { + if len(i) == 0 { + return nil + } + var max int16 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + max = item + continue + } + if item > max { + max = item + } + } + return max +} + +// MaxInt32 validates the input, compares the elements and returns the maximum element in an array/slice. +// It accepts []int32 +// It returns int32 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MaxInt32(i []int32) interface{} { + if len(i) == 0 { + return nil + } + var max int32 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + max = item + continue + } + if item > max { + max = item + } + } + return max +} + +// MaxInt64 validates the input, compares the elements and returns the maximum element in an array/slice. +// It accepts []int64 +// It returns int64 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MaxInt64(i []int64) interface{} { + if len(i) == 0 { + return nil + } + var max int64 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + max = item + continue + } + if item > max { + max = item + } + } + return max +} + +// MaxFloat32 validates the input, compares the elements and returns the maximum element in an array/slice. +// It accepts []float32 +// It returns float32 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MaxFloat32(i []float32) interface{} { + if len(i) == 0 { + return nil + } + var max float32 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + max = item + continue + } + if item > max { + max = item + } + } + return max +} + +// MaxFloat64 validates the input, compares the elements and returns the maximum element in an array/slice. +// It accepts []float64 +// It returns float64 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MaxFloat64(i []float64) interface{} { + if len(i) == 0 { + return nil + } + var max float64 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + max = item + continue + } + if item > max { + max = item + } + } + return max +} + +// MaxString validates the input, compares the elements and returns the maximum element in an array/slice. +// It accepts []string +// It returns string or nil +// It returns nil for the following cases: +// - input is of length 0 +func MaxString(i []string) interface{} { + if len(i) == 0 { + return nil + } + var max string + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + max = item + continue + } + max = compareStringsMax(max, item) + } + return max +} + +// compareStrings uses the strings.Compare method to compare two strings, and returns the greater one. +func compareStringsMax(max, current string) string { + r := strings.Compare(strings.ToLower(max), strings.ToLower(current)) + if r > 0 { + return max + } + return current +} \ No newline at end of file diff --git a/vendor/github.com/thoas/go-funk/min.go b/vendor/github.com/thoas/go-funk/min.go new file mode 100644 index 0000000000..e880f7cf99 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/min.go @@ -0,0 +1,193 @@ +package funk + +import "strings" + +// MinInt validates the input, compares the elements and returns the minimum element in an array/slice. +// It accepts []int +// It returns int or nil +// It returns nil for the following cases: +// - input is of length 0 +func MinInt(i []int) interface{} { + if len(i) == 0 { + return nil + } + var min int + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + min = item + continue + } + if item < min { + min = item + } + } + return min +} + +// MinInt8 validates the input, compares the elements and returns the minimum element in an array/slice. +// It accepts []int8 +// It returns int8 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MinInt8(i []int8) interface{} { + if len(i) == 0 { + return nil + } + var min int8 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + min = item + continue + } + if item < min { + min = item + } + } + return min +} + +// MinInt16 validates the input, compares the elements and returns the minimum element in an array/slice. +// It accepts []int16 +// It returns int16 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MinInt16(i []int16) interface{} { + if len(i) == 0 { + return nil + } + var min int16 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + min = item + continue + } + if item < min { + min = item + } + } + return min +} + +// MinInt32 validates the input, compares the elements and returns the minimum element in an array/slice. +// It accepts []int32 +// It returns int32 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MinInt32(i []int32) interface{} { + if len(i) == 0 { + return nil + } + var min int32 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + min = item + continue + } + if item < min { + min = item + } + } + return min +} + +// MinInt64 validates the input, compares the elements and returns the minimum element in an array/slice. +// It accepts []int64 +// It returns int64 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MinInt64(i []int64) interface{} { + if len(i) == 0 { + return nil + } + var min int64 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + min = item + continue + } + if item < min { + min = item + } + } + return min +} + +// MinFloat32 validates the input, compares the elements and returns the minimum element in an array/slice. +// It accepts []float32 +// It returns float32 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MinFloat32(i []float32) interface{} { + if len(i) == 0 { + return nil + } + var min float32 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + min = item + continue + } + if item < min { + min = item + } + } + return min +} + +// MinFloat64 validates the input, compares the elements and returns the minimum element in an array/slice. +// It accepts []float64 +// It returns float64 or nil +// It returns nil for the following cases: +// - input is of length 0 +func MinFloat64(i []float64) interface{} { + if len(i) == 0 { + return nil + } + var min float64 + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + min = item + continue + } + if item < min { + min = item + } + } + return min +} + +// MinString validates the input, compares the elements and returns the minimum element in an array/slice. +// It accepts []string +// It returns string or nil +// It returns nil for the following cases: +// - input is of length 0 +func MinString(i []string) interface{} { + if len(i) == 0 { + return nil + } + var min string + for idx := 0; idx < len(i); idx++ { + item := i[idx] + if idx == 0 { + min = item + continue + } + min = compareStringsMin(min, item) + } + return min +} + +func compareStringsMin(min, current string) string { + r := strings.Compare(strings.ToLower(min), strings.ToLower(current)) + if r < 0 { + return min + } + return current +} \ No newline at end of file diff --git a/vendor/github.com/thoas/go-funk/operation.go b/vendor/github.com/thoas/go-funk/operation.go index 3c7dbe6abd..170948b4a6 100644 --- a/vendor/github.com/thoas/go-funk/operation.go +++ b/vendor/github.com/thoas/go-funk/operation.go @@ -5,8 +5,7 @@ import ( "reflect" ) -// Sum computes the sum of the values in array. -func Sum(arr interface{}) float64 { +func calculate(arr interface{}, name string, operation rune) float64 { value := redirectValue(reflect.ValueOf(arr)) valueType := value.Type() @@ -19,25 +18,52 @@ func Sum(arr interface{}) float64 { return 0 } - result := 0.0 + result := map[rune]float64{ + '+': 0.0, + '*': 1, + }[operation] for i := 0; i < length; i++ { elem := redirectValue(value.Index(i)).Interface() - switch elem.(type) { + var value float64 + switch e := elem.(type) { case int: - result += float64(elem.(int)) + value = float64(e) + case int8: + value = float64(e) + case int16: + value = float64(e) + case int32: + value = float64(e) case int64: - result += float64(elem.(int64)) + value = float64(e) case float32: - result += float64(elem.(float32)) + value = float64(e) case float64: - result += elem.(float64) + value = e + } + + switch operation { + case '+': + result += value + case '*': + result *= value } } return result } - panic(fmt.Sprintf("Type %s is not supported by Sum", valueType.String())) + panic(fmt.Sprintf("Type %s is not supported by %s", valueType.String(), name)) +} + +// Sum computes the sum of the values in array. +func Sum(arr interface{}) float64 { + return calculate(arr, "Sum", '+') +} + +// Product computes the product of the values in array. +func Product(arr interface{}) float64 { + return calculate(arr, "Product", '*') } diff --git a/vendor/github.com/thoas/go-funk/permutation.go b/vendor/github.com/thoas/go-funk/permutation.go new file mode 100644 index 0000000000..0b10993062 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/permutation.go @@ -0,0 +1,29 @@ +package funk + +import "errors" + +// NextPermutation Implement next permutation, +// which rearranges numbers into the lexicographically next greater permutation of numbers. +func NextPermutation(nums []int) error { + n := len(nums) + if n == 0 { + return errors.New("nums is empty") + } + + i := n - 2 + + for i >= 0 && nums[i] >= nums[i+1] { + i-- + } + + if i >= 0 { + j := n - 1 + for j >= 0 && nums[i] >= nums[j] { + j-- + } + nums[i], nums[j] = nums[j], nums[i] + } + + ReverseInt(nums[i+1:]) + return nil +} diff --git a/vendor/github.com/thoas/go-funk/predicate.go b/vendor/github.com/thoas/go-funk/predicate.go new file mode 100644 index 0000000000..e6b4131de2 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/predicate.go @@ -0,0 +1,47 @@ +package funk + +import ( + "reflect" +) + +// predicatesImpl contains the common implementation of AnyPredicates and AllPredicates. +func predicatesImpl(value interface{}, wantedAnswer bool, predicates interface{}) bool { + if !IsCollection(predicates) { + panic("Predicates parameter must be an iteratee") + } + + predicatesValue := reflect.ValueOf(predicates) + inputValue := reflect.ValueOf(value) + + for i := 0; i < predicatesValue.Len(); i++ { + funcValue := predicatesValue.Index(i) + if !IsFunction(funcValue.Interface()) { + panic("Got non function as predicate") + } + + funcType := funcValue.Type() + if !IsPredicate(funcValue.Interface()) { + panic("Predicate function must have 1 parameter and must return boolean") + } + + if !inputValue.Type().ConvertibleTo(funcType.In(0)) { + panic("Given value is not compatible with type of parameter for the predicate.") + } + if result := funcValue.Call([]reflect.Value{inputValue}); wantedAnswer == result[0].Bool() { + return wantedAnswer + } + } + + return !wantedAnswer +} + +// AnyPredicates gets a value and a series of predicates, and return true if at least one of the predicates +// is true. +func AnyPredicates(value interface{}, predicates interface{}) bool { + return predicatesImpl(value, true, predicates) +} + +// AllPredicates gets a value and a series of predicates, and return true if all of the predicates are true. +func AllPredicates(value interface{}, predicates interface{}) bool { + return predicatesImpl(value, false, predicates) +} diff --git a/vendor/github.com/thoas/go-funk/presence.go b/vendor/github.com/thoas/go-funk/presence.go index 7aa4333e90..9ab0f0f427 100644 --- a/vendor/github.com/thoas/go-funk/presence.go +++ b/vendor/github.com/thoas/go-funk/presence.go @@ -1,6 +1,7 @@ package funk import ( + "fmt" "reflect" "strings" ) @@ -50,6 +51,13 @@ func Filter(arr interface{}, predicate interface{}) interface{} { // Find iterates over elements of collection, returning the first // element predicate returns truthy for. func Find(arr interface{}, predicate interface{}) interface{} { + _, val := FindKey(arr, predicate) + return val +} + +// Find iterates over elements of collection, returning the first +// element of an array and random of a map which predicate returns truthy for. +func FindKey(arr interface{}, predicate interface{}) (matchKey, matchEle interface{}) { if !IsIteratee(arr) { panic("First parameter must be an iteratee") } @@ -67,18 +75,33 @@ func Find(arr interface{}, predicate interface{}) interface{} { } arrValue := reflect.ValueOf(arr) + var keyArrs []reflect.Value + isMap := arrValue.Kind() == reflect.Map + if isMap { + keyArrs = arrValue.MapKeys() + } for i := 0; i < arrValue.Len(); i++ { - elem := arrValue.Index(i) + var ( + elem reflect.Value + key reflect.Value + ) + if isMap { + key = keyArrs[i] + elem = arrValue.MapIndex(key) + } else { + key = reflect.ValueOf(i) + elem = arrValue.Index(i) + } result := funcValue.Call([]reflect.Value{elem})[0].Interface().(bool) if result { - return elem.Interface() + return key.Interface(), elem.Interface() } } - return nil + return nil, nil } // IndexOf gets the index at which the first occurrence of value is found in array or return -1 @@ -95,8 +118,9 @@ func IndexOf(in interface{}, elem interface{}) int { } if inType.Kind() == reflect.Slice { + equalTo := equal(elem) for i := 0; i < inValue.Len(); i++ { - if equal(inValue.Index(i).Interface(), elem) { + if equalTo(reflect.Value{}, inValue.Index(i)) { return i } } @@ -121,8 +145,9 @@ func LastIndexOf(in interface{}, elem interface{}) int { if inType.Kind() == reflect.Slice { length := inValue.Len() + equalTo := equal(elem) for i := length - 1; i >= 0; i-- { - if equal(inValue.Index(i).Interface(), elem) { + if equalTo(reflect.Value{}, inValue.Index(i)) { return i } } @@ -134,31 +159,49 @@ func LastIndexOf(in interface{}, elem interface{}) int { // Contains returns true if an element is present in a iteratee. func Contains(in interface{}, elem interface{}) bool { inValue := reflect.ValueOf(in) - elemValue := reflect.ValueOf(elem) - inType := inValue.Type() - if inType.Kind() == reflect.String { + switch inType.Kind() { + case reflect.String: return strings.Contains(inValue.String(), elemValue.String()) - } - - if inType.Kind() == reflect.Map { - keys := inValue.MapKeys() - for i := 0; i < len(keys); i++ { - if equal(keys[i].Interface(), elem) { + case reflect.Map: + equalTo := equal(elem, true) + for _, key := range inValue.MapKeys() { + if equalTo(key, inValue.MapIndex(key)) { return true } } - } - - if inType.Kind() == reflect.Slice { + case reflect.Slice, reflect.Array: + equalTo := equal(elem) for i := 0; i < inValue.Len(); i++ { - if equal(inValue.Index(i).Interface(), elem) { + if equalTo(reflect.Value{}, inValue.Index(i)) { return true } } + default: + panic(fmt.Sprintf("Type %s is not supported by Contains, supported types are String, Map, Slice, Array", inType.String())) } return false } + +// Every returns true if every element is present in a iteratee. +func Every(in interface{}, elements ...interface{}) bool { + for _, elem := range elements { + if !Contains(in, elem) { + return false + } + } + return true +} + +// Some returns true if atleast one element is present in an iteratee. +func Some(in interface{}, elements ...interface{}) bool { + for _, elem := range elements { + if Contains(in, elem) { + return true + } + } + return false +} diff --git a/vendor/github.com/thoas/go-funk/reduce.go b/vendor/github.com/thoas/go-funk/reduce.go new file mode 100644 index 0000000000..579b82254d --- /dev/null +++ b/vendor/github.com/thoas/go-funk/reduce.go @@ -0,0 +1,87 @@ +package funk + +import ( + "reflect" +) + +// Reduce takes a collection and reduces it to a single value using a reduction +// function (or a valid symbol) and an accumulator value. +func Reduce(arr, reduceFunc, acc interface{}) interface{} { + arrValue := redirectValue(reflect.ValueOf(arr)) + + if !IsIteratee(arrValue.Interface()) { + panic("First parameter must be an iteratee") + } + + returnType := reflect.TypeOf(Reduce).Out(0) + + isFunc := IsFunction(reduceFunc, 2, 1) + isRune := reflect.TypeOf(reduceFunc).Kind() == reflect.Int32 + + if !(isFunc || isRune) { + panic("Second argument must be a valid function or rune") + } + + accValue := reflect.ValueOf(acc) + sliceElemType := sliceElem(arrValue.Type()) + + if isRune { + if arrValue.Kind() == reflect.Slice && sliceElemType.Kind() == reflect.Interface { + accValue = accValue.Convert(returnType) + } else { + accValue = accValue.Convert(sliceElemType) + } + } else { + accValue = accValue.Convert(reflect.TypeOf(reduceFunc).In(0)) + } + + accType := accValue.Type() + + // Generate reduce function if was passed as rune + if isRune { + reduceSign := reduceFunc.(int32) + + if ok := map[rune]bool{'+': true, '*': true}[reduceSign]; !ok { + panic("Invalid reduce sign, allowed: '+' and '*'") + } + + in := []reflect.Type{accType, sliceElemType} + out := []reflect.Type{accType} + funcType := reflect.FuncOf(in, out, false) + + reduceFunc = reflect.MakeFunc(funcType, func(args []reflect.Value) []reflect.Value { + acc := args[0].Interface() + elem := args[1].Interface() + + var result float64 + params := []interface{}{acc, elem} + switch reduceSign { + case '+': + result = Sum(params) + case '*': + result = Product(params) + } + + return []reflect.Value{reflect.ValueOf(result).Convert(accType)} + }).Interface() + } + + funcValue := reflect.ValueOf(reduceFunc) + funcType := funcValue.Type() + + for i := 0; i < arrValue.Len(); i++ { + if accType.ConvertibleTo(funcType.In(0)) { + accValue = accValue.Convert(funcType.In(0)) + } + + arrElementValue := arrValue.Index(i) + if sliceElemType.ConvertibleTo(funcType.In(1)) { + arrElementValue = arrElementValue.Convert(funcType.In(1)) + } + + result := funcValue.Call([]reflect.Value{accValue, arrElementValue}) + accValue = result[0] + } + + return accValue.Convert(returnType).Interface() +} diff --git a/vendor/github.com/thoas/go-funk/retrieve.go b/vendor/github.com/thoas/go-funk/retrieve.go index e1daeb80db..5a358fe0a6 100644 --- a/vendor/github.com/thoas/go-funk/retrieve.go +++ b/vendor/github.com/thoas/go-funk/retrieve.go @@ -9,7 +9,7 @@ import ( func Get(out interface{}, path string) interface{} { result := get(reflect.ValueOf(out), path) - if result.Kind() != reflect.Invalid { + if result.Kind() != reflect.Invalid && !result.IsZero() { return result.Interface() } @@ -22,12 +22,20 @@ func get(value reflect.Value, path string) reflect.Value { length := value.Len() + if length == 0 { + zeroElement := reflect.Zero(value.Type().Elem()) + pathValue := get(zeroElement, path) + value = reflect.MakeSlice(reflect.SliceOf(pathValue.Type()), 0, 0) + + return value + } + for i := 0; i < length; i++ { item := value.Index(i) resultValue := get(item, path) - if resultValue.Kind() == reflect.Invalid { + if resultValue.Kind() == reflect.Invalid || resultValue.IsZero() { continue } @@ -43,7 +51,7 @@ func get(value reflect.Value, path string) reflect.Value { } // if the result is a slice of a slice, we need to flatten it - if resultSlice.Type().Elem().Kind() == reflect.Slice { + if resultSlice.Kind() != reflect.Invalid && resultSlice.Type().Elem().Kind() == reflect.Slice { return flattenDeep(resultSlice) } @@ -56,20 +64,30 @@ func get(value reflect.Value, path string) reflect.Value { value = redirectValue(value) kind := value.Kind() - if kind == reflect.Invalid { + switch kind { + case reflect.Invalid: continue - } - - if kind == reflect.Struct { + case reflect.Struct: value = value.FieldByName(part) - continue - } - - if kind == reflect.Slice || kind == reflect.Array { + case reflect.Map: + value = value.MapIndex(reflect.ValueOf(part)) + case reflect.Slice, reflect.Array: value = get(value, part) - continue + default: + return reflect.ValueOf(nil) } } return value } + +// Get retrieves the value of the pointer or default. +func GetOrElse(v interface{}, def interface{}) interface{} { + val := reflect.ValueOf(v) + if v == nil || (val.Kind() == reflect.Ptr && val.IsNil()) { + return def + } else if val.Kind() != reflect.Ptr { + return v + } + return val.Elem().Interface() +} diff --git a/vendor/github.com/thoas/go-funk/short_if.go b/vendor/github.com/thoas/go-funk/short_if.go new file mode 100644 index 0000000000..537ff56f0a --- /dev/null +++ b/vendor/github.com/thoas/go-funk/short_if.go @@ -0,0 +1,8 @@ +package funk + +func ShortIf(condition bool, a interface{}, b interface{}) interface{} { + if condition { + return a + } + return b +} diff --git a/vendor/github.com/thoas/go-funk/subset.go b/vendor/github.com/thoas/go-funk/subset.go new file mode 100644 index 0000000000..de47be1517 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/subset.go @@ -0,0 +1,41 @@ +package funk + +import ( + "reflect" +) + +// Subset returns true if collection x is a subset of y. +func Subset(x interface{}, y interface{}) bool { + if !IsCollection(x) { + panic("First parameter must be a collection") + } + if !IsCollection(y) { + panic("Second parameter must be a collection") + } + + xValue := reflect.ValueOf(x) + xType := xValue.Type() + + yValue := reflect.ValueOf(y) + yType := yValue.Type() + + if NotEqual(xType, yType) { + panic("Parameters must have the same type") + } + + if xValue.Len() == 0 { + return true + } + + if yValue.Len() == 0 || yValue.Len() < xValue.Len() { + return false + } + + for i := 0; i < xValue.Len(); i++ { + if !Contains(yValue.Interface(), xValue.Index(i).Interface()) { + return false + } + } + + return true +} diff --git a/vendor/github.com/thoas/go-funk/subtraction.go b/vendor/github.com/thoas/go-funk/subtraction.go new file mode 100644 index 0000000000..10a0a98202 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/subtraction.go @@ -0,0 +1,87 @@ +package funk + +import ( + "reflect" +) + +// Subtract returns the subtraction between two collections. +func Subtract(x interface{}, y interface{}) interface{} { + if !IsCollection(x) { + panic("First parameter must be a collection") + } + if !IsCollection(y) { + panic("Second parameter must be a collection") + } + + hash := map[interface{}]struct{}{} + + xValue := reflect.ValueOf(x) + xType := xValue.Type() + + yValue := reflect.ValueOf(y) + yType := yValue.Type() + + if NotEqual(xType, yType) { + panic("Parameters must have the same type") + } + + zType := reflect.SliceOf(xType.Elem()) + zSlice := reflect.MakeSlice(zType, 0, 0) + + for i := 0; i < xValue.Len(); i++ { + v := xValue.Index(i).Interface() + hash[v] = struct{}{} + } + + for i := 0; i < yValue.Len(); i++ { + v := yValue.Index(i).Interface() + _, ok := hash[v] + if ok { + delete(hash, v) + } + } + + for i := 0; i < xValue.Len(); i++ { + v := xValue.Index(i).Interface() + _, ok := hash[v] + if ok { + zSlice = reflect.Append(zSlice, xValue.Index(i)) + } + } + + return zSlice.Interface() +} + +// SubtractString returns the subtraction between two collections of string +func SubtractString(x []string, y []string) []string { + if len(x) == 0 { + return []string{} + } + + if len(y) == 0 { + return x + } + + slice := []string{} + hash := map[string]struct{}{} + + for _, v := range x { + hash[v] = struct{}{} + } + + for _, v := range y { + _, ok := hash[v] + if ok { + delete(hash, v) + } + } + + for _, v := range x { + _, ok := hash[v] + if ok { + slice = append(slice, v) + } + } + + return slice +} diff --git a/vendor/github.com/thoas/go-funk/transform.go b/vendor/github.com/thoas/go-funk/transform.go index b8cd6d478f..e4fd65bb26 100644 --- a/vendor/github.com/thoas/go-funk/transform.go +++ b/vendor/github.com/thoas/go-funk/transform.go @@ -4,6 +4,7 @@ import ( "fmt" "math/rand" "reflect" + "strings" ) // Chunk creates an array of elements split into groups with the length of size. @@ -14,6 +15,10 @@ func Chunk(arr interface{}, size int) interface{} { panic("First parameter must be neither array nor slice") } + if size == 0 { + return arr + } + arrValue := reflect.ValueOf(arr) arrType := arrValue.Type() @@ -93,11 +98,11 @@ func ToMap(in interface{}, pivot string) interface{} { return collection.Interface() } -func mapSlice(arrValue reflect.Value, funcValue reflect.Value) interface{} { +func mapSlice(arrValue reflect.Value, funcValue reflect.Value) reflect.Value { funcType := funcValue.Type() - if funcType.NumIn() != 1 || funcType.NumOut() == 0 { - panic("Map function with an array must have one parameter and must return at least one parameter") + if funcType.NumIn() != 1 || funcType.NumOut() == 0 || funcType.NumOut() > 2 { + panic("Map function with an array must have one parameter and must return one or two parameters") } arrElemType := arrValue.Type().Elem() @@ -120,7 +125,7 @@ func mapSlice(arrValue reflect.Value, funcValue reflect.Value) interface{} { resultSlice = reflect.Append(resultSlice, result) } - return resultSlice.Interface() + return resultSlice } if funcType.NumOut() == 2 { @@ -136,17 +141,17 @@ func mapSlice(arrValue reflect.Value, funcValue reflect.Value) interface{} { collection.SetMapIndex(results[0], results[1]) } - return collection.Interface() + return collection } - return nil + return reflect.Value{} } -func mapMap(arrValue reflect.Value, funcValue reflect.Value) interface{} { +func mapMap(arrValue reflect.Value, funcValue reflect.Value) reflect.Value { funcType := funcValue.Type() - if funcType.NumIn() != 2 { - panic("Map function with an array must have one parameter") + if funcType.NumIn() != 2 || funcType.NumOut() == 0 || funcType.NumOut() > 2 { + panic("Map function with a map must have two parameters and must return one or two parameters") } // Only one returned parameter, should be a slice @@ -165,7 +170,7 @@ func mapMap(arrValue reflect.Value, funcValue reflect.Value) interface{} { resultSlice = reflect.Append(resultSlice, result) } - return resultSlice.Interface() + return resultSlice } // two parameters, should be a map @@ -183,14 +188,24 @@ func mapMap(arrValue reflect.Value, funcValue reflect.Value) interface{} { } - return collection.Interface() + return collection } - return nil + return reflect.Value{} } // Map manipulates an iteratee and transforms it to another type. func Map(arr interface{}, mapFunc interface{}) interface{} { + result := mapFn(arr, mapFunc, "Map") + + if result.IsValid() { + return result.Interface() + } + + return nil +} + +func mapFn(arr interface{}, mapFunc interface{}, funcName string) reflect.Value { if !IsIteratee(arr) { panic("First parameter must be an iteratee") } @@ -209,13 +224,50 @@ func Map(arr interface{}, mapFunc interface{}) interface{} { if kind == reflect.Slice || kind == reflect.Array { return mapSlice(arrValue, funcValue) + } else if kind == reflect.Map { + return mapMap(arrValue, funcValue) } - if kind == reflect.Map { - return mapMap(arrValue, funcValue) + panic(fmt.Sprintf("Type %s is not supported by "+funcName, arrType.String())) +} + +// FlatMap manipulates an iteratee and transforms it to a flattened collection of another type. +func FlatMap(arr interface{}, mapFunc interface{}) interface{} { + result := mapFn(arr, mapFunc, "FlatMap") + + if result.IsValid() { + return flatten(result).Interface() + } + + return nil +} + +// Flatten flattens a two-dimensional array. +func Flatten(out interface{}) interface{} { + return flatten(reflect.ValueOf(out)).Interface() +} + +func flatten(value reflect.Value) reflect.Value { + sliceType := value.Type() + + if (value.Kind() != reflect.Slice && value.Kind() != reflect.Array) || + (sliceType.Elem().Kind() != reflect.Slice && sliceType.Elem().Kind() != reflect.Array) { + panic("Argument must be an array or slice of at least two dimensions") + } + + resultSliceType := sliceType.Elem().Elem() + + resultSlice := reflect.MakeSlice(reflect.SliceOf(resultSliceType), 0, 0) + + length := value.Len() + + for i := 0; i < length; i++ { + item := value.Index(i) + + resultSlice = reflect.AppendSlice(resultSlice, item) } - panic(fmt.Sprintf("Type %s is not supported by Map", arrType.String())) + return resultSlice } // FlattenDeep recursively flattens array. @@ -228,10 +280,10 @@ func flattenDeep(value reflect.Value) reflect.Value { resultSlice := reflect.MakeSlice(reflect.SliceOf(sliceType), 0, 0) - return flatten(value, resultSlice) + return flattenRecursive(value, resultSlice) } -func flatten(value reflect.Value, result reflect.Value) reflect.Value { +func flattenRecursive(value reflect.Value, result reflect.Value) reflect.Value { length := value.Len() for i := 0; i < length; i++ { @@ -239,7 +291,7 @@ func flatten(value reflect.Value, result reflect.Value) reflect.Value { kind := item.Kind() if kind == reflect.Slice || kind == reflect.Array { - result = flatten(item, result) + result = flattenRecursive(item, result) } else { result = reflect.Append(result, item) } @@ -309,6 +361,8 @@ func Uniq(in interface{}) interface{} { if kind == reflect.Array || kind == reflect.Slice { length := value.Len() + result := makeSlice(value, 0) + seen := make(map[interface{}]bool, length) j := 0 @@ -321,12 +375,181 @@ func Uniq(in interface{}) interface{} { } seen[v] = true - value.Index(j).Set(val) + result = reflect.Append(result, val) j++ } - return value.Slice(0, j).Interface() + return result.Interface() } panic(fmt.Sprintf("Type %s is not supported by Uniq", valueType.String())) } + +// ConvertSlice converts a slice type to another, +// a perfect example would be to convert a slice of struct to a slice of interface. +func ConvertSlice(in interface{}, out interface{}) { + srcValue := reflect.ValueOf(in) + + dstValue := reflect.ValueOf(out) + + if dstValue.Kind() != reflect.Ptr { + panic("Second argument must be a pointer") + } + + dstValue = dstValue.Elem() + + if srcValue.Kind() != reflect.Slice && srcValue.Kind() != reflect.Array { + panic("First argument must be an array or slice") + } + + if dstValue.Kind() != reflect.Slice && dstValue.Kind() != reflect.Array { + panic("Second argument must be an array or slice") + } + + // returns value that points to dstValue + direct := reflect.Indirect(dstValue) + + length := srcValue.Len() + + for i := 0; i < length; i++ { + dstValue = reflect.Append(dstValue, srcValue.Index(i)) + } + + direct.Set(dstValue) +} + +// Drop creates an array/slice with `n` elements dropped from the beginning. +func Drop(in interface{}, n int) interface{} { + value := reflect.ValueOf(in) + valueType := value.Type() + + kind := value.Kind() + + if kind == reflect.Array || kind == reflect.Slice { + length := value.Len() + + resultSlice := makeSlice(value, length-n) + + j := 0 + for i := n; i < length; i++ { + resultSlice.Index(j).Set(value.Index(i)) + j++ + } + + return resultSlice.Interface() + + } + + panic(fmt.Sprintf("Type %s is not supported by Drop", valueType.String())) +} + +// Prune returns a copy of "in" that only contains fields in "paths" +// which are looked up using struct field name. +// For lookup paths by field tag instead, use funk.PruneByTag() +func Prune(in interface{}, paths []string) (interface{}, error) { + return pruneByTag(in, paths, nil /*tag*/) +} + +// pruneByTag returns a copy of "in" that only contains fields in "paths" +// which are looked up using struct field Tag "tag". +func PruneByTag(in interface{}, paths []string, tag string) (interface{}, error) { + return pruneByTag(in, paths, &tag) +} + +// pruneByTag returns a copy of "in" that only contains fields in "paths" +// which are looked up using struct field Tag "tag". If tag is nil, +// traverse paths using struct field name +func pruneByTag(in interface{}, paths []string, tag *string) (interface{}, error) { + + inValue := reflect.ValueOf(in) + + ret := reflect.New(inValue.Type()).Elem() + + for _, path := range paths { + parts := strings.Split(path, ".") + if err := prune(inValue, ret, parts, tag); err != nil { + return nil, err + } + } + return ret.Interface(), nil +} + +func prune(inValue reflect.Value, ret reflect.Value, parts []string, tag *string) error { + + if len(parts) == 0 { + // we reached the location that ret needs to hold inValue + // Note: The value at the end of the path is not copied, maybe we need to change. + // ret and the original data holds the same reference to this value + ret.Set(inValue) + return nil + } + + inKind := inValue.Kind() + + switch inKind { + case reflect.Ptr: + if inValue.IsNil() { + // TODO validate + return nil + } + if ret.IsNil() { + // init ret and go to next level + ret.Set(reflect.New(inValue.Type().Elem())) + } + return prune(inValue.Elem(), ret.Elem(), parts, tag) + case reflect.Struct: + part := parts[0] + var fValue reflect.Value + var fRet reflect.Value + if tag == nil { + // use field name + fValue = inValue.FieldByName(part) + if !fValue.IsValid() { + return fmt.Errorf("field name %v is not found in struct %v", part, inValue.Type().String()) + } + fRet = ret.FieldByName(part) + } else { + // search tag that has key equal to part + found := false + for i := 0; i < inValue.NumField(); i++ { + f := inValue.Type().Field(i) + if key, ok := f.Tag.Lookup(*tag); ok { + if key == part { + fValue = inValue.Field(i) + fRet = ret.Field(i) + found = true + break + } + } + } + if !found { + return fmt.Errorf("Struct tag %v is not found with key %v", *tag, part) + } + } + // init Ret is zero and go down one more level + if fRet.IsZero() { + fRet.Set(reflect.New(fValue.Type()).Elem()) + } + return prune(fValue, fRet, parts[1:], tag) + case reflect.Array, reflect.Slice: + // set all its elements + length := inValue.Len() + // init ret + if ret.IsZero() { + if inKind == reflect.Slice { + ret.Set(reflect.MakeSlice(inValue.Type(), length /*len*/, length /*cap*/)) + } else { // array + ret.Set(reflect.New(inValue.Type()).Elem()) + } + } + for j := 0; j < length; j++ { + if err := prune(inValue.Index(j), ret.Index(j), parts, tag); err != nil { + return err + } + } + default: + return fmt.Errorf("path %v cannot be looked up on kind of %v", strings.Join(parts, "."), inValue.Kind()) + } + + return nil +} diff --git a/vendor/github.com/thoas/go-funk/typesafe.go b/vendor/github.com/thoas/go-funk/typesafe.go index fd8bd01442..3242dc02dc 100644 --- a/vendor/github.com/thoas/go-funk/typesafe.go +++ b/vendor/github.com/thoas/go-funk/typesafe.go @@ -1,17 +1,39 @@ package funk -import "math/rand" +import ( + "math/rand" +) // InInts is an alias of ContainsInt, returns true if an int is present in a iteratee. func InInts(s []int, v int) bool { return ContainsInt(s, v) } +// InInt32s is an alias of ContainsInt32, returns true if an int32 is present in a iteratee. +func InInt32s(s []int32, v int32) bool { + return ContainsInt32(s, v) +} + // InInt64s is an alias of ContainsInt64, returns true if an int64 is present in a iteratee. func InInt64s(s []int64, v int64) bool { return ContainsInt64(s, v) } +// InUInts is an alias of ContainsUInt, returns true if an uint is present in a iteratee. +func InUInts(s []uint, v uint) bool { + return ContainsUInt(s, v) +} + +// InUInt32s is an alias of ContainsUInt32, returns true if an uint32 is present in a iteratee. +func InUInt32s(s []uint32, v uint32) bool { + return ContainsUInt32(s, v) +} + +// InUInt64s is an alias of ContainsUInt64, returns true if an uint64 is present in a iteratee. +func InUInt64s(s []uint64, v uint64) bool { + return ContainsUInt64(s, v) +} + // InStrings is an alias of ContainsString, returns true if a string is present in a iteratee. func InStrings(s []string, v string) bool { return ContainsString(s, v) @@ -69,6 +91,20 @@ func FindInt(s []int, cb func(s int) bool) (int, bool) { return 0, false } +// FindInt32 iterates over a collection of int32, returning the first +// int32 element predicate returns truthy for. +func FindInt32(s []int32, cb func(s int32) bool) (int32, bool) { + for _, i := range s { + result := cb(i) + + if result { + return i, true + } + } + + return 0, false +} + // FindInt64 iterates over a collection of int64, returning the first // int64 element predicate returns truthy for. func FindInt64(s []int64, cb func(s int64) bool) (int64, bool) { @@ -145,6 +181,22 @@ func FilterInt(s []int, cb func(s int) bool) []int { return results } +// FilterInt32 iterates over a collection of int32, returning an array of +// all int32 elements predicate returns truthy for. +func FilterInt32(s []int32, cb func(s int32) bool) []int32 { + results := []int32{} + + for _, i := range s { + result := cb(i) + + if result { + results = append(results, i) + } + } + + return results +} + // FilterInt64 iterates over a collection of int64, returning an array of // all int64 elements predicate returns truthy for. func FilterInt64(s []int64, cb func(s int64) bool) []int64 { @@ -161,6 +213,54 @@ func FilterInt64(s []int64, cb func(s int64) bool) []int64 { return results } +// FilterUInt iterates over a collection of uint, returning an array of +// all uint elements predicate returns truthy for. +func FilterUInt(s []uint, cb func(s uint) bool) []uint { + results := []uint{} + + for _, i := range s { + result := cb(i) + + if result { + results = append(results, i) + } + } + + return results +} + +// FilterUInt32 iterates over a collection of uint32, returning an array of +// all uint32 elements predicate returns truthy for. +func FilterUInt32(s []uint32, cb func(s uint32) bool) []uint32 { + results := []uint32{} + + for _, i := range s { + result := cb(i) + + if result { + results = append(results, i) + } + } + + return results +} + +// FilterUInt64 iterates over a collection of uint64, returning an array of +// all uint64 elements predicate returns truthy for. +func FilterUInt64(s []uint64, cb func(s uint64) bool) []uint64 { + results := []uint64{} + + for _, i := range s { + result := cb(i) + + if result { + results = append(results, i) + } + } + + return results +} + // FilterString iterates over a collection of string, returning an array of // all string elements predicate returns truthy for. func FilterString(s []string, cb func(s string) bool) []string { @@ -187,6 +287,16 @@ func ContainsInt(s []int, v int) bool { return false } +// ContainsInt32 returns true if an int32 is present in a iteratee. +func ContainsInt32(s []int32, v int32) bool { + for _, vv := range s { + if vv == v { + return true + } + } + return false +} + // ContainsInt64 returns true if an int64 is present in a iteratee. func ContainsInt64(s []int64, v int64) bool { for _, vv := range s { @@ -197,6 +307,37 @@ func ContainsInt64(s []int64, v int64) bool { return false } +// ContainsUInt returns true if an uint is present in a iteratee. +func ContainsUInt(s []uint, v uint) bool { + for _, vv := range s { + if vv == v { + return true + } + } + return false +} + +// ContainsUInt32 returns true if an uint32 is present in a iteratee. +func ContainsUInt32(s []uint32, v uint32) bool { + for _, vv := range s { + if vv == v { + return true + } + } + return false +} + +// ContainsUInt64 returns true if an uint64 is present in a iteratee. +func ContainsUInt64(s []uint64, v uint64) bool { + for _, vv := range s { + if vv == v { + return true + } + } + return false +} + + // ContainsString returns true if a string is present in a iteratee. func ContainsString(s []string, v string) bool { for _, vv := range s { @@ -227,6 +368,14 @@ func ContainsFloat64(s []float64, v float64) bool { return false } +// SumInt32 sums a int32 iteratee and returns the sum of all elements +func SumInt32(s []int32) (sum int32) { + for _, v := range s { + sum += v + } + return +} + // SumInt64 sums a int64 iteratee and returns the sum of all elements func SumInt64(s []int64) (sum int64) { for _, v := range s { @@ -243,6 +392,30 @@ func SumInt(s []int) (sum int) { return } +// SumUInt32 sums a uint32 iteratee and returns the sum of all elements +func SumUInt32(s []uint32) (sum uint32) { + for _, v := range s { + sum += v + } + return +} + +// SumUInt64 sums a uint64 iteratee and returns the sum of all elements +func SumUInt64(s []uint64) (sum uint64) { + for _, v := range s { + sum += v + } + return +} + +// SumUInt sums a uint iteratee and returns the sum of all elements +func SumUInt(s []uint) (sum uint) { + for _, v := range s { + sum += v + } + return +} + // SumFloat64 sums a float64 iteratee and returns the sum of all elements func SumFloat64(s []float64) (sum float64) { for _, v := range s { @@ -275,6 +448,14 @@ func ReverseInt(s []int) []int { return s } +// ReverseInt32 reverses an array of int32 +func ReverseInt32(s []int32) []int32 { + for i, j := 0, len(s)-1; i < len(s)/2; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } + return s +} + // ReverseInt64 reverses an array of int64 func ReverseInt64(s []int64) []int64 { for i, j := 0, len(s)-1; i < len(s)/2; i, j = i+1, j-1 { @@ -283,6 +464,30 @@ func ReverseInt64(s []int64) []int64 { return s } +// ReverseUInt reverses an array of int +func ReverseUInt(s []uint) []uint { + for i, j := 0, len(s)-1; i < len(s)/2; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } + return s +} + +// ReverseUInt32 reverses an array of uint32 +func ReverseUInt32(s []uint32) []uint32 { + for i, j := 0, len(s)-1; i < len(s)/2; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } + return s +} + +// ReverseUInt64 reverses an array of uint64 +func ReverseUInt64(s []uint64) []uint64 { + for i, j := 0, len(s)-1; i < len(s)/2; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } + return s +} + // ReverseFloat64 reverses an array of float64 func ReverseFloat64(s []float64) []float64 { for i, j := 0, len(s)-1; i < len(s)/2; i, j = i+1, j-1 { @@ -323,12 +528,36 @@ func IndexOfInt(a []int, x int) int { return indexOf(len(a), func(i int) bool { return a[i] == x }) } +// IndexOfInt32 gets the index at which the first occurrence of an int32 value is found in array or return -1 +// if the value cannot be found +func IndexOfInt32(a []int32, x int32) int { + return indexOf(len(a), func(i int) bool { return a[i] == x }) +} + // IndexOfInt64 gets the index at which the first occurrence of an int64 value is found in array or return -1 // if the value cannot be found func IndexOfInt64(a []int64, x int64) int { return indexOf(len(a), func(i int) bool { return a[i] == x }) } +// IndexOfUInt gets the index at which the first occurrence of an uint value is found in array or return -1 +// if the value cannot be found +func IndexOfUInt(a []uint, x uint) int { + return indexOf(len(a), func(i int) bool { return a[i] == x }) +} + +// IndexOfUInt32 gets the index at which the first occurrence of an uint32 value is found in array or return -1 +// if the value cannot be found +func IndexOfUInt32(a []uint32, x uint32) int { + return indexOf(len(a), func(i int) bool { return a[i] == x }) +} + +// IndexOfUInt64 gets the index at which the first occurrence of an uint64 value is found in array or return -1 +// if the value cannot be found +func IndexOfUInt64(a []uint64, x uint64) int { + return indexOf(len(a), func(i int) bool { return a[i] == x }) +} + // IndexOfFloat64 gets the index at which the first occurrence of an float64 value is found in array or return -1 // if the value cannot be found func IndexOfFloat64(a []float64, x float64) int { @@ -342,7 +571,7 @@ func IndexOfString(a []string, x string) int { } func lastIndexOf(n int, f func(int) bool) int { - for i := n - 1; i > 0; i-- { + for i := n - 1; i >= 0; i-- { if f(i) { return i } @@ -356,12 +585,36 @@ func LastIndexOfInt(a []int, x int) int { return lastIndexOf(len(a), func(i int) bool { return a[i] == x }) } +// LastIndexOfInt32 gets the index at which the first occurrence of an int32 value is found in array or return -1 +// if the value cannot be found +func LastIndexOfInt32(a []int32, x int32) int { + return lastIndexOf(len(a), func(i int) bool { return a[i] == x }) +} + // LastIndexOfInt64 gets the index at which the first occurrence of an int64 value is found in array or return -1 // if the value cannot be found func LastIndexOfInt64(a []int64, x int64) int { return lastIndexOf(len(a), func(i int) bool { return a[i] == x }) } +// LastIndexOfUInt gets the index at which the first occurrence of an uint value is found in array or return -1 +// if the value cannot be found +func LastIndexOfUInt(a []uint, x uint) int { + return lastIndexOf(len(a), func(i int) bool { return a[i] == x }) +} + +// LastIndexOfUInt32 gets the index at which the first occurrence of an uint32 value is found in array or return -1 +// if the value cannot be found +func LastIndexOfUInt32(a []uint32, x uint32) int { + return lastIndexOf(len(a), func(i int) bool { return a[i] == x }) +} + +// LastIndexOfUInt64 gets the index at which the first occurrence of an uint64 value is found in array or return -1 +// if the value cannot be found +func LastIndexOfUInt64(a []uint64, x uint64) int { + return lastIndexOf(len(a), func(i int) bool { return a[i] == x }) +} + // LastIndexOfFloat64 gets the index at which the first occurrence of an float64 value is found in array or return -1 // if the value cannot be found func LastIndexOfFloat64(a []float64, x float64) int { @@ -380,11 +633,33 @@ func LastIndexOfString(a []string, x string) int { return lastIndexOf(len(a), func(i int) bool { return a[i] == x }) } +// UniqInt32 creates an array of int32 with unique values. +func UniqInt32(a []int32) []int32 { + length := len(a) + + seen := make(map[int32]struct{}, length) + j := 0 + + for i := 0; i < length; i++ { + v := a[i] + + if _, ok := seen[v]; ok { + continue + } + + seen[v] = struct{}{} + a[j] = v + j++ + } + + return a[0:j] +} + // UniqInt64 creates an array of int64 with unique values. func UniqInt64(a []int64) []int64 { length := len(a) - seen := make(map[int64]bool, length) + seen := make(map[int64]struct{}, length) j := 0 for i := 0; i < length; i++ { @@ -394,7 +669,7 @@ func UniqInt64(a []int64) []int64 { continue } - seen[v] = true + seen[v] = struct{}{} a[j] = v j++ } @@ -406,7 +681,29 @@ func UniqInt64(a []int64) []int64 { func UniqInt(a []int) []int { length := len(a) - seen := make(map[int]bool, length) + seen := make(map[int]struct{}, length) + j := 0 + + for i := 0; i < length; i++ { + v := a[i] + + if _, ok := seen[v]; ok { + continue + } + + seen[v] = struct{}{} + a[j] = v + j++ + } + + return a[0:j] +} + +// UniqUInt32 creates an array of uint32 with unique values. +func UniqUInt32(a []uint32) []uint32 { + length := len(a) + + seen := make(map[uint32]struct{}, length) j := 0 for i := 0; i < length; i++ { @@ -416,7 +713,51 @@ func UniqInt(a []int) []int { continue } - seen[v] = true + seen[v] = struct{}{} + a[j] = v + j++ + } + + return a[0:j] +} + +// UniqUInt64 creates an array of uint64 with unique values. +func UniqUInt64(a []uint64) []uint64 { + length := len(a) + + seen := make(map[uint64]struct{}, length) + j := 0 + + for i := 0; i < length; i++ { + v := a[i] + + if _, ok := seen[v]; ok { + continue + } + + seen[v] = struct{}{} + a[j] = v + j++ + } + + return a[0:j] +} + +// UniqUInt creates an array of uint with unique values. +func UniqUInt(a []uint) []uint { + length := len(a) + + seen := make(map[uint]struct{}, length) + j := 0 + + for i := 0; i < length; i++ { + v := a[i] + + if _, ok := seen[v]; ok { + continue + } + + seen[v] = struct{}{} a[j] = v j++ } @@ -428,7 +769,7 @@ func UniqInt(a []int) []int { func UniqString(a []string) []string { length := len(a) - seen := make(map[string]bool, length) + seen := make(map[string]struct{}, length) j := 0 for i := 0; i < length; i++ { @@ -438,7 +779,7 @@ func UniqString(a []string) []string { continue } - seen[v] = true + seen[v] = struct{}{} a[j] = v j++ } @@ -450,7 +791,7 @@ func UniqString(a []string) []string { func UniqFloat64(a []float64) []float64 { length := len(a) - seen := make(map[float64]bool, length) + seen := make(map[float64]struct{}, length) j := 0 for i := 0; i < length; i++ { @@ -460,7 +801,7 @@ func UniqFloat64(a []float64) []float64 { continue } - seen[v] = true + seen[v] = struct{}{} a[j] = v j++ } @@ -472,7 +813,7 @@ func UniqFloat64(a []float64) []float64 { func UniqFloat32(a []float32) []float32 { length := len(a) - seen := make(map[float32]bool, length) + seen := make(map[float32]struct{}, length) j := 0 for i := 0; i < length; i++ { @@ -482,7 +823,7 @@ func UniqFloat32(a []float32) []float32 { continue } - seen[v] = true + seen[v] = struct{}{} a[j] = v j++ } @@ -500,6 +841,16 @@ func ShuffleInt(a []int) []int { return a } +// ShuffleInt32 creates an array of int32 shuffled values using Fisher–Yates algorithm +func ShuffleInt32(a []int32) []int32 { + for i := range a { + j := rand.Intn(i + 1) + a[i], a[j] = a[j], a[i] + } + + return a +} + // ShuffleInt64 creates an array of int64 shuffled values using Fisher–Yates algorithm func ShuffleInt64(a []int64) []int64 { for i := range a { @@ -510,6 +861,36 @@ func ShuffleInt64(a []int64) []int64 { return a } +// ShuffleUInt creates an array of int shuffled values using Fisher–Yates algorithm +func ShuffleUInt(a []uint) []uint { + for i := range a { + j := rand.Intn(i + 1) + a[i], a[j] = a[j], a[i] + } + + return a +} + +// ShuffleUInt32 creates an array of uint32 shuffled values using Fisher–Yates algorithm +func ShuffleUInt32(a []uint32) []uint32 { + for i := range a { + j := rand.Intn(i + 1) + a[i], a[j] = a[j], a[i] + } + + return a +} + +// ShuffleUInt64 creates an array of uint64 shuffled values using Fisher–Yates algorithm +func ShuffleUInt64(a []uint64) []uint64 { + for i := range a { + j := rand.Intn(i + 1) + a[i], a[j] = a[j], a[i] + } + + return a +} + // ShuffleString creates an array of string shuffled values using Fisher–Yates algorithm func ShuffleString(a []string) []string { for i := range a { @@ -539,3 +920,48 @@ func ShuffleFloat64(a []float64) []float64 { return a } + +// DropString creates a slice with `n` strings dropped from the beginning. +func DropString(s []string, n int) []string { + return s[n:] +} + +// DropInt creates a slice with `n` ints dropped from the beginning. +func DropInt(s []int, n int) []int { + return s[n:] +} + +// DropInt32 creates a slice with `n` int32s dropped from the beginning. +func DropInt32(s []int32, n int) []int32 { + return s[n:] +} + +// DropInt64 creates a slice with `n` int64s dropped from the beginning. +func DropInt64(s []int64, n int) []int64 { + return s[n:] +} + +// DropUInt creates a slice with `n` ints dropped from the beginning. +func DropUInt(s []uint, n uint) []uint { + return s[n:] +} + +// DropUInt32 creates a slice with `n` int32s dropped from the beginning. +func DropUInt32(s []uint32, n int) []uint32 { + return s[n:] +} + +// DropUInt64 creates a slice with `n` int64s dropped from the beginning. +func DropUInt64(s []uint64, n int) []uint64 { + return s[n:] +} + +// DropFloat32 creates a slice with `n` float32s dropped from the beginning. +func DropFloat32(s []float32, n int) []float32 { + return s[n:] +} + +// DropFloat64 creates a slice with `n` float64s dropped from the beginning. +func DropFloat64(s []float64, n int) []float64 { + return s[n:] +} diff --git a/vendor/github.com/thoas/go-funk/utils.go b/vendor/github.com/thoas/go-funk/utils.go index 657484b708..43d9a2be73 100644 --- a/vendor/github.com/thoas/go-funk/utils.go +++ b/vendor/github.com/thoas/go-funk/utils.go @@ -1,14 +1,57 @@ package funk -import "reflect" +import ( + "fmt" + "reflect" +) -func equal(expected, actual interface{}) bool { - if expected == nil || actual == nil { - return expected == actual +func equal(expectedOrPredicate interface{}, optionalIsMap ...bool) func(keyValueIfMap, actualValue reflect.Value) bool { + isMap := append(optionalIsMap, false)[0] + + if IsFunction(expectedOrPredicate) { + inTypes := []reflect.Type{nil}; if isMap { + inTypes = append(inTypes, nil) + } + + if !IsPredicate(expectedOrPredicate, inTypes...) { + panic(fmt.Sprintf("Predicate function must have %d parameter and must return boolean", len(inTypes))) + } + + predicateValue := reflect.ValueOf(expectedOrPredicate) + + return func(keyValueIfMap, actualValue reflect.Value) bool { + + if isMap && !keyValueIfMap.Type().ConvertibleTo(predicateValue.Type().In(0)) { + panic("Given key is not compatible with type of parameter for the predicate.") + } + + if (isMap && !actualValue.Type().ConvertibleTo(predicateValue.Type().In(1))) || + (!isMap && !actualValue.Type().ConvertibleTo(predicateValue.Type().In(0))) { + panic("Given value is not compatible with type of parameter for the predicate.") + } + + args := []reflect.Value{actualValue} + if isMap { + args = append([]reflect.Value{keyValueIfMap}, args...) + } + + return predicateValue.Call(args)[0].Bool() + } } - return reflect.DeepEqual(expected, actual) + expected := expectedOrPredicate + return func(keyValueIfMap, actualValue reflect.Value) bool { + if isMap { + actualValue = keyValueIfMap + } + + if expected == nil || actualValue.IsZero() { + return actualValue.Interface() == expected + } + + return reflect.DeepEqual(actualValue.Interface(), expected) + } } func sliceElem(rtype reflect.Type) reflect.Type { @@ -23,17 +66,21 @@ func sliceElem(rtype reflect.Type) reflect.Type { func redirectValue(value reflect.Value) reflect.Value { for { - if !value.IsValid() || value.Kind() != reflect.Ptr { + if !value.IsValid() || (value.Kind() != reflect.Ptr && value.Kind() != reflect.Interface) { return value } - res := reflect.Indirect(value) + res := value.Elem() // Test for a circular type. - if res.Kind() == reflect.Ptr && value.Pointer() == res.Pointer() { + if res.Kind() == reflect.Ptr && value.Kind() == reflect.Ptr && value.Pointer() == res.Pointer() { return value } + if !res.IsValid() && value.Kind() == reflect.Ptr { + return reflect.Zero(value.Type().Elem()) + } + value = res } } diff --git a/vendor/github.com/thoas/go-funk/without.go b/vendor/github.com/thoas/go-funk/without.go new file mode 100644 index 0000000000..6e35e98699 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/without.go @@ -0,0 +1,19 @@ +package funk + +import "reflect" + +// Without creates an array excluding all given values. +func Without(in interface{}, values ...interface{}) interface{} { + if !IsCollection(in) { + panic("First parameter must be a collection") + } + + inValue := reflect.ValueOf(in) + for _, value := range values { + if NotEqual(inValue.Type().Elem(), reflect.TypeOf(value)) { + panic("Values must have the same type") + } + } + + return LeftJoin(inValue, reflect.ValueOf(values)).Interface() +} diff --git a/vendor/github.com/thoas/go-funk/zip.go b/vendor/github.com/thoas/go-funk/zip.go new file mode 100644 index 0000000000..f9056bc419 --- /dev/null +++ b/vendor/github.com/thoas/go-funk/zip.go @@ -0,0 +1,46 @@ +package funk + +import ( + "reflect" +) + +// Tuple is the return type of Zip +type Tuple struct { + Element1 interface{} + Element2 interface{} +} + +// Zip returns a list of tuples, where the i-th tuple contains the i-th element +// from each of the input iterables. The returned list is truncated in length +// to the length of the shortest input iterable. +func Zip(slice1 interface{}, slice2 interface{}) []Tuple { + inValue1 := reflect.ValueOf(slice1) + inValue2 := reflect.ValueOf(slice2) + kind1 := inValue1.Type().Kind() + kind2 := inValue2.Type().Kind() + + result := []Tuple{} + for _, kind := range []reflect.Kind{kind1, kind2} { + if kind != reflect.Slice && kind != reflect.Array { + return result + } + } + + var minLength int + length1 := inValue1.Len() + length2 := inValue2.Len() + if length1 <= length2 { + minLength = length1 + } else { + minLength = length2 + } + + for i := 0; i < minLength; i++ { + newTuple := Tuple{ + Element1: inValue1.Index(i).Interface(), + Element2: inValue2.Index(i).Interface(), + } + result = append(result, newTuple) + } + return result +} diff --git a/vendor/github.com/vbauerster/mpb/v4/bar.go b/vendor/github.com/vbauerster/mpb/v4/bar.go deleted file mode 100644 index 2eb74e2ccf..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/bar.go +++ /dev/null @@ -1,464 +0,0 @@ -package mpb - -import ( - "bytes" - "context" - "fmt" - "io" - "io/ioutil" - "log" - "strings" - "time" - "unicode/utf8" - - "github.com/vbauerster/mpb/v4/decor" -) - -// Filler interface. -// Bar renders by calling Filler's Fill method. You can literally have -// any bar kind, by implementing this interface and passing it to the -// *Progress.Add method. -type Filler interface { - Fill(w io.Writer, width int, stat *decor.Statistics) -} - -// FillerFunc is function type adapter to convert function into Filler. -type FillerFunc func(w io.Writer, width int, stat *decor.Statistics) - -func (f FillerFunc) Fill(w io.Writer, width int, stat *decor.Statistics) { - f(w, width, stat) -} - -// BaseFiller interface. -// If you ever need to implement a custom Filler based on mpb.NewBarFiller, -// then you may need to implement this one as well, in order to retain -// functionality of some `BarOption`s and method like *Bar.SetRefill. -type BaseFiller interface { - BaseFiller() Filler -} - -// Bar represents a progress Bar. -type Bar struct { - priority int // used by heap - index int // used by heap - - extendedLines int - toShutdown bool - toDrop bool - noPop bool - operateState chan func(*bState) - frameCh chan io.Reader - syncTableCh chan [][]chan int - completed chan bool - - // cancel is called either by user or on complete event - cancel func() - // done is closed after cacheState is assigned - done chan struct{} - // cacheState is populated, right after close(shutdown) - cacheState *bState - - container *Progress - dlogger *log.Logger - recoveredPanic interface{} -} - -type extFunc func(in io.Reader, tw int, st *decor.Statistics) (out io.Reader, lines int) - -type bState struct { - baseF Filler - filler Filler - id int - width int - total int64 - current int64 - trimSpace bool - toComplete bool - completeFlushed bool - noPop bool - aDecorators []decor.Decorator - pDecorators []decor.Decorator - mDecorators []decor.Decorator - amountReceivers []decor.AmountReceiver - shutdownListeners []decor.ShutdownListener - averageAdjusters []decor.AverageAdjuster - bufP, bufB, bufA *bytes.Buffer - extender extFunc - - // priority overrides *Bar's priority, if set - priority int - // dropOnComplete propagates to *Bar - dropOnComplete bool - // runningBar is a key for *pState.parkedBars - runningBar *Bar - - debugOut io.Writer -} - -func newBar(container *Progress, bs *bState) *Bar { - logPrefix := fmt.Sprintf("%sbar#%02d ", container.dlogger.Prefix(), bs.id) - ctx, cancel := context.WithCancel(container.ctx) - - bar := &Bar{ - container: container, - priority: bs.priority, - toDrop: bs.dropOnComplete, - noPop: bs.noPop, - operateState: make(chan func(*bState)), - frameCh: make(chan io.Reader, 1), - syncTableCh: make(chan [][]chan int), - completed: make(chan bool, 1), - done: make(chan struct{}), - cancel: cancel, - dlogger: log.New(bs.debugOut, logPrefix, log.Lshortfile), - } - - go bar.serve(ctx, bs) - return bar -} - -// RemoveAllPrependers removes all prepend functions. -func (b *Bar) RemoveAllPrependers() { - select { - case b.operateState <- func(s *bState) { s.pDecorators = nil }: - case <-b.done: - } -} - -// RemoveAllAppenders removes all append functions. -func (b *Bar) RemoveAllAppenders() { - select { - case b.operateState <- func(s *bState) { s.aDecorators = nil }: - case <-b.done: - } -} - -// ProxyReader wraps r with metrics required for progress tracking. -func (b *Bar) ProxyReader(r io.Reader) io.ReadCloser { - if r == nil { - return nil - } - rc, ok := r.(io.ReadCloser) - if !ok { - rc = ioutil.NopCloser(r) - } - return &proxyReader{rc, b, time.Now()} -} - -// ID returs id of the bar. -func (b *Bar) ID() int { - result := make(chan int) - select { - case b.operateState <- func(s *bState) { result <- s.id }: - return <-result - case <-b.done: - return b.cacheState.id - } -} - -// Current returns bar's current number, in other words sum of all increments. -func (b *Bar) Current() int64 { - result := make(chan int64) - select { - case b.operateState <- func(s *bState) { result <- s.current }: - return <-result - case <-b.done: - return b.cacheState.current - } -} - -// SetRefill sets refill, if supported by underlying Filler. -// Useful for resume-able tasks. -func (b *Bar) SetRefill(amount int64) { - type refiller interface { - SetRefill(int64) - } - b.operateState <- func(s *bState) { - if f, ok := s.baseF.(refiller); ok { - f.SetRefill(amount) - } - } -} - -// AdjustAverageDecorators updates start time of all average decorators. -// Useful for resume-able tasks. -func (b *Bar) AdjustAverageDecorators(startTime time.Time) { - b.operateState <- func(s *bState) { - for _, adjuster := range s.averageAdjusters { - adjuster.AverageAdjust(startTime) - } - } -} - -// TraverseDecorators traverses all available decorators and calls cb func on each. -func (b *Bar) TraverseDecorators(cb decor.CBFunc) { - b.operateState <- func(s *bState) { - for _, decorators := range [...][]decor.Decorator{ - s.pDecorators, - s.aDecorators, - s.mDecorators, - } { - for _, d := range decorators { - cb(d) - } - } - } -} - -// SetTotal sets total dynamically. -// Set complete to true, to trigger bar complete event now. -func (b *Bar) SetTotal(total int64, complete bool) { - select { - case b.operateState <- func(s *bState) { - s.total = total - if complete && !s.toComplete { - s.current = s.total - s.toComplete = true - go b.refreshNowTillShutdown() - } - }: - case <-b.done: - } -} - -// SetCurrent sets progress' current to arbitrary amount. -func (b *Bar) SetCurrent(current int64, wdd ...time.Duration) { - select { - case b.operateState <- func(s *bState) { - for _, ar := range s.amountReceivers { - ar.NextAmount(current-s.current, wdd...) - } - s.current = current - if s.total > 0 && s.current >= s.total { - s.current = s.total - s.toComplete = true - go b.refreshNowTillShutdown() - } - }: - case <-b.done: - } -} - -// Increment is a shorthand for b.IncrInt64(1, wdd...). -func (b *Bar) Increment(wdd ...time.Duration) { - b.IncrInt64(1, wdd...) -} - -// IncrBy is a shorthand for b.IncrInt64(int64(n), wdd...). -func (b *Bar) IncrBy(n int, wdd ...time.Duration) { - b.IncrInt64(int64(n), wdd...) -} - -// IncrInt64 increments progress bar by amount of n. wdd is an optional -// work duration i.e. time.Since(start), which expected to be passed, -// if any ewma based decorator is used. -func (b *Bar) IncrInt64(n int64, wdd ...time.Duration) { - select { - case b.operateState <- func(s *bState) { - for _, ar := range s.amountReceivers { - ar.NextAmount(n, wdd...) - } - s.current += n - if s.total > 0 && s.current >= s.total { - s.current = s.total - s.toComplete = true - go b.refreshNowTillShutdown() - } - }: - case <-b.done: - } -} - -// SetPriority changes bar's order among multiple bars. Zero is highest -// priority, i.e. bar will be on top. If you don't need to set priority -// dynamically, better use BarPriority option. -func (b *Bar) SetPriority(priority int) { - select { - case <-b.done: - default: - b.container.setBarPriority(b, priority) - } -} - -// Abort interrupts bar's running goroutine. Call this, if you'd like -// to stop/remove bar before completion event. It has no effect after -// completion event. If drop is true bar will be removed as well. -func (b *Bar) Abort(drop bool) { - select { - case <-b.done: - default: - if drop { - b.container.dropBar(b) - } - b.cancel() - } -} - -// Completed reports whether the bar is in completed state. -func (b *Bar) Completed() bool { - select { - case b.operateState <- func(s *bState) { b.completed <- s.toComplete }: - return <-b.completed - case <-b.done: - return true - } -} - -func (b *Bar) serve(ctx context.Context, s *bState) { - defer b.container.bwg.Done() - for { - select { - case op := <-b.operateState: - op(s) - case <-ctx.Done(): - b.cacheState = s - close(b.done) - // Notifying decorators about shutdown event - for _, sl := range s.shutdownListeners { - sl.Shutdown() - } - return - } - } -} - -func (b *Bar) render(tw int) { - if b.recoveredPanic != nil { - b.toShutdown = false - b.frameCh <- b.panicToFrame(tw) - return - } - select { - case b.operateState <- func(s *bState) { - defer func() { - // recovering if user defined decorator panics for example - if p := recover(); p != nil { - b.dlogger.Println(p) - b.recoveredPanic = p - b.toShutdown = !s.completeFlushed - b.frameCh <- b.panicToFrame(tw) - } - }() - - st := newStatistics(s) - frame := s.draw(tw, st) - frame, b.extendedLines = s.extender(frame, tw, st) - - b.toShutdown = s.toComplete && !s.completeFlushed - s.completeFlushed = s.toComplete - b.frameCh <- frame - }: - case <-b.done: - s := b.cacheState - st := newStatistics(s) - frame := s.draw(tw, st) - frame, b.extendedLines = s.extender(frame, tw, st) - b.frameCh <- frame - } -} - -func (b *Bar) panicToFrame(termWidth int) io.Reader { - return strings.NewReader(fmt.Sprintf(fmt.Sprintf("%%.%dv\n", termWidth), b.recoveredPanic)) -} - -func (b *Bar) subscribeDecorators() { - var amountReceivers []decor.AmountReceiver - var shutdownListeners []decor.ShutdownListener - var averageAdjusters []decor.AverageAdjuster - b.TraverseDecorators(func(d decor.Decorator) { - if d, ok := d.(decor.AmountReceiver); ok { - amountReceivers = append(amountReceivers, d) - } - if d, ok := d.(decor.ShutdownListener); ok { - shutdownListeners = append(shutdownListeners, d) - } - if d, ok := d.(decor.AverageAdjuster); ok { - averageAdjusters = append(averageAdjusters, d) - } - }) - b.operateState <- func(s *bState) { - s.amountReceivers = amountReceivers - s.shutdownListeners = shutdownListeners - s.averageAdjusters = averageAdjusters - } -} - -func (b *Bar) refreshNowTillShutdown() { - for { - select { - case b.container.forceRefresh <- time.Now(): - case <-b.done: - return - } - } -} - -func (b *Bar) wSyncTable() [][]chan int { - select { - case b.operateState <- func(s *bState) { b.syncTableCh <- s.wSyncTable() }: - return <-b.syncTableCh - case <-b.done: - return b.cacheState.wSyncTable() - } -} - -func (s *bState) draw(termWidth int, stat *decor.Statistics) io.Reader { - for _, d := range s.pDecorators { - s.bufP.WriteString(d.Decor(stat)) - } - - for _, d := range s.aDecorators { - s.bufA.WriteString(d.Decor(stat)) - } - - s.bufA.WriteByte('\n') - - prependCount := utf8.RuneCount(s.bufP.Bytes()) - appendCount := utf8.RuneCount(s.bufA.Bytes()) - 1 - - if fitWidth := s.width; termWidth > 1 { - if !s.trimSpace { - // reserve space for edge spaces - termWidth -= 2 - s.bufB.WriteByte(' ') - defer s.bufB.WriteByte(' ') - } - if prependCount+s.width+appendCount > termWidth { - fitWidth = termWidth - prependCount - appendCount - } - s.filler.Fill(s.bufB, fitWidth, stat) - } - - return io.MultiReader(s.bufP, s.bufB, s.bufA) -} - -func (s *bState) wSyncTable() [][]chan int { - columns := make([]chan int, 0, len(s.pDecorators)+len(s.aDecorators)) - var pCount int - for _, d := range s.pDecorators { - if ch, ok := d.Sync(); ok { - columns = append(columns, ch) - pCount++ - } - } - var aCount int - for _, d := range s.aDecorators { - if ch, ok := d.Sync(); ok { - columns = append(columns, ch) - aCount++ - } - } - table := make([][]chan int, 2) - table[0] = columns[0:pCount] - table[1] = columns[pCount : pCount+aCount : pCount+aCount] - return table -} - -func newStatistics(s *bState) *decor.Statistics { - return &decor.Statistics{ - ID: s.id, - Completed: s.completeFlushed, - Total: s.total, - Current: s.current, - } -} diff --git a/vendor/github.com/vbauerster/mpb/v4/bar_filler.go b/vendor/github.com/vbauerster/mpb/v4/bar_filler.go deleted file mode 100644 index 0d751a68dc..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/bar_filler.go +++ /dev/null @@ -1,137 +0,0 @@ -package mpb - -import ( - "io" - "unicode/utf8" - - "github.com/vbauerster/mpb/v4/decor" - "github.com/vbauerster/mpb/v4/internal" -) - -const ( - rLeft = iota - rFill - rTip - rEmpty - rRight - rRevTip - rRefill -) - -// DefaultBarStyle is applied when bar constructed with *Progress.AddBar method. -// -// '1th rune' stands for left boundary rune -// -// '2th rune' stands for fill rune -// -// '3th rune' stands for tip rune -// -// '4th rune' stands for empty rune -// -// '5th rune' stands for right boundary rune -// -// '6th rune' stands for reverse tip rune -// -// '7th rune' stands for refill rune -// -const DefaultBarStyle string = "[=>-]<+" - -type barFiller struct { - format [][]byte - tip []byte - refill int64 - reverse bool - flush func(w io.Writer, bb [][]byte) -} - -// NewBarFiller constucts mpb.Filler, to be used with *Progress.Add method. -func NewBarFiller(style string, reverse bool) Filler { - if style == "" { - style = DefaultBarStyle - } - bf := &barFiller{ - format: make([][]byte, utf8.RuneCountInString(style)), - } - bf.SetStyle(style) - bf.SetReverse(reverse) - return bf -} - -func (s *barFiller) SetStyle(style string) { - if !utf8.ValidString(style) { - return - } - src := make([][]byte, 0, utf8.RuneCountInString(style)) - for _, r := range style { - src = append(src, []byte(string(r))) - } - copy(s.format, src) - if s.reverse { - s.tip = s.format[rRevTip] - } else { - s.tip = s.format[rTip] - } -} - -func (s *barFiller) SetReverse(reverse bool) { - if reverse { - s.tip = s.format[rRevTip] - s.flush = func(w io.Writer, bb [][]byte) { - for i := len(bb) - 1; i >= 0; i-- { - w.Write(bb[i]) - } - } - } else { - s.tip = s.format[rTip] - s.flush = func(w io.Writer, bb [][]byte) { - for i := 0; i < len(bb); i++ { - w.Write(bb[i]) - } - } - } - s.reverse = reverse -} - -func (s *barFiller) SetRefill(amount int64) { - s.refill = amount -} - -func (s *barFiller) Fill(w io.Writer, width int, stat *decor.Statistics) { - // don't count rLeft and rRight as progress - width -= 2 - if width < 2 { - return - } - w.Write(s.format[rLeft]) - defer w.Write(s.format[rRight]) - - bb := make([][]byte, width) - - cwidth := int(internal.PercentageRound(stat.Total, stat.Current, width)) - - for i := 0; i < cwidth; i++ { - bb[i] = s.format[rFill] - } - - if s.refill > 0 { - var rwidth int - if s.refill > stat.Current { - rwidth = cwidth - } else { - rwidth = int(internal.PercentageRound(stat.Total, int64(s.refill), width)) - } - for i := 0; i < rwidth; i++ { - bb[i] = s.format[rRefill] - } - } - - if cwidth > 0 && cwidth < width { - bb[cwidth-1] = s.tip - } - - for i := cwidth; i < width; i++ { - bb[i] = s.format[rEmpty] - } - - s.flush(w, bb) -} diff --git a/vendor/github.com/vbauerster/mpb/v4/bar_option.go b/vendor/github.com/vbauerster/mpb/v4/bar_option.go deleted file mode 100644 index d938e41854..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/bar_option.go +++ /dev/null @@ -1,211 +0,0 @@ -package mpb - -import ( - "bytes" - "io" - - "github.com/vbauerster/mpb/v4/decor" -) - -// BarOption is a function option which changes the default behavior of a bar. -type BarOption func(*bState) - -type mergeWrapper interface { - MergeUnwrap() []decor.Decorator -} - -func (s *bState) addDecorators(dest *[]decor.Decorator, decorators ...decor.Decorator) { - for _, decorator := range decorators { - if mw, ok := decorator.(mergeWrapper); ok { - dd := mw.MergeUnwrap() - s.mDecorators = append(s.mDecorators, dd[0]) - *dest = append(*dest, dd[1:]...) - } - *dest = append(*dest, decorator) - } -} - -// AppendDecorators let you inject decorators to the bar's right side. -func AppendDecorators(decorators ...decor.Decorator) BarOption { - return func(s *bState) { - s.addDecorators(&s.aDecorators, decorators...) - } -} - -// PrependDecorators let you inject decorators to the bar's left side. -func PrependDecorators(decorators ...decor.Decorator) BarOption { - return func(s *bState) { - s.addDecorators(&s.pDecorators, decorators...) - } -} - -// BarID sets bar id. -func BarID(id int) BarOption { - return func(s *bState) { - s.id = id - } -} - -// BarWidth sets bar width independent of the container. -func BarWidth(width int) BarOption { - return func(s *bState) { - s.width = width - } -} - -// BarReplaceOnComplete is deprecated. Use BarParkTo instead. -func BarReplaceOnComplete(runningBar *Bar) BarOption { - return BarParkTo(runningBar) -} - -// BarParkTo parks constructed bar into the runningBar. In other words, -// constructed bar will replace runningBar after it has been completed. -func BarParkTo(runningBar *Bar) BarOption { - if runningBar == nil { - return nil - } - return func(s *bState) { - s.runningBar = runningBar - } -} - -// BarRemoveOnComplete removes bar filler and decorators if any, on -// complete event. -func BarRemoveOnComplete() BarOption { - return func(s *bState) { - s.dropOnComplete = true - } -} - -// BarClearOnComplete clears bar filler only, on complete event. -func BarClearOnComplete() BarOption { - return BarOnComplete("") -} - -// BarOnComplete replaces bar filler with message, on complete event. -func BarOnComplete(message string) BarOption { - return func(s *bState) { - s.filler = makeBarOnCompleteFiller(s.baseF, message) - } -} - -func makeBarOnCompleteFiller(filler Filler, message string) Filler { - return FillerFunc(func(w io.Writer, width int, st *decor.Statistics) { - if st.Completed { - io.WriteString(w, message) - } else { - filler.Fill(w, width, st) - } - }) -} - -// BarPriority sets bar's priority. Zero is highest priority, i.e. bar -// will be on top. If `BarReplaceOnComplete` option is supplied, this -// option is ignored. -func BarPriority(priority int) BarOption { - return func(s *bState) { - s.priority = priority - } -} - -// BarExtender is an option to extend bar to the next new line, with -// arbitrary output. -func BarExtender(extender Filler) BarOption { - if extender == nil { - return nil - } - return func(s *bState) { - s.extender = makeExtFunc(extender) - } -} - -func makeExtFunc(extender Filler) extFunc { - buf := new(bytes.Buffer) - nl := []byte("\n") - return func(r io.Reader, tw int, st *decor.Statistics) (io.Reader, int) { - extender.Fill(buf, tw, st) - return io.MultiReader(r, buf), bytes.Count(buf.Bytes(), nl) - } -} - -// TrimSpace trims bar's edge spaces. -func TrimSpace() BarOption { - return func(s *bState) { - s.trimSpace = true - } -} - -// BarStyle overrides mpb.DefaultBarStyle, for example BarStyle("╢▌▌░╟"). -// If you need to override `reverse tip` and `refill rune` set 6th and -// 7th rune respectively, for example BarStyle("[=>-]<+"). -func BarStyle(style string) BarOption { - if style == "" { - return nil - } - type styleSetter interface { - SetStyle(string) - } - return func(s *bState) { - if t, ok := s.baseF.(styleSetter); ok { - t.SetStyle(style) - } - } -} - -// BarNoPop disables bar pop out of container. Effective when -// PopCompletedMode of container is enabled. -func BarNoPop() BarOption { - return func(s *bState) { - s.noPop = true - } -} - -// BarReverse reverse mode, bar will progress from right to left. -func BarReverse() BarOption { - type revSetter interface { - SetReverse(bool) - } - return func(s *bState) { - if t, ok := s.baseF.(revSetter); ok { - t.SetReverse(true) - } - } -} - -// SpinnerStyle sets custom spinner style. -// Effective when Filler type is spinner. -func SpinnerStyle(frames []string) BarOption { - if len(frames) == 0 { - return nil - } - chk := func(filler Filler) (interface{}, bool) { - t, ok := filler.(*spinnerFiller) - return t, ok - } - cb := func(t interface{}) { - t.(*spinnerFiller).frames = frames - } - return MakeFillerTypeSpecificBarOption(chk, cb) -} - -// MakeFillerTypeSpecificBarOption makes BarOption specific to Filler's -// actual type. If you implement your own Filler, so most probably -// you'll need this. See BarStyle or SpinnerStyle for example. -func MakeFillerTypeSpecificBarOption( - typeChecker func(Filler) (interface{}, bool), - cb func(interface{}), -) BarOption { - return func(s *bState) { - if t, ok := typeChecker(s.baseF); ok { - cb(t) - } - } -} - -// BarOptOnCond returns option when condition evaluates to true. -func BarOptOnCond(option BarOption, condition func() bool) BarOption { - if condition() { - return option - } - return nil -} diff --git a/vendor/github.com/vbauerster/mpb/v4/cwriter/writer_posix.go b/vendor/github.com/vbauerster/mpb/v4/cwriter/writer_posix.go deleted file mode 100644 index 3fb8b7d754..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/cwriter/writer_posix.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build !windows - -package cwriter - -import "fmt" - -func (w *Writer) clearLines() { - fmt.Fprintf(w.out, cuuAndEd, w.lineCount) -} diff --git a/vendor/github.com/vbauerster/mpb/v4/cwriter/writer_windows.go b/vendor/github.com/vbauerster/mpb/v4/cwriter/writer_windows.go deleted file mode 100644 index 7125289009..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/cwriter/writer_windows.go +++ /dev/null @@ -1,60 +0,0 @@ -// +build windows - -package cwriter - -import ( - "fmt" - "syscall" - "unsafe" -) - -var kernel32 = syscall.NewLazyDLL("kernel32.dll") - -var ( - procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") - procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") - procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") - procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute") -) - -type coord struct { - x int16 - y int16 -} - -type smallRect struct { - left int16 - top int16 - right int16 - bottom int16 -} - -type consoleScreenBufferInfo struct { - size coord - cursorPosition coord - attributes uint16 - window smallRect - maximumWindowSize coord -} - -func (w *Writer) clearLines() { - if !w.isTerminal { - fmt.Fprintf(w.out, cuuAndEd, w.lineCount) - } - var info consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(w.fd, uintptr(unsafe.Pointer(&info))) - - info.cursorPosition.y -= int16(w.lineCount) - if info.cursorPosition.y < 0 { - info.cursorPosition.y = 0 - } - procSetConsoleCursorPosition.Call(w.fd, uintptr(uint32(uint16(info.cursorPosition.y))<<16|uint32(uint16(info.cursorPosition.x)))) - - // clear the lines - cursor := coord{ - x: info.window.left, - y: info.cursorPosition.y, - } - count := uint32(info.size.x) * uint32(w.lineCount) - procFillConsoleOutputCharacter.Call(w.fd, uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(new(uint32)))) -} diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/counters.go b/vendor/github.com/vbauerster/mpb/v4/decor/counters.go deleted file mode 100644 index 34d3a0ae65..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/decor/counters.go +++ /dev/null @@ -1,89 +0,0 @@ -package decor - -import ( - "fmt" -) - -const ( - _ = iota - UnitKiB - UnitKB -) - -// CountersNoUnit is a wrapper around Counters with no unit param. -func CountersNoUnit(pairFmt string, wcc ...WC) Decorator { - return Counters(0, pairFmt, wcc...) -} - -// CountersKibiByte is a wrapper around Counters with predefined unit -// UnitKiB (bytes/1024). -func CountersKibiByte(pairFmt string, wcc ...WC) Decorator { - return Counters(UnitKiB, pairFmt, wcc...) -} - -// CountersKiloByte is a wrapper around Counters with predefined unit -// UnitKB (bytes/1000). -func CountersKiloByte(pairFmt string, wcc ...WC) Decorator { - return Counters(UnitKB, pairFmt, wcc...) -} - -// Counters decorator with dynamic unit measure adjustment. -// -// `unit` one of [0|UnitKiB|UnitKB] zero for no unit -// -// `pairFmt` printf compatible verbs for current and total, like "%f" or "%d" -// -// `wcc` optional WC config -// -// pairFmt example if unit=UnitKB: -// -// pairFmt="%.1f / %.1f" output: "1.0MB / 12.0MB" -// pairFmt="% .1f / % .1f" output: "1.0 MB / 12.0 MB" -// pairFmt="%d / %d" output: "1MB / 12MB" -// pairFmt="% d / % d" output: "1 MB / 12 MB" -// -func Counters(unit int, pairFmt string, wcc ...WC) Decorator { - var wc WC - for _, widthConf := range wcc { - wc = widthConf - } - wc.Init() - if pairFmt == "" { - pairFmt = "%d / %d" - } - d := &countersDecorator{ - WC: wc, - unit: unit, - pairFmt: pairFmt, - } - return d -} - -type countersDecorator struct { - WC - unit int - pairFmt string - completeMsg *string -} - -func (d *countersDecorator) Decor(st *Statistics) string { - if st.Completed && d.completeMsg != nil { - return d.FormatMsg(*d.completeMsg) - } - - var res string - switch d.unit { - case UnitKiB: - res = fmt.Sprintf(d.pairFmt, SizeB1024(st.Current), SizeB1024(st.Total)) - case UnitKB: - res = fmt.Sprintf(d.pairFmt, SizeB1000(st.Current), SizeB1000(st.Total)) - default: - res = fmt.Sprintf(d.pairFmt, st.Current, st.Total) - } - - return d.FormatMsg(res) -} - -func (d *countersDecorator) OnCompleteMessage(msg string) { - d.completeMsg = &msg -} diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/elapsed.go b/vendor/github.com/vbauerster/mpb/v4/decor/elapsed.go deleted file mode 100644 index b4ca601112..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/decor/elapsed.go +++ /dev/null @@ -1,59 +0,0 @@ -package decor - -import ( - "time" -) - -// Elapsed decorator. It's wrapper of NewElapsed. -// -// `style` one of [ET_STYLE_GO|ET_STYLE_HHMMSS|ET_STYLE_HHMM|ET_STYLE_MMSS] -// -// `wcc` optional WC config -func Elapsed(style TimeStyle, wcc ...WC) Decorator { - return NewElapsed(style, time.Now(), wcc...) -} - -// NewElapsed returns elapsed time decorator. -// -// `style` one of [ET_STYLE_GO|ET_STYLE_HHMMSS|ET_STYLE_HHMM|ET_STYLE_MMSS] -// -// `startTime` start time -// -// `wcc` optional WC config -func NewElapsed(style TimeStyle, startTime time.Time, wcc ...WC) Decorator { - var wc WC - for _, widthConf := range wcc { - wc = widthConf - } - wc.Init() - d := &elapsedDecorator{ - WC: wc, - startTime: startTime, - producer: chooseTimeProducer(style), - } - return d -} - -type elapsedDecorator struct { - WC - startTime time.Time - producer func(time.Duration) string - msg string - completeMsg *string -} - -func (d *elapsedDecorator) Decor(st *Statistics) string { - if st.Completed { - if d.completeMsg != nil { - return d.FormatMsg(*d.completeMsg) - } - return d.FormatMsg(d.msg) - } - - d.msg = d.producer(time.Since(d.startTime)) - return d.FormatMsg(d.msg) -} - -func (d *elapsedDecorator) OnCompleteMessage(msg string) { - d.completeMsg = &msg -} diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/merge.go b/vendor/github.com/vbauerster/mpb/v4/decor/merge.go deleted file mode 100644 index 06abf91ed5..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/decor/merge.go +++ /dev/null @@ -1,83 +0,0 @@ -package decor - -import ( - "fmt" - "unicode/utf8" -) - -// Merge wraps its decorator argument with intention to sync width -// with several decorators of another bar. Visual example: -// -// +----+--------+---------+--------+ -// | B1 | MERGE(D, P1, Pn) | -// +----+--------+---------+--------+ -// | B2 | D0 | D1 | Dn | -// +----+--------+---------+--------+ -// -func Merge(decorator Decorator, placeholders ...WC) Decorator { - if _, ok := decorator.Sync(); !ok || len(placeholders) == 0 { - return decorator - } - md := &mergeDecorator{ - Decorator: decorator, - placeHolders: make([]*placeHolderDecorator, len(placeholders)), - } - md.wc = decorator.SetConfig(md.wc) - for i, wc := range placeholders { - wc.Init() - md.placeHolders[i] = &placeHolderDecorator{ - WC: wc, - wsync: make(chan int), - } - } - return md -} - -type mergeDecorator struct { - Decorator - wc WC - placeHolders []*placeHolderDecorator -} - -func (d *mergeDecorator) MergeUnwrap() []Decorator { - decorators := make([]Decorator, len(d.placeHolders)+1) - decorators[0] = d.Decorator - for i, ph := range d.placeHolders { - decorators[i+1] = ph - } - return decorators -} - -func (d *mergeDecorator) Sync() (chan int, bool) { - return d.wc.Sync() -} - -func (d *mergeDecorator) Decor(st *Statistics) string { - msg := d.Decorator.Decor(st) - msgLen := utf8.RuneCountInString(msg) - - var pWidth int - for _, ph := range d.placeHolders { - pWidth += <-ph.wsync - } - - d.wc.wsync <- msgLen - pWidth - - max := <-d.wc.wsync - if (d.wc.C & DextraSpace) != 0 { - max++ - } - return fmt.Sprintf(fmt.Sprintf(d.wc.dynFormat, max+pWidth), msg) -} - -type placeHolderDecorator struct { - WC - wsync chan int -} - -func (d *placeHolderDecorator) Decor(st *Statistics) string { - go func() { - d.wsync <- utf8.RuneCountInString(d.FormatMsg("")) - }() - return "" -} diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/moving_average.go b/vendor/github.com/vbauerster/mpb/v4/decor/moving_average.go deleted file mode 100644 index 933b1f2cdc..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/decor/moving_average.go +++ /dev/null @@ -1,40 +0,0 @@ -package decor - -import ( - "sort" - - "github.com/VividCortex/ewma" -) - -// MovingAverage is the interface that computes a moving average over -// a time-series stream of numbers. The average may be over a window -// or exponentially decaying. -type MovingAverage = ewma.MovingAverage - -type medianWindow [3]float64 - -func (s *medianWindow) Len() int { return len(s) } -func (s *medianWindow) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s *medianWindow) Less(i, j int) bool { return s[i] < s[j] } - -func (s *medianWindow) Add(value float64) { - s[0], s[1] = s[1], s[2] - s[2] = value -} - -func (s *medianWindow) Value() float64 { - tmp := *s - sort.Sort(&tmp) - return tmp[1] -} - -func (s *medianWindow) Set(value float64) { - for i := 0; i < len(s); i++ { - s[i] = value - } -} - -// NewMedian is fixed last 3 samples median MovingAverage. -func NewMedian() MovingAverage { - return new(medianWindow) -} diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/name.go b/vendor/github.com/vbauerster/mpb/v4/decor/name.go deleted file mode 100644 index fde1b3b39d..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/decor/name.go +++ /dev/null @@ -1,36 +0,0 @@ -package decor - -// Name returns name decorator. -// -// `name` string to display -// -// `wcc` optional WC config -func Name(name string, wcc ...WC) Decorator { - var wc WC - for _, widthConf := range wcc { - wc = widthConf - } - wc.Init() - d := &nameDecorator{ - WC: wc, - msg: name, - } - return d -} - -type nameDecorator struct { - WC - msg string - complete *string -} - -func (d *nameDecorator) Decor(st *Statistics) string { - if st.Completed && d.complete != nil { - return d.FormatMsg(*d.complete) - } - return d.FormatMsg(d.msg) -} - -func (d *nameDecorator) OnCompleteMessage(msg string) { - d.complete = &msg -} diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/percentage.go b/vendor/github.com/vbauerster/mpb/v4/decor/percentage.go deleted file mode 100644 index 0acd44ef6f..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/decor/percentage.go +++ /dev/null @@ -1,81 +0,0 @@ -package decor - -import ( - "fmt" - "io" - "strconv" - - "github.com/vbauerster/mpb/v4/internal" -) - -type percentageType float64 - -func (s percentageType) Format(st fmt.State, verb rune) { - var prec int - switch verb { - case 'd': - case 's': - prec = -1 - default: - if p, ok := st.Precision(); ok { - prec = p - } else { - prec = 6 - } - } - - io.WriteString(st, strconv.FormatFloat(float64(s), 'f', prec, 64)) - - if st.Flag(' ') { - io.WriteString(st, " ") - } - io.WriteString(st, "%") -} - -// Percentage returns percentage decorator. It's a wrapper of NewPercentage. -func Percentage(wcc ...WC) Decorator { - return NewPercentage("% d", wcc...) -} - -// NewPercentage percentage decorator with custom fmt string. -// -// fmt examples: -// -// fmt="%.1f" output: "1.0%" -// fmt="% .1f" output: "1.0 %" -// fmt="%d" output: "1%" -// fmt="% d" output: "1 %" -// -func NewPercentage(fmt string, wcc ...WC) Decorator { - var wc WC - for _, widthConf := range wcc { - wc = widthConf - } - wc.Init() - if fmt == "" { - fmt = "% d" - } - d := &percentageDecorator{ - WC: wc, - fmt: fmt, - } - return d -} - -type percentageDecorator struct { - WC - fmt string - completeMsg *string -} - -func (d *percentageDecorator) Decor(st *Statistics) string { - if st.Completed && d.completeMsg != nil { - return d.FormatMsg(*d.completeMsg) - } - p := internal.Percentage(st.Total, st.Current, 100) - return d.FormatMsg(fmt.Sprintf(d.fmt, percentageType(p))) -} - -func (d *percentageDecorator) OnCompleteMessage(msg string) { - d.completeMsg = &msg -} diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/spinner.go b/vendor/github.com/vbauerster/mpb/v4/decor/spinner.go deleted file mode 100644 index b184b5a628..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/decor/spinner.go +++ /dev/null @@ -1,44 +0,0 @@ -package decor - -var defaultSpinnerStyle = []string{"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"} - -// Spinner returns spinner decorator. -// -// `frames` spinner frames, if nil or len==0, default is used -// -// `wcc` optional WC config -func Spinner(frames []string, wcc ...WC) Decorator { - var wc WC - for _, widthConf := range wcc { - wc = widthConf - } - wc.Init() - if len(frames) == 0 { - frames = defaultSpinnerStyle - } - d := &spinnerDecorator{ - WC: wc, - frames: frames, - } - return d -} - -type spinnerDecorator struct { - WC - frames []string - count uint - complete *string -} - -func (d *spinnerDecorator) Decor(st *Statistics) string { - if st.Completed && d.complete != nil { - return d.FormatMsg(*d.complete) - } - frame := d.frames[d.count%uint(len(d.frames))] - d.count++ - return d.FormatMsg(frame) -} - -func (d *spinnerDecorator) OnCompleteMessage(msg string) { - d.complete = &msg -} diff --git a/vendor/github.com/vbauerster/mpb/v4/go.mod b/vendor/github.com/vbauerster/mpb/v4/go.mod deleted file mode 100644 index cafdbd3763..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/go.mod +++ /dev/null @@ -1,9 +0,0 @@ -module github.com/vbauerster/mpb/v4 - -require ( - github.com/VividCortex/ewma v1.1.1 - golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad - golang.org/x/sys v0.0.0-20190927073244-c990c680b611 // indirect -) - -go 1.13 diff --git a/vendor/github.com/vbauerster/mpb/v4/go.sum b/vendor/github.com/vbauerster/mpb/v4/go.sum deleted file mode 100644 index 10b4f6e8cb..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/go.sum +++ /dev/null @@ -1,11 +0,0 @@ -github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= -github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad h1:5E5raQxcv+6CZ11RrBYQe5WRbUIWpScjh0kvHZkZIrQ= -golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190927073244-c990c680b611 h1:q9u40nxWT5zRClI/uU9dHCiYGottAg6Nzz4YUQyHxdA= -golang.org/x/sys v0.0.0-20190927073244-c990c680b611/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/vendor/github.com/vbauerster/mpb/v4/proxyreader.go b/vendor/github.com/vbauerster/mpb/v4/proxyreader.go deleted file mode 100644 index 425e57a69d..0000000000 --- a/vendor/github.com/vbauerster/mpb/v4/proxyreader.go +++ /dev/null @@ -1,28 +0,0 @@ -package mpb - -import ( - "io" - "time" -) - -// proxyReader is io.Reader wrapper, for proxy read bytes -type proxyReader struct { - io.ReadCloser - bar *Bar - iT time.Time -} - -func (pr *proxyReader) Read(p []byte) (n int, err error) { - n, err = pr.ReadCloser.Read(p) - if n > 0 { - pr.bar.IncrBy(n, time.Since(pr.iT)) - pr.iT = time.Now() - } - if err == io.EOF { - go func() { - current := pr.bar.Current() - pr.bar.SetTotal(current, true) - }() - } - return -} diff --git a/vendor/github.com/vbauerster/mpb/v4/.gitignore b/vendor/github.com/vbauerster/mpb/v6/.gitignore similarity index 100% rename from vendor/github.com/vbauerster/mpb/v4/.gitignore rename to vendor/github.com/vbauerster/mpb/v6/.gitignore diff --git a/vendor/github.com/vbauerster/mpb/v4/.travis.yml b/vendor/github.com/vbauerster/mpb/v6/.travis.yml similarity index 70% rename from vendor/github.com/vbauerster/mpb/v4/.travis.yml rename to vendor/github.com/vbauerster/mpb/v6/.travis.yml index 997ae32d66..9a203a67d2 100644 --- a/vendor/github.com/vbauerster/mpb/v4/.travis.yml +++ b/vendor/github.com/vbauerster/mpb/v6/.travis.yml @@ -1,11 +1,10 @@ language: go +arch: + - amd64 + - ppc64le go: - - 1.12.x - - 1.13.x - -env: - - GO111MODULE=on + - 1.14.x script: - go test -race ./... diff --git a/vendor/github.com/vbauerster/mpb/v4/README.md b/vendor/github.com/vbauerster/mpb/v6/README.md similarity index 71% rename from vendor/github.com/vbauerster/mpb/v4/README.md rename to vendor/github.com/vbauerster/mpb/v6/README.md index 003fb59878..a87786d726 100644 --- a/vendor/github.com/vbauerster/mpb/v4/README.md +++ b/vendor/github.com/vbauerster/mpb/v6/README.md @@ -1,6 +1,6 @@ # Multi Progress Bar -[![GoDoc](https://godoc.org/github.com/vbauerster/mpb?status.svg)](https://godoc.org/github.com/vbauerster/mpb) +[![GoDoc](https://pkg.go.dev/badge/github.com/vbauerster/mpb)](https://pkg.go.dev/github.com/vbauerster/mpb/v6) [![Build Status](https://travis-ci.org/vbauerster/mpb.svg?branch=master)](https://travis-ci.org/vbauerster/mpb) [![Go Report Card](https://goreportcard.com/badge/github.com/vbauerster/mpb)](https://goreportcard.com/report/github.com/vbauerster/mpb) @@ -8,16 +8,17 @@ ## Features -* __Multiple Bars__: Multiple progress bars are supported -* __Dynamic Total__: Set total while bar is running -* __Dynamic Add/Remove__: Dynamically add or remove bars -* __Cancellation__: Cancel whole rendering process -* __Predefined Decorators__: Elapsed time, [ewma](https://github.com/VividCortex/ewma) based ETA, Percentage, Bytes counter -* __Decorator's width sync__: Synchronized decorator's width among multiple bars +- **Multiple Bars**: Multiple progress bars are supported +- **Dynamic Total**: Set total while bar is running +- **Dynamic Add/Remove**: Dynamically add or remove bars +- **Cancellation**: Cancel whole rendering process +- **Predefined Decorators**: Elapsed time, [ewma](https://github.com/VividCortex/ewma) based ETA, Percentage, Bytes counter +- **Decorator's width sync**: Synchronized decorator's width among multiple bars ## Usage #### [Rendering single bar](_examples/singleBar/main.go) + ```go package main @@ -25,8 +26,8 @@ import ( "math/rand" "time" - "github.com/vbauerster/mpb/v4" - "github.com/vbauerster/mpb/v4/decor" + "github.com/vbauerster/mpb/v6" + "github.com/vbauerster/mpb/v6/decor" ) func main() { @@ -36,16 +37,15 @@ func main() { total := 100 name := "Single Bar:" // adding a single bar, which will inherit container's width - bar := p.AddBar(int64(total), - // override DefaultBarStyle, which is "[=>-]<+" - mpb.BarStyle("╢▌▌░╟"), + bar := p.Add(int64(total), + // progress bar filler with customized style + mpb.NewBarFiller("╢▌▌░╟"), mpb.PrependDecorators( // display our name with one space on the right decor.Name(name, decor.WC{W: len(name) + 1, C: decor.DidentRight}), // replace ETA decorator with "done" message, OnComplete event decor.OnComplete( - // ETA decorator with ewma age of 60, and width reservation of 4 - decor.EwmaETA(decor.ET_STYLE_GO, 60, decor.WC{W: 4}), "done", + decor.AverageETA(decor.ET_STYLE_GO, decor.WC{W: 4}), "done", ), ), mpb.AppendDecorators(decor.Percentage()), @@ -53,17 +53,16 @@ func main() { // simulating some work max := 100 * time.Millisecond for i := 0; i < total; i++ { - start := time.Now() time.Sleep(time.Duration(rand.Intn(10)+1) * max / 10) - // since ewma decorator is used, we need to pass time.Since(start) - bar.Increment(time.Since(start)) + bar.Increment() } // wait for our bar to complete and flush p.Wait() } ``` -#### [Rendering multiple bars](_examples/multiBars//main.go) +#### [Rendering multiple bars](_examples/multiBars/main.go) + ```go var wg sync.WaitGroup // pass &wg (optional), so p will wait for it eventually @@ -94,10 +93,13 @@ func main() { rng := rand.New(rand.NewSource(time.Now().UnixNano())) max := 100 * time.Millisecond for i := 0; i < total; i++ { + // start variable is solely for EWMA calculation + // EWMA's unit of measure is an iteration's duration start := time.Now() time.Sleep(time.Duration(rng.Intn(10)+1) * max / 10) - // since ewma decorator is used, we need to pass time.Since(start) - bar.Increment(time.Since(start)) + bar.Increment() + // we need to call DecoratorEwmaUpdate to fulfill ewma decorator's contract + bar.DecoratorEwmaUpdate(time.Since(start)) } }() } diff --git a/vendor/github.com/vbauerster/mpb/v4/UNLICENSE b/vendor/github.com/vbauerster/mpb/v6/UNLICENSE similarity index 100% rename from vendor/github.com/vbauerster/mpb/v4/UNLICENSE rename to vendor/github.com/vbauerster/mpb/v6/UNLICENSE diff --git a/vendor/github.com/vbauerster/mpb/v6/bar.go b/vendor/github.com/vbauerster/mpb/v6/bar.go new file mode 100644 index 0000000000..f18ef967fa --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/bar.go @@ -0,0 +1,492 @@ +package mpb + +import ( + "bytes" + "context" + "fmt" + "io" + "log" + "runtime/debug" + "strings" + "time" + + "github.com/acarl005/stripansi" + "github.com/mattn/go-runewidth" + "github.com/vbauerster/mpb/v6/decor" +) + +// Bar represents a progress bar. +type Bar struct { + priority int // used by heap + index int // used by heap + + extendedLines int + toShutdown bool + toDrop bool + noPop bool + hasEwmaDecorators bool + operateState chan func(*bState) + frameCh chan io.Reader + syncTableCh chan [][]chan int + completed chan bool + + // cancel is called either by user or on complete event + cancel func() + // done is closed after cacheState is assigned + done chan struct{} + // cacheState is populated, right after close(shutdown) + cacheState *bState + + container *Progress + dlogger *log.Logger + recoveredPanic interface{} +} + +type extenderFunc func(in io.Reader, reqWidth int, st decor.Statistics) (out io.Reader, lines int) + +// bState is actual bar state. It gets passed to *Bar.serve(...) monitor +// goroutine. +type bState struct { + id int + priority int + reqWidth int + total int64 + current int64 + refill int64 + lastN int64 + iterated bool + trimSpace bool + completed bool + completeFlushed bool + triggerComplete bool + dropOnComplete bool + noPop bool + aDecorators []decor.Decorator + pDecorators []decor.Decorator + averageDecorators []decor.AverageDecorator + ewmaDecorators []decor.EwmaDecorator + shutdownListeners []decor.ShutdownListener + bufP, bufB, bufA *bytes.Buffer + filler BarFiller + middleware func(BarFiller) BarFiller + extender extenderFunc + + // runningBar is a key for *pState.parkedBars + runningBar *Bar + + debugOut io.Writer +} + +func newBar(container *Progress, bs *bState) *Bar { + logPrefix := fmt.Sprintf("%sbar#%02d ", container.dlogger.Prefix(), bs.id) + ctx, cancel := context.WithCancel(container.ctx) + + bar := &Bar{ + container: container, + priority: bs.priority, + toDrop: bs.dropOnComplete, + noPop: bs.noPop, + operateState: make(chan func(*bState)), + frameCh: make(chan io.Reader, 1), + syncTableCh: make(chan [][]chan int, 1), + completed: make(chan bool, 1), + done: make(chan struct{}), + cancel: cancel, + dlogger: log.New(bs.debugOut, logPrefix, log.Lshortfile), + } + + go bar.serve(ctx, bs) + return bar +} + +// ProxyReader wraps r with metrics required for progress tracking. +// Panics if r is nil. +func (b *Bar) ProxyReader(r io.Reader) io.ReadCloser { + if r == nil { + panic("expected non nil io.Reader") + } + return newProxyReader(r, b) +} + +// ID returs id of the bar. +func (b *Bar) ID() int { + result := make(chan int) + select { + case b.operateState <- func(s *bState) { result <- s.id }: + return <-result + case <-b.done: + return b.cacheState.id + } +} + +// Current returns bar's current number, in other words sum of all increments. +func (b *Bar) Current() int64 { + result := make(chan int64) + select { + case b.operateState <- func(s *bState) { result <- s.current }: + return <-result + case <-b.done: + return b.cacheState.current + } +} + +// SetRefill sets refill flag with specified amount. +// The underlying BarFiller will change its visual representation, to +// indicate refill event. Refill event may be referred to some retry +// operation for example. +func (b *Bar) SetRefill(amount int64) { + select { + case b.operateState <- func(s *bState) { + s.refill = amount + }: + case <-b.done: + } +} + +// TraverseDecorators traverses all available decorators and calls cb func on each. +func (b *Bar) TraverseDecorators(cb func(decor.Decorator)) { + select { + case b.operateState <- func(s *bState) { + for _, decorators := range [...][]decor.Decorator{ + s.pDecorators, + s.aDecorators, + } { + for _, d := range decorators { + cb(extractBaseDecorator(d)) + } + } + }: + case <-b.done: + } +} + +// SetTotal sets total dynamically. +// If total is less than or equal to zero it takes progress' current value. +func (b *Bar) SetTotal(total int64, triggerComplete bool) { + select { + case b.operateState <- func(s *bState) { + s.triggerComplete = triggerComplete + if total <= 0 { + s.total = s.current + } else { + s.total = total + } + if s.triggerComplete && !s.completed { + s.current = s.total + s.completed = true + go b.refreshTillShutdown() + } + }: + case <-b.done: + } +} + +// SetCurrent sets progress' current to an arbitrary value. +// Setting a negative value will cause a panic. +func (b *Bar) SetCurrent(current int64) { + select { + case b.operateState <- func(s *bState) { + s.iterated = true + s.lastN = current - s.current + s.current = current + if s.triggerComplete && s.current >= s.total { + s.current = s.total + s.completed = true + go b.refreshTillShutdown() + } + }: + case <-b.done: + } +} + +// Increment is a shorthand for b.IncrInt64(1). +func (b *Bar) Increment() { + b.IncrInt64(1) +} + +// IncrBy is a shorthand for b.IncrInt64(int64(n)). +func (b *Bar) IncrBy(n int) { + b.IncrInt64(int64(n)) +} + +// IncrInt64 increments progress by amount of n. +func (b *Bar) IncrInt64(n int64) { + select { + case b.operateState <- func(s *bState) { + s.iterated = true + s.lastN = n + s.current += n + if s.triggerComplete && s.current >= s.total { + s.current = s.total + s.completed = true + go b.refreshTillShutdown() + } + }: + case <-b.done: + } +} + +// DecoratorEwmaUpdate updates all EWMA based decorators. Should be +// called on each iteration, because EWMA's unit of measure is an +// iteration's duration. Panics if called before *Bar.Incr... family +// methods. +func (b *Bar) DecoratorEwmaUpdate(dur time.Duration) { + select { + case b.operateState <- func(s *bState) { + ewmaIterationUpdate(false, s, dur) + }: + case <-b.done: + ewmaIterationUpdate(true, b.cacheState, dur) + } +} + +// DecoratorAverageAdjust adjusts all average based decorators. Call +// if you need to adjust start time of all average based decorators +// or after progress resume. +func (b *Bar) DecoratorAverageAdjust(start time.Time) { + select { + case b.operateState <- func(s *bState) { + for _, d := range s.averageDecorators { + d.AverageAdjust(start) + } + }: + case <-b.done: + } +} + +// SetPriority changes bar's order among multiple bars. Zero is highest +// priority, i.e. bar will be on top. If you don't need to set priority +// dynamically, better use BarPriority option. +func (b *Bar) SetPriority(priority int) { + select { + case <-b.done: + default: + b.container.setBarPriority(b, priority) + } +} + +// Abort interrupts bar's running goroutine. Call this, if you'd like +// to stop/remove bar before completion event. It has no effect after +// completion event. If drop is true bar will be removed as well. +func (b *Bar) Abort(drop bool) { + select { + case <-b.done: + default: + if drop { + b.container.dropBar(b) + } + b.cancel() + } +} + +// Completed reports whether the bar is in completed state. +func (b *Bar) Completed() bool { + select { + case b.operateState <- func(s *bState) { b.completed <- s.completed }: + return <-b.completed + case <-b.done: + return true + } +} + +func (b *Bar) serve(ctx context.Context, s *bState) { + defer b.container.bwg.Done() + for { + select { + case op := <-b.operateState: + op(s) + case <-ctx.Done(): + b.cacheState = s + close(b.done) + // Notifying decorators about shutdown event + for _, sl := range s.shutdownListeners { + sl.Shutdown() + } + return + } + } +} + +func (b *Bar) render(tw int) { + select { + case b.operateState <- func(s *bState) { + stat := newStatistics(tw, s) + defer func() { + // recovering if user defined decorator panics for example + if p := recover(); p != nil { + if b.recoveredPanic == nil { + s.extender = makePanicExtender(p) + b.toShutdown = !b.toShutdown + b.recoveredPanic = p + } + frame, lines := s.extender(nil, s.reqWidth, stat) + b.extendedLines = lines + b.frameCh <- frame + b.dlogger.Println(p) + } + s.completeFlushed = s.completed + }() + frame, lines := s.extender(s.draw(stat), s.reqWidth, stat) + b.extendedLines = lines + b.toShutdown = s.completed && !s.completeFlushed + b.frameCh <- frame + }: + case <-b.done: + s := b.cacheState + stat := newStatistics(tw, s) + var r io.Reader + if b.recoveredPanic == nil { + r = s.draw(stat) + } + frame, lines := s.extender(r, s.reqWidth, stat) + b.extendedLines = lines + b.frameCh <- frame + } +} + +func (b *Bar) subscribeDecorators() { + var averageDecorators []decor.AverageDecorator + var ewmaDecorators []decor.EwmaDecorator + var shutdownListeners []decor.ShutdownListener + b.TraverseDecorators(func(d decor.Decorator) { + if d, ok := d.(decor.AverageDecorator); ok { + averageDecorators = append(averageDecorators, d) + } + if d, ok := d.(decor.EwmaDecorator); ok { + ewmaDecorators = append(ewmaDecorators, d) + } + if d, ok := d.(decor.ShutdownListener); ok { + shutdownListeners = append(shutdownListeners, d) + } + }) + select { + case b.operateState <- func(s *bState) { + s.averageDecorators = averageDecorators + s.ewmaDecorators = ewmaDecorators + s.shutdownListeners = shutdownListeners + }: + b.hasEwmaDecorators = len(ewmaDecorators) != 0 + case <-b.done: + } +} + +func (b *Bar) refreshTillShutdown() { + for { + select { + case b.container.refreshCh <- time.Now(): + case <-b.done: + return + } + } +} + +func (b *Bar) wSyncTable() [][]chan int { + select { + case b.operateState <- func(s *bState) { b.syncTableCh <- s.wSyncTable() }: + return <-b.syncTableCh + case <-b.done: + return b.cacheState.wSyncTable() + } +} + +func (s *bState) draw(stat decor.Statistics) io.Reader { + if !s.trimSpace { + stat.AvailableWidth -= 2 + s.bufB.WriteByte(' ') + defer s.bufB.WriteByte(' ') + } + + nlr := strings.NewReader("\n") + tw := stat.AvailableWidth + for _, d := range s.pDecorators { + str := d.Decor(stat) + stat.AvailableWidth -= runewidth.StringWidth(stripansi.Strip(str)) + s.bufP.WriteString(str) + } + if stat.AvailableWidth <= 0 { + trunc := strings.NewReader(runewidth.Truncate(stripansi.Strip(s.bufP.String()), tw, "…")) + s.bufP.Reset() + return io.MultiReader(trunc, s.bufB, nlr) + } + + tw = stat.AvailableWidth + for _, d := range s.aDecorators { + str := d.Decor(stat) + stat.AvailableWidth -= runewidth.StringWidth(stripansi.Strip(str)) + s.bufA.WriteString(str) + } + if stat.AvailableWidth <= 0 { + trunc := strings.NewReader(runewidth.Truncate(stripansi.Strip(s.bufA.String()), tw, "…")) + s.bufA.Reset() + return io.MultiReader(s.bufP, s.bufB, trunc, nlr) + } + + s.filler.Fill(s.bufB, s.reqWidth, stat) + + return io.MultiReader(s.bufP, s.bufB, s.bufA, nlr) +} + +func (s *bState) wSyncTable() [][]chan int { + columns := make([]chan int, 0, len(s.pDecorators)+len(s.aDecorators)) + var pCount int + for _, d := range s.pDecorators { + if ch, ok := d.Sync(); ok { + columns = append(columns, ch) + pCount++ + } + } + var aCount int + for _, d := range s.aDecorators { + if ch, ok := d.Sync(); ok { + columns = append(columns, ch) + aCount++ + } + } + table := make([][]chan int, 2) + table[0] = columns[0:pCount] + table[1] = columns[pCount : pCount+aCount : pCount+aCount] + return table +} + +func newStatistics(tw int, s *bState) decor.Statistics { + return decor.Statistics{ + ID: s.id, + AvailableWidth: tw, + Total: s.total, + Current: s.current, + Refill: s.refill, + Completed: s.completeFlushed, + } +} + +func extractBaseDecorator(d decor.Decorator) decor.Decorator { + if d, ok := d.(decor.Wrapper); ok { + return extractBaseDecorator(d.Base()) + } + return d +} + +func ewmaIterationUpdate(done bool, s *bState, dur time.Duration) { + if !done && !s.iterated { + panic("increment required before ewma iteration update") + } else { + s.iterated = false + } + for _, d := range s.ewmaDecorators { + d.EwmaUpdate(s.lastN, dur) + } +} + +func makePanicExtender(p interface{}) extenderFunc { + pstr := fmt.Sprint(p) + stack := debug.Stack() + stackLines := bytes.Count(stack, []byte("\n")) + return func(_ io.Reader, _ int, st decor.Statistics) (io.Reader, int) { + mr := io.MultiReader( + strings.NewReader(runewidth.Truncate(pstr, st.AvailableWidth, "…")), + strings.NewReader(fmt.Sprintf("\n%#v\n", st)), + bytes.NewReader(stack), + ) + return mr, stackLines + 1 + } +} diff --git a/vendor/github.com/vbauerster/mpb/v6/bar_filler.go b/vendor/github.com/vbauerster/mpb/v6/bar_filler.go new file mode 100644 index 0000000000..c8cedaa4a0 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/bar_filler.go @@ -0,0 +1,31 @@ +package mpb + +import ( + "io" + + "github.com/vbauerster/mpb/v6/decor" +) + +// BarFiller interface. +// Bar (without decorators) renders itself by calling BarFiller's Fill method. +// +// reqWidth is requested width, set by `func WithWidth(int) ContainerOption`. +// If not set, it defaults to terminal width. +// +// Default implementations can be obtained via: +// +// func NewBarFiller(style string) BarFiller +// func NewBarFillerRev(style string) BarFiller +// func NewBarFillerPick(style string, rev bool) BarFiller +// func NewSpinnerFiller(style []string, alignment SpinnerAlignment) BarFiller +// +type BarFiller interface { + Fill(w io.Writer, reqWidth int, stat decor.Statistics) +} + +// BarFillerFunc is function type adapter to convert function into BarFiller. +type BarFillerFunc func(w io.Writer, reqWidth int, stat decor.Statistics) + +func (f BarFillerFunc) Fill(w io.Writer, reqWidth int, stat decor.Statistics) { + f(w, reqWidth, stat) +} diff --git a/vendor/github.com/vbauerster/mpb/v6/bar_filler_bar.go b/vendor/github.com/vbauerster/mpb/v6/bar_filler_bar.go new file mode 100644 index 0000000000..50494485e4 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/bar_filler_bar.go @@ -0,0 +1,191 @@ +package mpb + +import ( + "bytes" + "io" + "unicode/utf8" + + "github.com/mattn/go-runewidth" + "github.com/rivo/uniseg" + "github.com/vbauerster/mpb/v6/decor" + "github.com/vbauerster/mpb/v6/internal" +) + +const ( + rLeft = iota + rFill + rTip + rSpace + rRight + rRevTip + rRefill +) + +// BarDefaultStyle is a style for rendering a progress bar. +// It consist of 7 ordered runes: +// +// '1st rune' stands for left boundary rune +// +// '2nd rune' stands for fill rune +// +// '3rd rune' stands for tip rune +// +// '4th rune' stands for space rune +// +// '5th rune' stands for right boundary rune +// +// '6th rune' stands for reverse tip rune +// +// '7th rune' stands for refill rune +// +const BarDefaultStyle string = "[=>-]<+" + +type barFiller struct { + format [][]byte + rwidth []int + tip []byte + refill int64 + reverse bool + flush func(io.Writer, *space, [][]byte) +} + +type space struct { + space []byte + rwidth int + count int +} + +// NewBarFiller returns a BarFiller implementation which renders a +// progress bar in regular direction. If style is empty string, +// BarDefaultStyle is applied. To be used with `*Progress.Add(...) +// *Bar` method. +func NewBarFiller(style string) BarFiller { + return newBarFiller(style, false) +} + +// NewBarFillerRev returns a BarFiller implementation which renders a +// progress bar in reverse direction. If style is empty string, +// BarDefaultStyle is applied. To be used with `*Progress.Add(...) +// *Bar` method. +func NewBarFillerRev(style string) BarFiller { + return newBarFiller(style, true) +} + +// NewBarFillerPick pick between regular and reverse BarFiller implementation +// based on rev param. To be used with `*Progress.Add(...) *Bar` method. +func NewBarFillerPick(style string, rev bool) BarFiller { + return newBarFiller(style, rev) +} + +func newBarFiller(style string, rev bool) BarFiller { + bf := &barFiller{ + format: make([][]byte, len(BarDefaultStyle)), + rwidth: make([]int, len(BarDefaultStyle)), + reverse: rev, + } + bf.parse(BarDefaultStyle) + if style != "" && style != BarDefaultStyle { + bf.parse(style) + } + return bf +} + +func (s *barFiller) parse(style string) { + if !utf8.ValidString(style) { + panic("invalid bar style") + } + srcFormat := make([][]byte, 0, len(BarDefaultStyle)) + srcRwidth := make([]int, 0, len(BarDefaultStyle)) + gr := uniseg.NewGraphemes(style) + for gr.Next() { + srcFormat = append(srcFormat, gr.Bytes()) + srcRwidth = append(srcRwidth, runewidth.StringWidth(gr.Str())) + } + copy(s.format, srcFormat) + copy(s.rwidth, srcRwidth) + if s.reverse { + s.tip = s.format[rRevTip] + s.flush = reverseFlush + } else { + s.tip = s.format[rTip] + s.flush = regularFlush + } +} + +func (s *barFiller) Fill(w io.Writer, reqWidth int, stat decor.Statistics) { + width := internal.CheckRequestedWidth(reqWidth, stat.AvailableWidth) + brackets := s.rwidth[rLeft] + s.rwidth[rRight] + if width < brackets { + return + } + // don't count brackets as progress + width -= brackets + + w.Write(s.format[rLeft]) + defer w.Write(s.format[rRight]) + + cwidth := int(internal.PercentageRound(stat.Total, stat.Current, width)) + space := &space{ + space: s.format[rSpace], + rwidth: s.rwidth[rSpace], + count: width - cwidth, + } + + index, refill := 0, 0 + bb := make([][]byte, cwidth) + + if cwidth > 0 && cwidth != width { + bb[index] = s.tip + cwidth -= s.rwidth[rTip] + index++ + } + + if stat.Refill > 0 { + refill = int(internal.PercentageRound(stat.Total, int64(stat.Refill), width)) + if refill > cwidth { + refill = cwidth + } + cwidth -= refill + } + + for cwidth > 0 { + bb[index] = s.format[rFill] + cwidth -= s.rwidth[rFill] + index++ + } + + for refill > 0 { + bb[index] = s.format[rRefill] + refill -= s.rwidth[rRefill] + index++ + } + + if cwidth+refill < 0 || space.rwidth > 1 { + buf := new(bytes.Buffer) + s.flush(buf, space, bb[:index]) + io.WriteString(w, runewidth.Truncate(buf.String(), width, "…")) + return + } + + s.flush(w, space, bb) +} + +func regularFlush(w io.Writer, space *space, bb [][]byte) { + for i := len(bb) - 1; i >= 0; i-- { + w.Write(bb[i]) + } + for space.count > 0 { + w.Write(space.space) + space.count -= space.rwidth + } +} + +func reverseFlush(w io.Writer, space *space, bb [][]byte) { + for space.count > 0 { + w.Write(space.space) + space.count -= space.rwidth + } + for i := 0; i < len(bb); i++ { + w.Write(bb[i]) + } +} diff --git a/vendor/github.com/vbauerster/mpb/v4/spinner_filler.go b/vendor/github.com/vbauerster/mpb/v6/bar_filler_spinner.go similarity index 58% rename from vendor/github.com/vbauerster/mpb/v4/spinner_filler.go rename to vendor/github.com/vbauerster/mpb/v6/bar_filler_spinner.go index 9f383fb336..0817b19ec4 100644 --- a/vendor/github.com/vbauerster/mpb/v4/spinner_filler.go +++ b/vendor/github.com/vbauerster/mpb/v6/bar_filler_spinner.go @@ -3,9 +3,10 @@ package mpb import ( "io" "strings" - "unicode/utf8" - "github.com/vbauerster/mpb/v4/decor" + "github.com/mattn/go-runewidth" + "github.com/vbauerster/mpb/v6/decor" + "github.com/vbauerster/mpb/v6/internal" ) // SpinnerAlignment enum. @@ -18,8 +19,8 @@ const ( SpinnerOnRight ) -// DefaultSpinnerStyle is applied when bar constructed with *Progress.AddSpinner method. -var DefaultSpinnerStyle = []string{"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"} +// SpinnerDefaultStyle is a style for rendering a spinner. +var SpinnerDefaultStyle = []string{"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"} type spinnerFiller struct { frames []string @@ -27,10 +28,12 @@ type spinnerFiller struct { alignment SpinnerAlignment } -// NewSpinnerFiller constucts mpb.Filler, to be used with *Progress.Add method. -func NewSpinnerFiller(style []string, alignment SpinnerAlignment) Filler { +// NewSpinnerFiller returns a BarFiller implementation which renders +// a spinner. If style is nil or zero length, SpinnerDefaultStyle is +// applied. To be used with `*Progress.Add(...) *Bar` method. +func NewSpinnerFiller(style []string, alignment SpinnerAlignment) BarFiller { if len(style) == 0 { - style = DefaultSpinnerStyle + style = SpinnerDefaultStyle } filler := &spinnerFiller{ frames: style, @@ -39,10 +42,11 @@ func NewSpinnerFiller(style []string, alignment SpinnerAlignment) Filler { return filler } -func (s *spinnerFiller) Fill(w io.Writer, width int, stat *decor.Statistics) { +func (s *spinnerFiller) Fill(w io.Writer, reqWidth int, stat decor.Statistics) { + width := internal.CheckRequestedWidth(reqWidth, stat.AvailableWidth) frame := s.frames[s.count%uint(len(s.frames))] - frameWidth := utf8.RuneCountInString(frame) + frameWidth := runewidth.StringWidth(frame) if width < frameWidth { return diff --git a/vendor/github.com/vbauerster/mpb/v6/bar_option.go b/vendor/github.com/vbauerster/mpb/v6/bar_option.go new file mode 100644 index 0000000000..e359c110c6 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/bar_option.go @@ -0,0 +1,153 @@ +package mpb + +import ( + "bytes" + "io" + + "github.com/vbauerster/mpb/v6/decor" + "github.com/vbauerster/mpb/v6/internal" +) + +// BarOption is a func option to alter default behavior of a bar. +type BarOption func(*bState) + +func (s *bState) addDecorators(dest *[]decor.Decorator, decorators ...decor.Decorator) { + type mergeWrapper interface { + MergeUnwrap() []decor.Decorator + } + for _, decorator := range decorators { + if mw, ok := decorator.(mergeWrapper); ok { + *dest = append(*dest, mw.MergeUnwrap()...) + } + *dest = append(*dest, decorator) + } +} + +// AppendDecorators let you inject decorators to the bar's right side. +func AppendDecorators(decorators ...decor.Decorator) BarOption { + return func(s *bState) { + s.addDecorators(&s.aDecorators, decorators...) + } +} + +// PrependDecorators let you inject decorators to the bar's left side. +func PrependDecorators(decorators ...decor.Decorator) BarOption { + return func(s *bState) { + s.addDecorators(&s.pDecorators, decorators...) + } +} + +// BarID sets bar id. +func BarID(id int) BarOption { + return func(s *bState) { + s.id = id + } +} + +// BarWidth sets bar width independent of the container. +func BarWidth(width int) BarOption { + return func(s *bState) { + s.reqWidth = width + } +} + +// BarQueueAfter queues this (being constructed) bar to relplace +// runningBar after it has been completed. +func BarQueueAfter(runningBar *Bar) BarOption { + if runningBar == nil { + return nil + } + return func(s *bState) { + s.runningBar = runningBar + } +} + +// BarRemoveOnComplete removes both bar's filler and its decorators +// on complete event. +func BarRemoveOnComplete() BarOption { + return func(s *bState) { + s.dropOnComplete = true + } +} + +// BarFillerClearOnComplete clears bar's filler on complete event. +// It's shortcut for BarFillerOnComplete(""). +func BarFillerClearOnComplete() BarOption { + return BarFillerOnComplete("") +} + +// BarFillerOnComplete replaces bar's filler with message, on complete event. +func BarFillerOnComplete(message string) BarOption { + return BarFillerMiddleware(func(base BarFiller) BarFiller { + return BarFillerFunc(func(w io.Writer, reqWidth int, st decor.Statistics) { + if st.Completed { + io.WriteString(w, message) + } else { + base.Fill(w, reqWidth, st) + } + }) + }) +} + +// BarFillerMiddleware provides a way to augment the underlying BarFiller. +func BarFillerMiddleware(middle func(BarFiller) BarFiller) BarOption { + return func(s *bState) { + s.middleware = middle + } +} + +// BarPriority sets bar's priority. Zero is highest priority, i.e. bar +// will be on top. If `BarReplaceOnComplete` option is supplied, this +// option is ignored. +func BarPriority(priority int) BarOption { + return func(s *bState) { + s.priority = priority + } +} + +// BarExtender provides a way to extend bar to the next new line. +func BarExtender(filler BarFiller) BarOption { + if filler == nil { + return nil + } + return func(s *bState) { + s.extender = makeExtenderFunc(filler) + } +} + +func makeExtenderFunc(filler BarFiller) extenderFunc { + buf := new(bytes.Buffer) + return func(r io.Reader, reqWidth int, st decor.Statistics) (io.Reader, int) { + filler.Fill(buf, reqWidth, st) + return io.MultiReader(r, buf), bytes.Count(buf.Bytes(), []byte("\n")) + } +} + +// BarFillerTrim removes leading and trailing space around the underlying BarFiller. +func BarFillerTrim() BarOption { + return func(s *bState) { + s.trimSpace = true + } +} + +// BarNoPop disables bar pop out of container. Effective when +// PopCompletedMode of container is enabled. +func BarNoPop() BarOption { + return func(s *bState) { + s.noPop = true + } +} + +// BarOptional will invoke provided option only when pick is true. +func BarOptional(option BarOption, pick bool) BarOption { + return BarOptOn(option, internal.Predicate(pick)) +} + +// BarOptOn will invoke provided option only when higher order predicate +// evaluates to true. +func BarOptOn(option BarOption, predicate func() bool) BarOption { + if predicate() { + return option + } + return nil +} diff --git a/vendor/github.com/vbauerster/mpb/v4/options.go b/vendor/github.com/vbauerster/mpb/v6/container_option.go similarity index 54% rename from vendor/github.com/vbauerster/mpb/v4/options.go rename to vendor/github.com/vbauerster/mpb/v6/container_option.go index f9930b0a76..b92c7578c4 100644 --- a/vendor/github.com/vbauerster/mpb/v4/options.go +++ b/vendor/github.com/vbauerster/mpb/v6/container_option.go @@ -5,10 +5,13 @@ import ( "io/ioutil" "sync" "time" + + "github.com/vbauerster/mpb/v6/internal" ) -// ContainerOption is a function option which changes the default -// behavior of progress container, if passed to mpb.New(...ContainerOption). +// ContainerOption is a func option to alter default behavior of a bar +// container. Container term refers to a Progress struct which can +// hold one or more Bars. type ContainerOption func(*pState) // WithWaitGroup provides means to have a single joint point. If @@ -21,14 +24,12 @@ func WithWaitGroup(wg *sync.WaitGroup) ContainerOption { } } -// WithWidth sets container width. Default is 80. Bars inherit this -// width, as long as no BarWidth is applied. -func WithWidth(w int) ContainerOption { +// WithWidth sets container width. If not set it defaults to terminal +// width. A bar added to the container will inherit its width, unless +// overridden by `func BarWidth(int) BarOption`. +func WithWidth(width int) ContainerOption { return func(s *pState) { - if w < 0 { - return - } - s.width = w + s.reqWidth = width } } @@ -41,9 +42,19 @@ func WithRefreshRate(d time.Duration) ContainerOption { // WithManualRefresh disables internal auto refresh time.Ticker. // Refresh will occur upon receive value from provided ch. -func WithManualRefresh(ch <-chan time.Time) ContainerOption { +func WithManualRefresh(ch <-chan interface{}) ContainerOption { + return func(s *pState) { + s.externalRefresh = ch + } +} + +// WithRenderDelay delays rendering. By default rendering starts as +// soon as bar is added, with this option it's possible to delay +// rendering process by keeping provided chan unclosed. In other words +// rendering will start as soon as provided chan is closed. +func WithRenderDelay(ch <-chan struct{}) ContainerOption { return func(s *pState) { - s.manualRefreshCh = ch + s.renderDelay = ch } } @@ -61,8 +72,8 @@ func WithShutdownNotifier(ch chan struct{}) ContainerOption { func WithOutput(w io.Writer) ContainerOption { return func(s *pState) { if w == nil { - s.manualRefreshCh = make(chan time.Time) s.output = ioutil.Discard + s.outputDiscarded = true return } s.output = w @@ -71,10 +82,10 @@ func WithOutput(w io.Writer) ContainerOption { // WithDebugOutput sets debug output. func WithDebugOutput(w io.Writer) ContainerOption { + if w == nil { + return nil + } return func(s *pState) { - if w == nil { - return - } s.debugOut = w } } @@ -86,9 +97,15 @@ func PopCompletedMode() ContainerOption { } } -// ContainerOptOnCond returns option when condition evaluates to true. -func ContainerOptOnCond(option ContainerOption, condition func() bool) ContainerOption { - if condition() { +// ContainerOptional will invoke provided option only when pick is true. +func ContainerOptional(option ContainerOption, pick bool) ContainerOption { + return ContainerOptOn(option, internal.Predicate(pick)) +} + +// ContainerOptOn will invoke provided option only when higher order +// predicate evaluates to true. +func ContainerOptOn(option ContainerOption, predicate func() bool) ContainerOption { + if predicate() { return option } return nil diff --git a/vendor/github.com/vbauerster/mpb/v6/cwriter/doc.go b/vendor/github.com/vbauerster/mpb/v6/cwriter/doc.go new file mode 100644 index 0000000000..93c8f8268d --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/cwriter/doc.go @@ -0,0 +1,2 @@ +// Package cwriter is a console writer abstraction for the underlying OS. +package cwriter diff --git a/vendor/github.com/vbauerster/mpb/v6/cwriter/util_bsd.go b/vendor/github.com/vbauerster/mpb/v6/cwriter/util_bsd.go new file mode 100644 index 0000000000..4e3564ecee --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/cwriter/util_bsd.go @@ -0,0 +1,7 @@ +// +build darwin dragonfly freebsd netbsd openbsd + +package cwriter + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TIOCGETA diff --git a/vendor/github.com/vbauerster/mpb/v6/cwriter/util_linux.go b/vendor/github.com/vbauerster/mpb/v6/cwriter/util_linux.go new file mode 100644 index 0000000000..253f12dd2f --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/cwriter/util_linux.go @@ -0,0 +1,7 @@ +// +build aix linux + +package cwriter + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TCGETS diff --git a/vendor/github.com/vbauerster/mpb/v6/cwriter/util_solaris.go b/vendor/github.com/vbauerster/mpb/v6/cwriter/util_solaris.go new file mode 100644 index 0000000000..4b29ff5c00 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/cwriter/util_solaris.go @@ -0,0 +1,7 @@ +// +build solaris + +package cwriter + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TCGETA diff --git a/vendor/github.com/vbauerster/mpb/v4/cwriter/writer.go b/vendor/github.com/vbauerster/mpb/v6/cwriter/writer.go similarity index 63% rename from vendor/github.com/vbauerster/mpb/v4/cwriter/writer.go rename to vendor/github.com/vbauerster/mpb/v6/cwriter/writer.go index 9ec1ec66b9..1ade54761d 100644 --- a/vendor/github.com/vbauerster/mpb/v4/cwriter/writer.go +++ b/vendor/github.com/vbauerster/mpb/v6/cwriter/writer.go @@ -3,17 +3,19 @@ package cwriter import ( "bytes" "errors" - "fmt" "io" "os" - - "golang.org/x/crypto/ssh/terminal" + "strconv" ) -// NotATTY not a TeleTYpewriter error. -var NotATTY = errors.New("not a terminal") +// ErrNotTTY not a TeleTYpewriter error. +var ErrNotTTY = errors.New("not a terminal") -var cuuAndEd = fmt.Sprintf("%c[%%dA%[1]c[J", 27) +// http://ascii-table.com/ansi-escape-sequences.php +const ( + escOpen = "\x1b[" + cuuAndEd = "A\x1b[J" +) // Writer is a buffered the writer that updates the terminal. The // contents of writer will be flushed when Flush is called. @@ -21,7 +23,7 @@ type Writer struct { out io.Writer buf bytes.Buffer lineCount int - fd uintptr + fd int isTerminal bool } @@ -29,16 +31,20 @@ type Writer struct { func New(out io.Writer) *Writer { w := &Writer{out: out} if f, ok := out.(*os.File); ok { - w.fd = f.Fd() - w.isTerminal = terminal.IsTerminal(int(w.fd)) + w.fd = int(f.Fd()) + w.isTerminal = IsTerminal(w.fd) } return w } // Flush flushes the underlying buffer. func (w *Writer) Flush(lineCount int) (err error) { + // some terminals interpret 'cursor up 0' as 'cursor up 1' if w.lineCount > 0 { - w.clearLines() + err = w.clearLines() + if err != nil { + return + } } w.lineCount = lineCount _, err = w.buf.WriteTo(w.out) @@ -63,9 +69,16 @@ func (w *Writer) ReadFrom(r io.Reader) (n int64, err error) { // GetWidth returns width of underlying terminal. func (w *Writer) GetWidth() (int, error) { - if w.isTerminal { - tw, _, err := terminal.GetSize(int(w.fd)) - return tw, err + if !w.isTerminal { + return -1, ErrNotTTY } - return -1, NotATTY + tw, _, err := GetSize(w.fd) + return tw, err +} + +func (w *Writer) ansiCuuAndEd() (err error) { + buf := make([]byte, 8) + buf = strconv.AppendInt(buf[:copy(buf, escOpen)], int64(w.lineCount), 10) + _, err = w.out.Write(append(buf, cuuAndEd...)) + return } diff --git a/vendor/github.com/vbauerster/mpb/v6/cwriter/writer_posix.go b/vendor/github.com/vbauerster/mpb/v6/cwriter/writer_posix.go new file mode 100644 index 0000000000..f54a5d06b8 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/cwriter/writer_posix.go @@ -0,0 +1,26 @@ +// +build !windows + +package cwriter + +import ( + "golang.org/x/sys/unix" +) + +func (w *Writer) clearLines() error { + return w.ansiCuuAndEd() +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) + if err != nil { + return -1, -1, err + } + return int(ws.Col), int(ws.Row), nil +} + +// IsTerminal returns whether the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + return err == nil +} diff --git a/vendor/github.com/vbauerster/mpb/v6/cwriter/writer_windows.go b/vendor/github.com/vbauerster/mpb/v6/cwriter/writer_windows.go new file mode 100644 index 0000000000..1a69c81acf --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/cwriter/writer_windows.go @@ -0,0 +1,73 @@ +// +build windows + +package cwriter + +import ( + "unsafe" + + "golang.org/x/sys/windows" +) + +var kernel32 = windows.NewLazySystemDLL("kernel32.dll") + +var ( + procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") + procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") +) + +func (w *Writer) clearLines() error { + if !w.isTerminal { + // hope it's cygwin or similar + return w.ansiCuuAndEd() + } + + var info windows.ConsoleScreenBufferInfo + if err := windows.GetConsoleScreenBufferInfo(windows.Handle(w.fd), &info); err != nil { + return err + } + + info.CursorPosition.Y -= int16(w.lineCount) + if info.CursorPosition.Y < 0 { + info.CursorPosition.Y = 0 + } + _, _, _ = procSetConsoleCursorPosition.Call( + uintptr(w.fd), + uintptr(uint32(uint16(info.CursorPosition.Y))<<16|uint32(uint16(info.CursorPosition.X))), + ) + + // clear the lines + cursor := &windows.Coord{ + X: info.Window.Left, + Y: info.CursorPosition.Y, + } + count := uint32(info.Size.X) * uint32(w.lineCount) + _, _, _ = procFillConsoleOutputCharacter.Call( + uintptr(w.fd), + uintptr(' '), + uintptr(count), + *(*uintptr)(unsafe.Pointer(cursor)), + uintptr(unsafe.Pointer(new(uint32))), + ) + return nil +} + +// GetSize returns the visible dimensions of the given terminal. +// +// These dimensions don't include any scrollback buffer height. +func GetSize(fd int) (width, height int, err error) { + var info windows.ConsoleScreenBufferInfo + if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil { + return 0, 0, err + } + // terminal.GetSize from crypto/ssh adds "+ 1" to both width and height: + // https://go.googlesource.com/crypto/+/refs/heads/release-branch.go1.14/ssh/terminal/util_windows.go#75 + // but looks like this is a root cause of issue #66, so removing both "+ 1" have fixed it. + return int(info.Window.Right - info.Window.Left), int(info.Window.Bottom - info.Window.Top), nil +} + +// IsTerminal returns whether the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + var st uint32 + err := windows.GetConsoleMode(windows.Handle(fd), &st) + return err == nil +} diff --git a/vendor/github.com/vbauerster/mpb/v6/decor/any.go b/vendor/github.com/vbauerster/mpb/v6/decor/any.go new file mode 100644 index 0000000000..39518f5945 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/decor/any.go @@ -0,0 +1,21 @@ +package decor + +// Any decorator displays text, that can be changed during decorator's +// lifetime via provided DecorFunc. +// +// `fn` DecorFunc callback +// +// `wcc` optional WC config +// +func Any(fn DecorFunc, wcc ...WC) Decorator { + return &any{initWC(wcc...), fn} +} + +type any struct { + WC + fn DecorFunc +} + +func (d *any) Decor(s Statistics) string { + return d.FormatMsg(d.fn(s)) +} diff --git a/vendor/github.com/vbauerster/mpb/v6/decor/counters.go b/vendor/github.com/vbauerster/mpb/v6/decor/counters.go new file mode 100644 index 0000000000..4a5343d412 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/decor/counters.go @@ -0,0 +1,243 @@ +package decor + +import ( + "fmt" + "strings" +) + +const ( + _ = iota + UnitKiB + UnitKB +) + +// CountersNoUnit is a wrapper around Counters with no unit param. +func CountersNoUnit(pairFmt string, wcc ...WC) Decorator { + return Counters(0, pairFmt, wcc...) +} + +// CountersKibiByte is a wrapper around Counters with predefined unit +// UnitKiB (bytes/1024). +func CountersKibiByte(pairFmt string, wcc ...WC) Decorator { + return Counters(UnitKiB, pairFmt, wcc...) +} + +// CountersKiloByte is a wrapper around Counters with predefined unit +// UnitKB (bytes/1000). +func CountersKiloByte(pairFmt string, wcc ...WC) Decorator { + return Counters(UnitKB, pairFmt, wcc...) +} + +// Counters decorator with dynamic unit measure adjustment. +// +// `unit` one of [0|UnitKiB|UnitKB] zero for no unit +// +// `pairFmt` printf compatible verbs for current and total pair +// +// `wcc` optional WC config +// +// pairFmt example if unit=UnitKB: +// +// pairFmt="%.1f / %.1f" output: "1.0MB / 12.0MB" +// pairFmt="% .1f / % .1f" output: "1.0 MB / 12.0 MB" +// pairFmt="%d / %d" output: "1MB / 12MB" +// pairFmt="% d / % d" output: "1 MB / 12 MB" +// +func Counters(unit int, pairFmt string, wcc ...WC) Decorator { + producer := func(unit int, pairFmt string) DecorFunc { + if pairFmt == "" { + pairFmt = "%d / %d" + } else if strings.Count(pairFmt, "%") != 2 { + panic("expected pairFmt with exactly 2 verbs") + } + switch unit { + case UnitKiB: + return func(s Statistics) string { + return fmt.Sprintf(pairFmt, SizeB1024(s.Current), SizeB1024(s.Total)) + } + case UnitKB: + return func(s Statistics) string { + return fmt.Sprintf(pairFmt, SizeB1000(s.Current), SizeB1000(s.Total)) + } + default: + return func(s Statistics) string { + return fmt.Sprintf(pairFmt, s.Current, s.Total) + } + } + } + return Any(producer(unit, pairFmt), wcc...) +} + +// TotalNoUnit is a wrapper around Total with no unit param. +func TotalNoUnit(format string, wcc ...WC) Decorator { + return Total(0, format, wcc...) +} + +// TotalKibiByte is a wrapper around Total with predefined unit +// UnitKiB (bytes/1024). +func TotalKibiByte(format string, wcc ...WC) Decorator { + return Total(UnitKiB, format, wcc...) +} + +// TotalKiloByte is a wrapper around Total with predefined unit +// UnitKB (bytes/1000). +func TotalKiloByte(format string, wcc ...WC) Decorator { + return Total(UnitKB, format, wcc...) +} + +// Total decorator with dynamic unit measure adjustment. +// +// `unit` one of [0|UnitKiB|UnitKB] zero for no unit +// +// `format` printf compatible verb for Total +// +// `wcc` optional WC config +// +// format example if unit=UnitKiB: +// +// format="%.1f" output: "12.0MiB" +// format="% .1f" output: "12.0 MiB" +// format="%d" output: "12MiB" +// format="% d" output: "12 MiB" +// +func Total(unit int, format string, wcc ...WC) Decorator { + producer := func(unit int, format string) DecorFunc { + if format == "" { + format = "%d" + } else if strings.Count(format, "%") != 1 { + panic("expected format with exactly 1 verb") + } + + switch unit { + case UnitKiB: + return func(s Statistics) string { + return fmt.Sprintf(format, SizeB1024(s.Total)) + } + case UnitKB: + return func(s Statistics) string { + return fmt.Sprintf(format, SizeB1000(s.Total)) + } + default: + return func(s Statistics) string { + return fmt.Sprintf(format, s.Total) + } + } + } + return Any(producer(unit, format), wcc...) +} + +// CurrentNoUnit is a wrapper around Current with no unit param. +func CurrentNoUnit(format string, wcc ...WC) Decorator { + return Current(0, format, wcc...) +} + +// CurrentKibiByte is a wrapper around Current with predefined unit +// UnitKiB (bytes/1024). +func CurrentKibiByte(format string, wcc ...WC) Decorator { + return Current(UnitKiB, format, wcc...) +} + +// CurrentKiloByte is a wrapper around Current with predefined unit +// UnitKB (bytes/1000). +func CurrentKiloByte(format string, wcc ...WC) Decorator { + return Current(UnitKB, format, wcc...) +} + +// Current decorator with dynamic unit measure adjustment. +// +// `unit` one of [0|UnitKiB|UnitKB] zero for no unit +// +// `format` printf compatible verb for Current +// +// `wcc` optional WC config +// +// format example if unit=UnitKiB: +// +// format="%.1f" output: "12.0MiB" +// format="% .1f" output: "12.0 MiB" +// format="%d" output: "12MiB" +// format="% d" output: "12 MiB" +// +func Current(unit int, format string, wcc ...WC) Decorator { + producer := func(unit int, format string) DecorFunc { + if format == "" { + format = "%d" + } else if strings.Count(format, "%") != 1 { + panic("expected format with exactly 1 verb") + } + + switch unit { + case UnitKiB: + return func(s Statistics) string { + return fmt.Sprintf(format, SizeB1024(s.Current)) + } + case UnitKB: + return func(s Statistics) string { + return fmt.Sprintf(format, SizeB1000(s.Current)) + } + default: + return func(s Statistics) string { + return fmt.Sprintf(format, s.Current) + } + } + } + return Any(producer(unit, format), wcc...) +} + +// InvertedCurrentNoUnit is a wrapper around InvertedCurrent with no unit param. +func InvertedCurrentNoUnit(format string, wcc ...WC) Decorator { + return InvertedCurrent(0, format, wcc...) +} + +// InvertedCurrentKibiByte is a wrapper around InvertedCurrent with predefined unit +// UnitKiB (bytes/1024). +func InvertedCurrentKibiByte(format string, wcc ...WC) Decorator { + return InvertedCurrent(UnitKiB, format, wcc...) +} + +// InvertedCurrentKiloByte is a wrapper around InvertedCurrent with predefined unit +// UnitKB (bytes/1000). +func InvertedCurrentKiloByte(format string, wcc ...WC) Decorator { + return InvertedCurrent(UnitKB, format, wcc...) +} + +// InvertedCurrent decorator with dynamic unit measure adjustment. +// +// `unit` one of [0|UnitKiB|UnitKB] zero for no unit +// +// `format` printf compatible verb for InvertedCurrent +// +// `wcc` optional WC config +// +// format example if unit=UnitKiB: +// +// format="%.1f" output: "12.0MiB" +// format="% .1f" output: "12.0 MiB" +// format="%d" output: "12MiB" +// format="% d" output: "12 MiB" +// +func InvertedCurrent(unit int, format string, wcc ...WC) Decorator { + producer := func(unit int, format string) DecorFunc { + if format == "" { + format = "%d" + } else if strings.Count(format, "%") != 1 { + panic("expected format with exactly 1 verb") + } + + switch unit { + case UnitKiB: + return func(s Statistics) string { + return fmt.Sprintf(format, SizeB1024(s.Total-s.Current)) + } + case UnitKB: + return func(s Statistics) string { + return fmt.Sprintf(format, SizeB1000(s.Total-s.Current)) + } + default: + return func(s Statistics) string { + return fmt.Sprintf(format, s.Total-s.Current) + } + } + } + return Any(producer(unit, format), wcc...) +} diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/decorator.go b/vendor/github.com/vbauerster/mpb/v6/decor/decorator.go similarity index 52% rename from vendor/github.com/vbauerster/mpb/v4/decor/decorator.go rename to vendor/github.com/vbauerster/mpb/v6/decor/decorator.go index 2f941d7034..e81fae367e 100644 --- a/vendor/github.com/vbauerster/mpb/v4/decor/decorator.go +++ b/vendor/github.com/vbauerster/mpb/v6/decor/decorator.go @@ -3,7 +3,9 @@ package decor import ( "fmt" "time" - "unicode/utf8" + + "github.com/acarl005/stripansi" + "github.com/mattn/go-runewidth" ) const ( @@ -45,21 +47,32 @@ const ( // Statistics consists of progress related statistics, that Decorator // may need. type Statistics struct { - ID int - Completed bool - Total int64 - Current int64 + ID int + AvailableWidth int + Total int64 + Current int64 + Refill int64 + Completed bool } // Decorator interface. -// A decorator must implement this interface, in order to be used with -// mpb library. +// Most of the time there is no need to implement this interface +// manually, as decor package already provides a wide range of decorators +// which implement this interface. If however built-in decorators don't +// meet your needs, you're free to implement your own one by implementing +// this particular interface. The easy way to go is to convert a +// `DecorFunc` into a `Decorator` interface by using provided +// `func Any(DecorFunc, ...WC) Decorator`. type Decorator interface { - ConfigSetter + Configurator Synchronizer - Decor(*Statistics) string + Decor(Statistics) string } +// DecorFunc func type. +// To be used with `func Any`(DecorFunc, ...WC) Decorator`. +type DecorFunc func(Statistics) string + // Synchronizer interface. // All decorators implement this interface implicitly. Its Sync // method exposes width sync channel, if DSyncWidth bit is set. @@ -67,23 +80,31 @@ type Synchronizer interface { Sync() (chan int, bool) } -// ConfigSetter interface -type ConfigSetter interface { - SetConfig(config WC) (old WC) +// Configurator interface. +type Configurator interface { + GetConf() WC + SetConf(WC) +} + +// Wrapper interface. +// If you're implementing custom Decorator by wrapping a built-in one, +// it is necessary to implement this interface to retain functionality +// of built-in Decorator. +type Wrapper interface { + Base() Decorator } -// OnCompleteMessenger interface. -// Decorators implementing this interface suppose to return provided -// string on complete event. -type OnCompleteMessenger interface { - OnCompleteMessage(string) +// EwmaDecorator interface. +// EWMA based decorators should implement this one. +type EwmaDecorator interface { + EwmaUpdate(int64, time.Duration) } -// AmountReceiver interface. -// If decorator needs to receive increment amount, so this is the right -// interface to implement. -type AmountReceiver interface { - NextAmount(int64, ...time.Duration) +// AverageDecorator interface. +// Average decorators should implement this interface to provide start +// time adjustment facility, for resume-able tasks. +type AverageDecorator interface { + AverageAdjust(time.Time) } // ShutdownListener interface. @@ -93,17 +114,8 @@ type ShutdownListener interface { Shutdown() } -// AverageAdjuster interface. -// Average decorators should implement this interface to provide start -// time adjustment facility, for resume-able tasks. -type AverageAdjuster interface { - AverageAdjust(time.Time) -} - -// CBFunc convenience call back func type. -type CBFunc func(Decorator) - // Global convenience instances of WC with sync width bit set. +// To be used with multiple bars only, i.e. not effective for single bar usage. var ( WCSyncWidth = WC{C: DSyncWidth} WCSyncWidthR = WC{C: DSyncWidthR} @@ -115,62 +127,65 @@ var ( // W represents width and C represents bit set of width related config. // A decorator should embed WC, to enable width synchronization. type WC struct { - W int - C int - dynFormat string - staticFormat string - wsync chan int + W int + C int + fill func(s string, w int) string + wsync chan int } // FormatMsg formats final message according to WC.W and WC.C. // Should be called by any Decorator implementation. func (wc *WC) FormatMsg(msg string) string { + pureWidth := runewidth.StringWidth(msg) + stripWidth := runewidth.StringWidth(stripansi.Strip(msg)) + maxCell := wc.W if (wc.C & DSyncWidth) != 0 { - wc.wsync <- utf8.RuneCountInString(msg) - max := <-wc.wsync + cellCount := stripWidth if (wc.C & DextraSpace) != 0 { - max++ + cellCount++ } - return fmt.Sprintf(fmt.Sprintf(wc.dynFormat, max), msg) + wc.wsync <- cellCount + maxCell = <-wc.wsync } - return fmt.Sprintf(wc.staticFormat, msg) + return wc.fill(msg, maxCell+(pureWidth-stripWidth)) } // Init initializes width related config. -func (wc *WC) Init() { - wc.dynFormat = "%%" +func (wc *WC) Init() WC { + wc.fill = runewidth.FillLeft if (wc.C & DidentRight) != 0 { - wc.dynFormat += "-" + wc.fill = runewidth.FillRight } - wc.dynFormat += "%ds" - wc.staticFormat = fmt.Sprintf(wc.dynFormat, wc.W) if (wc.C & DSyncWidth) != 0 { + // it's deliberate choice to override wsync on each Init() call, + // this way globals like WCSyncSpace can be reused wc.wsync = make(chan int) } + return *wc } // Sync is implementation of Synchronizer interface. func (wc *WC) Sync() (chan int, bool) { + if (wc.C&DSyncWidth) != 0 && wc.wsync == nil { + panic(fmt.Sprintf("%T is not initialized", wc)) + } return wc.wsync, (wc.C & DSyncWidth) != 0 } -// SetConfig sets new conf and returns old one. -func (wc *WC) SetConfig(conf WC) (old WC) { - conf.Init() - old = *wc - *wc = conf - return old +// GetConf is implementation of Configurator interface. +func (wc *WC) GetConf() WC { + return *wc +} + +// SetConf is implementation of Configurator interface. +func (wc *WC) SetConf(conf WC) { + *wc = conf.Init() } -// OnComplete returns decorator, which wraps provided decorator, with -// sole purpose to display provided message on complete event. -// -// `decorator` Decorator to wrap -// -// `message` message to display on complete event -func OnComplete(decorator Decorator, message string) Decorator { - if d, ok := decorator.(OnCompleteMessenger); ok { - d.OnCompleteMessage(message) +func initWC(wcc ...WC) WC { + var wc WC + for _, nwc := range wcc { + wc = nwc } - return decorator + return wc.Init() } diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/doc.go b/vendor/github.com/vbauerster/mpb/v6/decor/doc.go similarity index 86% rename from vendor/github.com/vbauerster/mpb/v4/decor/doc.go rename to vendor/github.com/vbauerster/mpb/v6/decor/doc.go index b595e80152..bfbb82e116 100644 --- a/vendor/github.com/vbauerster/mpb/v4/decor/doc.go +++ b/vendor/github.com/vbauerster/mpb/v6/decor/doc.go @@ -1,6 +1,5 @@ +// Package decor provides common decorators for "github.com/vbauerster/mpb/v6" module. /* - Package decor provides common decorators for "github.com/vbauerster/mpb/v4" module. - Some decorators returned by this package might have a closure state. It is ok to use decorators concurrently, unless you share the same decorator among multiple *mpb.Bar instances. To avoid data races, create new decorator per *mpb.Bar instance. diff --git a/vendor/github.com/vbauerster/mpb/v6/decor/elapsed.go b/vendor/github.com/vbauerster/mpb/v6/decor/elapsed.go new file mode 100644 index 0000000000..e389f15815 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/decor/elapsed.go @@ -0,0 +1,35 @@ +package decor + +import ( + "time" +) + +// Elapsed decorator. It's wrapper of NewElapsed. +// +// `style` one of [ET_STYLE_GO|ET_STYLE_HHMMSS|ET_STYLE_HHMM|ET_STYLE_MMSS] +// +// `wcc` optional WC config +// +func Elapsed(style TimeStyle, wcc ...WC) Decorator { + return NewElapsed(style, time.Now(), wcc...) +} + +// NewElapsed returns elapsed time decorator. +// +// `style` one of [ET_STYLE_GO|ET_STYLE_HHMMSS|ET_STYLE_HHMM|ET_STYLE_MMSS] +// +// `startTime` start time +// +// `wcc` optional WC config +// +func NewElapsed(style TimeStyle, startTime time.Time, wcc ...WC) Decorator { + var msg string + producer := chooseTimeProducer(style) + fn := func(s Statistics) string { + if !s.Completed { + msg = producer(time.Since(startTime)) + } + return msg + } + return Any(fn, wcc...) +} diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/eta.go b/vendor/github.com/vbauerster/mpb/v6/decor/eta.go similarity index 74% rename from vendor/github.com/vbauerster/mpb/v4/decor/eta.go rename to vendor/github.com/vbauerster/mpb/v6/decor/eta.go index a85af6bd7e..d03caa7357 100644 --- a/vendor/github.com/vbauerster/mpb/v4/decor/eta.go +++ b/vendor/github.com/vbauerster/mpb/v6/decor/eta.go @@ -23,17 +23,17 @@ func (f TimeNormalizerFunc) Normalize(src time.Duration) time.Duration { } // EwmaETA exponential-weighted-moving-average based ETA decorator. -// Note that it's necessary to supply bar.Incr* methods with incremental -// work duration as second argument, in order for this decorator to -// work correctly. This decorator is a wrapper of MovingAverageETA. +// For this decorator to work correctly you have to measure each +// iteration's duration and pass it to the +// *Bar.DecoratorEwmaUpdate(time.Duration) method after each increment. func EwmaETA(style TimeStyle, age float64, wcc ...WC) Decorator { - var average MovingAverage + var average ewma.MovingAverage if age == 0 { average = ewma.NewMovingAverage() } else { average = ewma.NewMovingAverage(age) } - return MovingAverageETA(style, average, nil, wcc...) + return MovingAverageETA(style, NewThreadSafeMovingAverage(average), nil, wcc...) } // MovingAverageETA decorator relies on MovingAverage implementation to calculate its average. @@ -45,14 +45,10 @@ func EwmaETA(style TimeStyle, age float64, wcc ...WC) Decorator { // `normalizer` available implementations are [FixedIntervalTimeNormalizer|MaxTolerateTimeNormalizer] // // `wcc` optional WC config -func MovingAverageETA(style TimeStyle, average MovingAverage, normalizer TimeNormalizer, wcc ...WC) Decorator { - var wc WC - for _, widthConf := range wcc { - wc = widthConf - } - wc.Init() +// +func MovingAverageETA(style TimeStyle, average ewma.MovingAverage, normalizer TimeNormalizer, wcc ...WC) Decorator { d := &movingAverageETA{ - WC: wc, + WC: initWC(wcc...), average: average, normalizer: normalizer, producer: chooseTimeProducer(style), @@ -62,46 +58,34 @@ func MovingAverageETA(style TimeStyle, average MovingAverage, normalizer TimeNor type movingAverageETA struct { WC - average ewma.MovingAverage - normalizer TimeNormalizer - producer func(time.Duration) string - completeMsg *string + average ewma.MovingAverage + normalizer TimeNormalizer + producer func(time.Duration) string } -func (d *movingAverageETA) Decor(st *Statistics) string { - if st.Completed && d.completeMsg != nil { - return d.FormatMsg(*d.completeMsg) - } - +func (d *movingAverageETA) Decor(s Statistics) string { v := math.Round(d.average.Value()) - remaining := time.Duration((st.Total - st.Current) * int64(v)) + remaining := time.Duration((s.Total - s.Current) * int64(v)) if d.normalizer != nil { remaining = d.normalizer.Normalize(remaining) } return d.FormatMsg(d.producer(remaining)) } -func (d *movingAverageETA) NextAmount(n int64, wdd ...time.Duration) { - var workDuration time.Duration - for _, wd := range wdd { - workDuration = wd - } - durPerItem := float64(workDuration) / float64(n) +func (d *movingAverageETA) EwmaUpdate(n int64, dur time.Duration) { + durPerItem := float64(dur) / float64(n) if math.IsInf(durPerItem, 0) || math.IsNaN(durPerItem) { return } d.average.Add(durPerItem) } -func (d *movingAverageETA) OnCompleteMessage(msg string) { - d.completeMsg = &msg -} - // AverageETA decorator. It's wrapper of NewAverageETA. // // `style` one of [ET_STYLE_GO|ET_STYLE_HHMMSS|ET_STYLE_HHMM|ET_STYLE_MMSS] // // `wcc` optional WC config +// func AverageETA(style TimeStyle, wcc ...WC) Decorator { return NewAverageETA(style, time.Now(), nil, wcc...) } @@ -115,14 +99,10 @@ func AverageETA(style TimeStyle, wcc ...WC) Decorator { // `normalizer` available implementations are [FixedIntervalTimeNormalizer|MaxTolerateTimeNormalizer] // // `wcc` optional WC config +// func NewAverageETA(style TimeStyle, startTime time.Time, normalizer TimeNormalizer, wcc ...WC) Decorator { - var wc WC - for _, widthConf := range wcc { - wc = widthConf - } - wc.Init() d := &averageETA{ - WC: wc, + WC: initWC(wcc...), startTime: startTime, normalizer: normalizer, producer: chooseTimeProducer(style), @@ -132,22 +112,17 @@ func NewAverageETA(style TimeStyle, startTime time.Time, normalizer TimeNormaliz type averageETA struct { WC - startTime time.Time - normalizer TimeNormalizer - producer func(time.Duration) string - completeMsg *string + startTime time.Time + normalizer TimeNormalizer + producer func(time.Duration) string } -func (d *averageETA) Decor(st *Statistics) string { - if st.Completed && d.completeMsg != nil { - return d.FormatMsg(*d.completeMsg) - } - +func (d *averageETA) Decor(s Statistics) string { var remaining time.Duration - if st.Current != 0 { - durPerItem := float64(time.Since(d.startTime)) / float64(st.Current) + if s.Current != 0 { + durPerItem := float64(time.Since(d.startTime)) / float64(s.Current) durPerItem = math.Round(durPerItem) - remaining = time.Duration((st.Total - st.Current) * int64(durPerItem)) + remaining = time.Duration((s.Total - s.Current) * int64(durPerItem)) if d.normalizer != nil { remaining = d.normalizer.Normalize(remaining) } @@ -155,10 +130,6 @@ func (d *averageETA) Decor(st *Statistics) string { return d.FormatMsg(d.producer(remaining)) } -func (d *averageETA) OnCompleteMessage(msg string) { - d.completeMsg = &msg -} - func (d *averageETA) AverageAdjust(startTime time.Time) { d.startTime = startTime } diff --git a/vendor/github.com/vbauerster/mpb/v6/decor/merge.go b/vendor/github.com/vbauerster/mpb/v6/decor/merge.go new file mode 100644 index 0000000000..e41406a64d --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/decor/merge.go @@ -0,0 +1,107 @@ +package decor + +import ( + "strings" + + "github.com/acarl005/stripansi" + "github.com/mattn/go-runewidth" +) + +// Merge wraps its decorator argument with intention to sync width +// with several decorators of another bar. Visual example: +// +// +----+--------+---------+--------+ +// | B1 | MERGE(D, P1, Pn) | +// +----+--------+---------+--------+ +// | B2 | D0 | D1 | Dn | +// +----+--------+---------+--------+ +// +func Merge(decorator Decorator, placeholders ...WC) Decorator { + if _, ok := decorator.Sync(); !ok || len(placeholders) == 0 { + return decorator + } + md := &mergeDecorator{ + Decorator: decorator, + wc: decorator.GetConf(), + placeHolders: make([]*placeHolderDecorator, len(placeholders)), + } + decorator.SetConf(WC{}) + for i, wc := range placeholders { + if (wc.C & DSyncWidth) == 0 { + return decorator + } + md.placeHolders[i] = &placeHolderDecorator{wc.Init()} + } + return md +} + +type mergeDecorator struct { + Decorator + wc WC + placeHolders []*placeHolderDecorator +} + +func (d *mergeDecorator) GetConf() WC { + return d.wc +} + +func (d *mergeDecorator) SetConf(conf WC) { + d.wc = conf.Init() +} + +func (d *mergeDecorator) MergeUnwrap() []Decorator { + decorators := make([]Decorator, len(d.placeHolders)) + for i, ph := range d.placeHolders { + decorators[i] = ph + } + return decorators +} + +func (d *mergeDecorator) Sync() (chan int, bool) { + return d.wc.Sync() +} + +func (d *mergeDecorator) Base() Decorator { + return d.Decorator +} + +func (d *mergeDecorator) Decor(s Statistics) string { + msg := d.Decorator.Decor(s) + pureWidth := runewidth.StringWidth(msg) + stripWidth := runewidth.StringWidth(stripansi.Strip(msg)) + cellCount := stripWidth + if (d.wc.C & DextraSpace) != 0 { + cellCount++ + } + + total := runewidth.StringWidth(d.placeHolders[0].FormatMsg("")) + pw := (cellCount - total) / len(d.placeHolders) + rem := (cellCount - total) % len(d.placeHolders) + + var diff int + for i := 1; i < len(d.placeHolders); i++ { + ph := d.placeHolders[i] + width := pw - diff + if (ph.WC.C & DextraSpace) != 0 { + width-- + if width < 0 { + width = 0 + } + } + max := runewidth.StringWidth(ph.FormatMsg(strings.Repeat(" ", width))) + total += max + diff = max - pw + } + + d.wc.wsync <- pw + rem + max := <-d.wc.wsync + return d.wc.fill(msg, max+total+(pureWidth-stripWidth)) +} + +type placeHolderDecorator struct { + WC +} + +func (d *placeHolderDecorator) Decor(Statistics) string { + return "" +} diff --git a/vendor/github.com/vbauerster/mpb/v6/decor/moving_average.go b/vendor/github.com/vbauerster/mpb/v6/decor/moving_average.go new file mode 100644 index 0000000000..50ac9c393e --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/decor/moving_average.go @@ -0,0 +1,68 @@ +package decor + +import ( + "sort" + "sync" + + "github.com/VividCortex/ewma" +) + +type threadSafeMovingAverage struct { + ewma.MovingAverage + mu sync.Mutex +} + +func (s *threadSafeMovingAverage) Add(value float64) { + s.mu.Lock() + s.MovingAverage.Add(value) + s.mu.Unlock() +} + +func (s *threadSafeMovingAverage) Value() float64 { + s.mu.Lock() + defer s.mu.Unlock() + return s.MovingAverage.Value() +} + +func (s *threadSafeMovingAverage) Set(value float64) { + s.mu.Lock() + s.MovingAverage.Set(value) + s.mu.Unlock() +} + +// NewThreadSafeMovingAverage converts provided ewma.MovingAverage +// into thread safe ewma.MovingAverage. +func NewThreadSafeMovingAverage(average ewma.MovingAverage) ewma.MovingAverage { + if tsma, ok := average.(*threadSafeMovingAverage); ok { + return tsma + } + return &threadSafeMovingAverage{MovingAverage: average} +} + +type medianWindow [3]float64 + +func (s *medianWindow) Len() int { return len(s) } +func (s *medianWindow) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s *medianWindow) Less(i, j int) bool { return s[i] < s[j] } + +func (s *medianWindow) Add(value float64) { + s[0], s[1] = s[1], s[2] + s[2] = value +} + +func (s *medianWindow) Value() float64 { + tmp := *s + sort.Sort(&tmp) + return tmp[1] +} + +func (s *medianWindow) Set(value float64) { + for i := 0; i < len(s); i++ { + s[i] = value + } +} + +// NewMedian is fixed last 3 samples median MovingAverage. +func NewMedian() ewma.MovingAverage { + return NewThreadSafeMovingAverage(new(medianWindow)) +} diff --git a/vendor/github.com/vbauerster/mpb/v6/decor/name.go b/vendor/github.com/vbauerster/mpb/v6/decor/name.go new file mode 100644 index 0000000000..3af3112545 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/decor/name.go @@ -0,0 +1,12 @@ +package decor + +// Name decorator displays text that is set once and can't be changed +// during decorator's lifetime. +// +// `str` string to display +// +// `wcc` optional WC config +// +func Name(str string, wcc ...WC) Decorator { + return Any(func(Statistics) string { return str }, wcc...) +} diff --git a/vendor/github.com/vbauerster/mpb/v6/decor/on_complete.go b/vendor/github.com/vbauerster/mpb/v6/decor/on_complete.go new file mode 100644 index 0000000000..f46b19abaa --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/decor/on_complete.go @@ -0,0 +1,37 @@ +package decor + +// OnComplete returns decorator, which wraps provided decorator, with +// sole purpose to display provided message on complete event. +// +// `decorator` Decorator to wrap +// +// `message` message to display on complete event +// +func OnComplete(decorator Decorator, message string) Decorator { + d := &onCompleteWrapper{ + Decorator: decorator, + msg: message, + } + if md, ok := decorator.(*mergeDecorator); ok { + d.Decorator, md.Decorator = md.Decorator, d + return md + } + return d +} + +type onCompleteWrapper struct { + Decorator + msg string +} + +func (d *onCompleteWrapper) Decor(s Statistics) string { + if s.Completed { + wc := d.GetConf() + return wc.FormatMsg(d.msg) + } + return d.Decorator.Decor(s) +} + +func (d *onCompleteWrapper) Base() Decorator { + return d.Decorator +} diff --git a/vendor/github.com/vbauerster/mpb/v6/decor/percentage.go b/vendor/github.com/vbauerster/mpb/v6/decor/percentage.go new file mode 100644 index 0000000000..f4922bb52c --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/decor/percentage.go @@ -0,0 +1,58 @@ +package decor + +import ( + "fmt" + "io" + "strconv" + + "github.com/vbauerster/mpb/v6/internal" +) + +type percentageType float64 + +func (s percentageType) Format(st fmt.State, verb rune) { + var prec int + switch verb { + case 'd': + case 's': + prec = -1 + default: + if p, ok := st.Precision(); ok { + prec = p + } else { + prec = 6 + } + } + + io.WriteString(st, strconv.FormatFloat(float64(s), 'f', prec, 64)) + + if st.Flag(' ') { + io.WriteString(st, " ") + } + io.WriteString(st, "%") +} + +// Percentage returns percentage decorator. It's a wrapper of NewPercentage. +func Percentage(wcc ...WC) Decorator { + return NewPercentage("% d", wcc...) +} + +// NewPercentage percentage decorator with custom format string. +// +// format examples: +// +// format="%.1f" output: "1.0%" +// format="% .1f" output: "1.0 %" +// format="%d" output: "1%" +// format="% d" output: "1 %" +// +func NewPercentage(format string, wcc ...WC) Decorator { + if format == "" { + format = "% d" + } + f := func(s Statistics) string { + p := internal.Percentage(s.Total, s.Current, 100) + return fmt.Sprintf(format, percentageType(p)) + } + return Any(f, wcc...) +} diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/size_type.go b/vendor/github.com/vbauerster/mpb/v6/decor/size_type.go similarity index 100% rename from vendor/github.com/vbauerster/mpb/v4/decor/size_type.go rename to vendor/github.com/vbauerster/mpb/v6/decor/size_type.go diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/sizeb1000_string.go b/vendor/github.com/vbauerster/mpb/v6/decor/sizeb1000_string.go similarity index 100% rename from vendor/github.com/vbauerster/mpb/v4/decor/sizeb1000_string.go rename to vendor/github.com/vbauerster/mpb/v6/decor/sizeb1000_string.go diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/sizeb1024_string.go b/vendor/github.com/vbauerster/mpb/v6/decor/sizeb1024_string.go similarity index 100% rename from vendor/github.com/vbauerster/mpb/v4/decor/sizeb1024_string.go rename to vendor/github.com/vbauerster/mpb/v6/decor/sizeb1024_string.go diff --git a/vendor/github.com/vbauerster/mpb/v4/decor/speed.go b/vendor/github.com/vbauerster/mpb/v6/decor/speed.go similarity index 58% rename from vendor/github.com/vbauerster/mpb/v4/decor/speed.go rename to vendor/github.com/vbauerster/mpb/v6/decor/speed.go index 25bb187574..634edabfdc 100644 --- a/vendor/github.com/vbauerster/mpb/v4/decor/speed.go +++ b/vendor/github.com/vbauerster/mpb/v6/decor/speed.go @@ -9,27 +9,36 @@ import ( "github.com/VividCortex/ewma" ) -type speedType struct { +// FmtAsSpeed adds "/s" to the end of the input formatter. To be +// used with SizeB1000 or SizeB1024 types, for example: +// +// fmt.Printf("%.1f", FmtAsSpeed(SizeB1024(2048))) +// +func FmtAsSpeed(input fmt.Formatter) fmt.Formatter { + return &speedFormatter{input} +} + +type speedFormatter struct { fmt.Formatter } -func (self *speedType) Format(st fmt.State, verb rune) { +func (self *speedFormatter) Format(st fmt.State, verb rune) { self.Formatter.Format(st, verb) io.WriteString(st, "/s") } // EwmaSpeed exponential-weighted-moving-average based speed decorator. -// Note that it's necessary to supply bar.Incr* methods with incremental -// work duration as second argument, in order for this decorator to -// work correctly. This decorator is a wrapper of MovingAverageSpeed. +// For this decorator to work correctly you have to measure each +// iteration's duration and pass it to the +// *Bar.DecoratorEwmaUpdate(time.Duration) method after each increment. func EwmaSpeed(unit int, format string, age float64, wcc ...WC) Decorator { - var average MovingAverage + var average ewma.MovingAverage if age == 0 { average = ewma.NewMovingAverage() } else { average = ewma.NewMovingAverage(age) } - return MovingAverageSpeed(unit, format, average, wcc...) + return MovingAverageSpeed(unit, format, NewThreadSafeMovingAverage(average), wcc...) } // MovingAverageSpeed decorator relies on MovingAverage implementation @@ -50,17 +59,12 @@ func EwmaSpeed(unit int, format string, age float64, wcc ...WC) Decorator { // unit=UnitKB, format="%.1f" output: "1.0MB/s" // unit=UnitKB, format="% .1f" output: "1.0 MB/s" // -func MovingAverageSpeed(unit int, format string, average MovingAverage, wcc ...WC) Decorator { - var wc WC - for _, widthConf := range wcc { - wc = widthConf - } +func MovingAverageSpeed(unit int, format string, average ewma.MovingAverage, wcc ...WC) Decorator { if format == "" { format = "%.0f" } - wc.Init() d := &movingAverageSpeed{ - WC: wc, + WC: initWC(wcc...), average: average, producer: chooseSpeedProducer(unit, format), } @@ -69,45 +73,30 @@ func MovingAverageSpeed(unit int, format string, average MovingAverage, wcc ...W type movingAverageSpeed struct { WC - producer func(float64) string - average ewma.MovingAverage - msg string - completeMsg *string + producer func(float64) string + average ewma.MovingAverage + msg string } -func (d *movingAverageSpeed) Decor(st *Statistics) string { - if st.Completed { - if d.completeMsg != nil { - return d.FormatMsg(*d.completeMsg) +func (d *movingAverageSpeed) Decor(s Statistics) string { + if !s.Completed { + var speed float64 + if v := d.average.Value(); v > 0 { + speed = 1 / v } - return d.FormatMsg(d.msg) - } - - var speed float64 - if v := math.Round(d.average.Value()); v != 0 { - speed = 1 / time.Duration(v).Seconds() + d.msg = d.producer(speed * 1e9) } - - d.msg = d.producer(speed) return d.FormatMsg(d.msg) } -func (d *movingAverageSpeed) NextAmount(n int64, wdd ...time.Duration) { - var workDuration time.Duration - for _, wd := range wdd { - workDuration = wd - } - durPerByte := float64(workDuration) / float64(n) +func (d *movingAverageSpeed) EwmaUpdate(n int64, dur time.Duration) { + durPerByte := float64(dur) / float64(n) if math.IsInf(durPerByte, 0) || math.IsNaN(durPerByte) { return } d.average.Add(durPerByte) } -func (d *movingAverageSpeed) OnCompleteMessage(msg string) { - d.completeMsg = &msg -} - // AverageSpeed decorator with dynamic unit measure adjustment. It's // a wrapper of NewAverageSpeed. func AverageSpeed(unit int, format string, wcc ...WC) Decorator { @@ -133,16 +122,11 @@ func AverageSpeed(unit int, format string, wcc ...WC) Decorator { // unit=UnitKB, format="% .1f" output: "1.0 MB/s" // func NewAverageSpeed(unit int, format string, startTime time.Time, wcc ...WC) Decorator { - var wc WC - for _, widthConf := range wcc { - wc = widthConf - } if format == "" { format = "%.0f" } - wc.Init() d := &averageSpeed{ - WC: wc, + WC: initWC(wcc...), startTime: startTime, producer: chooseSpeedProducer(unit, format), } @@ -151,30 +135,20 @@ func NewAverageSpeed(unit int, format string, startTime time.Time, wcc ...WC) De type averageSpeed struct { WC - startTime time.Time - producer func(float64) string - msg string - completeMsg *string + startTime time.Time + producer func(float64) string + msg string } -func (d *averageSpeed) Decor(st *Statistics) string { - if st.Completed { - if d.completeMsg != nil { - return d.FormatMsg(*d.completeMsg) - } - return d.FormatMsg(d.msg) +func (d *averageSpeed) Decor(s Statistics) string { + if !s.Completed { + speed := float64(s.Current) / float64(time.Since(d.startTime)) + d.msg = d.producer(speed * 1e9) } - speed := float64(st.Current) / time.Since(d.startTime).Seconds() - d.msg = d.producer(speed) - return d.FormatMsg(d.msg) } -func (d *averageSpeed) OnCompleteMessage(msg string) { - d.completeMsg = &msg -} - func (d *averageSpeed) AverageAdjust(startTime time.Time) { d.startTime = startTime } @@ -183,11 +157,11 @@ func chooseSpeedProducer(unit int, format string) func(float64) string { switch unit { case UnitKiB: return func(speed float64) string { - return fmt.Sprintf(format, &speedType{SizeB1024(math.Round(speed))}) + return fmt.Sprintf(format, FmtAsSpeed(SizeB1024(math.Round(speed)))) } case UnitKB: return func(speed float64) string { - return fmt.Sprintf(format, &speedType{SizeB1000(math.Round(speed))}) + return fmt.Sprintf(format, FmtAsSpeed(SizeB1000(math.Round(speed)))) } default: return func(speed float64) string { diff --git a/vendor/github.com/vbauerster/mpb/v6/decor/spinner.go b/vendor/github.com/vbauerster/mpb/v6/decor/spinner.go new file mode 100644 index 0000000000..6871639db2 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/decor/spinner.go @@ -0,0 +1,21 @@ +package decor + +var defaultSpinnerStyle = []string{"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"} + +// Spinner returns spinner decorator. +// +// `frames` spinner frames, if nil or len==0, default is used +// +// `wcc` optional WC config +func Spinner(frames []string, wcc ...WC) Decorator { + if len(frames) == 0 { + frames = defaultSpinnerStyle + } + var count uint + f := func(s Statistics) string { + frame := frames[count%uint(len(frames))] + count++ + return frame + } + return Any(f, wcc...) +} diff --git a/vendor/github.com/vbauerster/mpb/v4/doc.go b/vendor/github.com/vbauerster/mpb/v6/doc.go similarity index 100% rename from vendor/github.com/vbauerster/mpb/v4/doc.go rename to vendor/github.com/vbauerster/mpb/v6/doc.go diff --git a/vendor/github.com/vbauerster/mpb/v4/internal/percentage.go b/vendor/github.com/vbauerster/mpb/v6/internal/percentage.go similarity index 76% rename from vendor/github.com/vbauerster/mpb/v4/internal/percentage.go rename to vendor/github.com/vbauerster/mpb/v6/internal/percentage.go index 7e261cb221..a8ef8be125 100644 --- a/vendor/github.com/vbauerster/mpb/v4/internal/percentage.go +++ b/vendor/github.com/vbauerster/mpb/v6/internal/percentage.go @@ -7,9 +7,13 @@ func Percentage(total, current int64, width int) float64 { if total <= 0 { return 0 } + if current >= total { + return float64(width) + } return float64(int64(width)*current) / float64(total) } +// PercentageRound same as Percentage but with math.Round. func PercentageRound(total, current int64, width int) float64 { return math.Round(Percentage(total, current, width)) } diff --git a/vendor/github.com/vbauerster/mpb/v6/internal/predicate.go b/vendor/github.com/vbauerster/mpb/v6/internal/predicate.go new file mode 100644 index 0000000000..1e4dd24d9d --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/internal/predicate.go @@ -0,0 +1,6 @@ +package internal + +// Predicate helper for internal use. +func Predicate(pick bool) func() bool { + return func() bool { return pick } +} diff --git a/vendor/github.com/vbauerster/mpb/v6/internal/width.go b/vendor/github.com/vbauerster/mpb/v6/internal/width.go new file mode 100644 index 0000000000..216320f249 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/internal/width.go @@ -0,0 +1,10 @@ +package internal + +// CheckRequestedWidth checks that requested width doesn't overflow +// available width +func CheckRequestedWidth(requested, available int) int { + if requested <= 0 || requested >= available { + return available + } + return requested +} diff --git a/vendor/github.com/vbauerster/mpb/v4/priority_queue.go b/vendor/github.com/vbauerster/mpb/v6/priority_queue.go similarity index 100% rename from vendor/github.com/vbauerster/mpb/v4/priority_queue.go rename to vendor/github.com/vbauerster/mpb/v6/priority_queue.go diff --git a/vendor/github.com/vbauerster/mpb/v4/progress.go b/vendor/github.com/vbauerster/mpb/v6/progress.go similarity index 63% rename from vendor/github.com/vbauerster/mpb/v4/progress.go rename to vendor/github.com/vbauerster/mpb/v6/progress.go index 4a0f3c1c15..5a3f962430 100644 --- a/vendor/github.com/vbauerster/mpb/v4/progress.go +++ b/vendor/github.com/vbauerster/mpb/v6/progress.go @@ -4,25 +4,26 @@ import ( "bytes" "container/heap" "context" + "fmt" "io" "io/ioutil" "log" + "math" "os" "sync" "time" - "github.com/vbauerster/mpb/v4/cwriter" - "github.com/vbauerster/mpb/v4/decor" + "github.com/vbauerster/mpb/v6/cwriter" + "github.com/vbauerster/mpb/v6/decor" ) const ( // default RefreshRate prr = 120 * time.Millisecond - // default width - pwidth = 80 ) -// Progress represents the container that renders Progress bars +// Progress represents a container that renders one or more progress +// bars. type Progress struct { ctx context.Context uwg *sync.WaitGroup @@ -30,26 +31,29 @@ type Progress struct { bwg *sync.WaitGroup operateState chan func(*pState) done chan struct{} - forceRefresh chan time.Time + refreshCh chan time.Time once sync.Once dlogger *log.Logger } +// pState holds bars in its priorityQueue. It gets passed to +// *Progress.serve(...) monitor goroutine. type pState struct { bHeap priorityQueue heapUpdated bool pMatrix map[int][]chan int aMatrix map[int][]chan int barShutdownQueue []*Bar - barPopQueue []*Bar // following are provided/overrided by user idCount int - width int + reqWidth int popCompleted bool + outputDiscarded bool rr time.Duration uwg *sync.WaitGroup - manualRefreshCh <-chan time.Time + externalRefresh <-chan interface{} + renderDelay <-chan struct{} shutdownNotifier chan struct{} parkedBars map[*Bar]*Bar output io.Writer @@ -68,7 +72,6 @@ func New(options ...ContainerOption) *Progress { func NewWithContext(ctx context.Context, options ...ContainerOption) *Progress { s := &pState{ bHeap: priorityQueue{}, - width: pwidth, rr: prr, parkedBars: make(map[*Bar]*Bar), output: os.Stdout, @@ -87,7 +90,6 @@ func NewWithContext(ctx context.Context, options ...ContainerOption) *Progress { cwg: new(sync.WaitGroup), bwg: new(sync.WaitGroup), operateState: make(chan func(*pState)), - forceRefresh: make(chan time.Time), done: make(chan struct{}), dlogger: log.New(s.debugOut, "[mpb] ", log.Lshortfile), } @@ -97,21 +99,25 @@ func NewWithContext(ctx context.Context, options ...ContainerOption) *Progress { return p } -// AddBar creates a new progress bar and adds to the container. +// AddBar creates a bar with default bar filler. Different filler can +// be choosen and applied via `*Progress.Add(...) *Bar` method. func (p *Progress) AddBar(total int64, options ...BarOption) *Bar { - return p.Add(total, NewBarFiller(DefaultBarStyle, false), options...) + return p.Add(total, NewBarFiller(BarDefaultStyle), options...) } -// AddSpinner creates a new spinner bar and adds to the container. +// AddSpinner creates a bar with default spinner filler. Different +// filler can be choosen and applied via `*Progress.Add(...) *Bar` +// method. func (p *Progress) AddSpinner(total int64, alignment SpinnerAlignment, options ...BarOption) *Bar { - return p.Add(total, NewSpinnerFiller(DefaultSpinnerStyle, alignment), options...) + return p.Add(total, NewSpinnerFiller(SpinnerDefaultStyle, alignment), options...) } // Add creates a bar which renders itself by provided filler. -// Set total to 0, if you plan to update it later. -func (p *Progress) Add(total int64, filler Filler, options ...BarOption) *Bar { +// If `total <= 0` trigger complete event is disabled until reset with *bar.SetTotal(int64, bool). +// Panics if *Progress instance is done, i.e. called after *Progress.Wait(). +func (p *Progress) Add(total int64, filler BarFiller, options ...BarOption) *Bar { if filler == nil { - filler = NewBarFiller(DefaultBarStyle, false) + filler = BarFillerFunc(func(io.Writer, int, decor.Statistics) {}) } p.bwg.Add(1) result := make(chan *Bar) @@ -134,7 +140,7 @@ func (p *Progress) Add(total int64, filler Filler, options ...BarOption) *Bar { return bar case <-p.done: p.bwg.Done() - return nil + panic(fmt.Sprintf("%T instance can't be reused after it's done!", p)) } } @@ -164,12 +170,12 @@ func (p *Progress) setBarPriority(b *Bar, priority int) { } } -// UpdateBarPriority same as *Bar.SetPriority. +// UpdateBarPriority same as *Bar.SetPriority(int). func (p *Progress) UpdateBarPriority(b *Bar, priority int) { p.setBarPriority(b, priority) } -// BarCount returns bars count +// BarCount returns bars count. func (p *Progress) BarCount() int { result := make(chan int, 1) select { @@ -180,7 +186,7 @@ func (p *Progress) BarCount() int { } } -// Wait waits far all bars to complete and finally shutdowns container. +// Wait waits for all bars to complete and finally shutdowns container. // After this method has been called, there is no way to reuse *Progress // instance. func (p *Progress) Wait() { @@ -205,29 +211,65 @@ func (p *Progress) shutdown() { func (p *Progress) serve(s *pState, cw *cwriter.Writer) { defer p.cwg.Done() - manualOrTickCh, cleanUp := s.manualOrTick() - defer cleanUp() - - refreshCh := fanInRefreshSrc(p.done, p.forceRefresh, manualOrTickCh) + p.refreshCh = s.newTicker(p.done) for { select { case op := <-p.operateState: op(s) - case _, ok := <-refreshCh: - if !ok { - if s.shutdownNotifier != nil { - close(s.shutdownNotifier) - } - return - } + case <-p.refreshCh: if err := s.render(cw); err != nil { p.dlogger.Println(err) } + case <-s.shutdownNotifier: + if s.heapUpdated { + if err := s.render(cw); err != nil { + p.dlogger.Println(err) + } + } + return } } } +func (s *pState) newTicker(done <-chan struct{}) chan time.Time { + ch := make(chan time.Time) + if s.shutdownNotifier == nil { + s.shutdownNotifier = make(chan struct{}) + } + go func() { + if s.renderDelay != nil { + <-s.renderDelay + } + var internalRefresh <-chan time.Time + if !s.outputDiscarded { + if s.externalRefresh == nil { + ticker := time.NewTicker(s.rr) + defer ticker.Stop() + internalRefresh = ticker.C + } + } else { + s.externalRefresh = nil + } + for { + select { + case t := <-internalRefresh: + ch <- t + case x := <-s.externalRefresh: + if t, ok := x.(time.Time); ok { + ch <- t + } else { + ch <- time.Now() + } + case <-done: + close(s.shutdownNotifier) + return + } + } + }() + return ch +} + func (s *pState) render(cw *cwriter.Writer) error { if s.heapUpdated { s.updateSyncMatrix() @@ -238,7 +280,7 @@ func (s *pState) render(cw *cwriter.Writer) error { tw, err := cw.GetWidth() if err != nil { - tw = s.width + tw = s.reqWidth } for i := 0; i < s.bHeap.Len(); i++ { bar := s.bHeap[i] @@ -255,14 +297,16 @@ func (s *pState) flush(cw *cwriter.Writer) error { b := heap.Pop(&s.bHeap).(*Bar) cw.ReadFrom(<-b.frameCh) if b.toShutdown { - // shutdown at next flush - // this ensures no bar ends up with less than 100% rendered - defer func() { + if b.recoveredPanic != nil { s.barShutdownQueue = append(s.barShutdownQueue, b) - if !b.noPop && s.popCompleted { - b.priority = -1 - } - }() + b.toShutdown = false + } else { + // shutdown at next flush + // this ensures no bar ends up with less than 100% rendered + defer func() { + s.barShutdownQueue = append(s.barShutdownQueue, b) + }() + } } lineCount += b.extendedLines + 1 bm[b] = struct{}{} @@ -275,27 +319,18 @@ func (s *pState) flush(cw *cwriter.Writer) error { delete(s.parkedBars, b) b.toDrop = true } + if s.popCompleted && !b.noPop { + lineCount -= b.extendedLines + 1 + b.toDrop = true + } if b.toDrop { delete(bm, b) s.heapUpdated = true - } else if s.popCompleted { - if b := b; !b.noPop { - defer func() { - s.barPopQueue = append(s.barPopQueue, b) - }() - } } b.cancel() } s.barShutdownQueue = s.barShutdownQueue[0:0] - for _, b := range s.barPopQueue { - delete(bm, b) - s.heapUpdated = true - lineCount -= b.extendedLines + 1 - } - s.barPopQueue = s.barPopQueue[0:0] - for b := range bm { heap.Push(&s.bHeap, b) } @@ -303,14 +338,6 @@ func (s *pState) flush(cw *cwriter.Writer) error { return cw.Flush(lineCount) } -func (s *pState) manualOrTick() (<-chan time.Time, func()) { - if s.manualRefreshCh != nil { - return s.manualRefreshCh, func() {} - } - ticker := time.NewTicker(s.rr) - return ticker.C, ticker.Stop -} - func (s *pState) updateSyncMatrix() { s.pMatrix = make(map[int][]chan int) s.aMatrix = make(map[int][]chan int) @@ -329,22 +356,19 @@ func (s *pState) updateSyncMatrix() { } } -func (s *pState) makeBarState(total int64, filler Filler, options ...BarOption) *bState { +func (s *pState) makeBarState(total int64, filler BarFiller, options ...BarOption) *bState { bs := &bState{ + id: s.idCount, + priority: s.idCount, + reqWidth: s.reqWidth, total: total, - baseF: filler, filler: filler, - priority: s.idCount, - id: s.idCount, - width: s.width, + extender: func(r io.Reader, _ int, _ decor.Statistics) (io.Reader, int) { return r, 0 }, debugOut: s.debugOut, - extender: func(r io.Reader, _ int, _ *decor.Statistics) (io.Reader, int) { - return r, 0 - }, } - if f, ok := filler.(BaseFiller); ok { - bs.baseF = f.BaseFiller() + if total > 0 { + bs.triggerComplete = true } for _, opt := range options { @@ -353,62 +377,36 @@ func (s *pState) makeBarState(total int64, filler Filler, options ...BarOption) } } - bs.bufP = bytes.NewBuffer(make([]byte, 0, bs.width)) - bs.bufB = bytes.NewBuffer(make([]byte, 0, bs.width)) - bs.bufA = bytes.NewBuffer(make([]byte, 0, bs.width)) + if bs.middleware != nil { + bs.filler = bs.middleware(filler) + bs.middleware = nil + } + + if s.popCompleted && !bs.noPop { + bs.priority = -(math.MaxInt32 - s.idCount) + } + + bs.bufP = bytes.NewBuffer(make([]byte, 0, 128)) + bs.bufB = bytes.NewBuffer(make([]byte, 0, 256)) + bs.bufA = bytes.NewBuffer(make([]byte, 0, 128)) return bs } func syncWidth(matrix map[int][]chan int) { for _, column := range matrix { - column := column - go func() { - var maxWidth int - for _, ch := range column { - if w := <-ch; w > maxWidth { - maxWidth = w - } - } - for _, ch := range column { - ch <- maxWidth - } - }() + go maxWidthDistributor(column) } } -func fanInRefreshSrc(done <-chan struct{}, channels ...<-chan time.Time) <-chan time.Time { - var wg sync.WaitGroup - multiplexedStream := make(chan time.Time) - - multiplex := func(c <-chan time.Time) { - defer wg.Done() - // source channels are never closed (time.Ticker never closes associated - // channel), so we cannot simply range over a c, instead we use select - // inside infinite loop - for { - select { - case v := <-c: - select { - case multiplexedStream <- v: - case <-done: - return - } - case <-done: - return - } +var maxWidthDistributor = func(column []chan int) { + var maxWidth int + for _, ch := range column { + if w := <-ch; w > maxWidth { + maxWidth = w } } - - wg.Add(len(channels)) - for _, c := range channels { - go multiplex(c) + for _, ch := range column { + ch <- maxWidth } - - go func() { - wg.Wait() - close(multiplexedStream) - }() - - return multiplexedStream } diff --git a/vendor/github.com/vbauerster/mpb/v6/proxyreader.go b/vendor/github.com/vbauerster/mpb/v6/proxyreader.go new file mode 100644 index 0000000000..316f438d76 --- /dev/null +++ b/vendor/github.com/vbauerster/mpb/v6/proxyreader.go @@ -0,0 +1,90 @@ +package mpb + +import ( + "io" + "io/ioutil" + "time" +) + +type proxyReader struct { + io.ReadCloser + bar *Bar +} + +func (x *proxyReader) Read(p []byte) (int, error) { + n, err := x.ReadCloser.Read(p) + x.bar.IncrBy(n) + if err == io.EOF { + go x.bar.SetTotal(0, true) + } + return n, err +} + +type proxyWriterTo struct { + io.ReadCloser // *proxyReader + wt io.WriterTo + bar *Bar +} + +func (x *proxyWriterTo) WriteTo(w io.Writer) (int64, error) { + n, err := x.wt.WriteTo(w) + x.bar.IncrInt64(n) + if err == io.EOF { + go x.bar.SetTotal(0, true) + } + return n, err +} + +type ewmaProxyReader struct { + io.ReadCloser // *proxyReader + bar *Bar + iT time.Time +} + +func (x *ewmaProxyReader) Read(p []byte) (int, error) { + n, err := x.ReadCloser.Read(p) + if n > 0 { + x.bar.DecoratorEwmaUpdate(time.Since(x.iT)) + x.iT = time.Now() + } + return n, err +} + +type ewmaProxyWriterTo struct { + io.ReadCloser // *ewmaProxyReader + wt io.WriterTo // *proxyWriterTo + bar *Bar + iT time.Time +} + +func (x *ewmaProxyWriterTo) WriteTo(w io.Writer) (int64, error) { + n, err := x.wt.WriteTo(w) + if n > 0 { + x.bar.DecoratorEwmaUpdate(time.Since(x.iT)) + x.iT = time.Now() + } + return n, err +} + +func newProxyReader(r io.Reader, bar *Bar) io.ReadCloser { + rc := toReadCloser(r) + rc = &proxyReader{rc, bar} + + if wt, isWriterTo := r.(io.WriterTo); bar.hasEwmaDecorators { + now := time.Now() + rc = &ewmaProxyReader{rc, bar, now} + if isWriterTo { + rc = &ewmaProxyWriterTo{rc, wt, bar, now} + } + } else if isWriterTo { + rc = &proxyWriterTo{rc, wt, bar} + } + return rc +} + +func toReadCloser(r io.Reader) io.ReadCloser { + if rc, ok := r.(io.ReadCloser); ok { + return rc + } + return ioutil.NopCloser(r) +} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index c0f9f2d523..b8313e98af 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -204,6 +204,7 @@ struct ltchars { #include #include #include +#include #include #include #include @@ -561,7 +562,9 @@ ccflags="$@" $2 ~ /^(HDIO|WIN|SMART)_/ || $2 ~ /^CRYPTO_/ || $2 ~ /^TIPC_/ || + $2 !~ "DEVLINK_RELOAD_LIMITS_VALID_MASK" && $2 ~ /^DEVLINK_/ || + $2 ~ /^ETHTOOL_/ || $2 ~ /^LWTUNNEL_IP/ || $2 !~ "WMESGLEN" && $2 ~ /^W[A-Z0-9]+$/ || diff --git a/vendor/golang.org/x/sys/unix/ptrace_darwin.go b/vendor/golang.org/x/sys/unix/ptrace_darwin.go new file mode 100644 index 0000000000..fc568b5403 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ptrace_darwin.go @@ -0,0 +1,11 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin,!ios + +package unix + +func ptrace(request int, pid int, addr uintptr, data uintptr) error { + return ptrace1(request, pid, addr, data) +} diff --git a/vendor/golang.org/x/sys/unix/ptrace_ios.go b/vendor/golang.org/x/sys/unix/ptrace_ios.go new file mode 100644 index 0000000000..183441c9a5 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ptrace_ios.go @@ -0,0 +1,11 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ios + +package unix + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + return ENOTSUP +} diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go b/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go index dc0befee37..ee852f1abc 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.1_13.go @@ -26,7 +26,6 @@ func fdopendir(fd int) (dir uintptr, err error) { func libc_fdopendir_trampoline() -//go:linkname libc_fdopendir libc_fdopendir //go:cgo_import_dynamic libc_fdopendir fdopendir "/usr/lib/libSystem.B.dylib" func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index b625738900..16f9c226b9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -119,13 +119,16 @@ type attrList struct { Forkattr uint32 } -//sysnb pipe() (r int, w int, err error) +//sysnb pipe(p *[2]int32) (err error) func Pipe(p []int) (err error) { if len(p) != 2 { return EINVAL } - p[0], p[1], err = pipe() + var x [2]int32 + err = pipe(&x) + p[0] = int(x[0]) + p[1] = int(x[1]) return } diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go index 6c1f4ab95b..ee065fcf2d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_386.go @@ -45,6 +45,6 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64 //sys getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64 //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 -//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) +//sys ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 //sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go index 0582ae256e..7a1f64a7b6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -45,6 +45,6 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64 //sys getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT64 //sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 -//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) +//sys ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace //sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 //sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go index c6a9733b4c..d30735c5d6 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go @@ -6,7 +6,7 @@ package unix import "syscall" -func ptrace(request int, pid int, addr uintptr, data uintptr) error { +func ptrace1(request int, pid int, addr uintptr, data uintptr) error { return ENOTSUP } diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go index 253afa4de5..9f85fd4046 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -45,6 +45,6 @@ func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, //sys Fstatfs(fd int, stat *Statfs_t) (err error) //sys getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) = SYS_GETFSSTAT //sys Lstat(path string, stat *Stat_t) (err error) -//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) +//sys ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) = SYS_ptrace //sys Stat(path string, stat *Stat_t) (err error) //sys Statfs(path string, stat *Statfs_t) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_illumos.go b/vendor/golang.org/x/sys/unix/syscall_illumos.go index bbc4f3ea54..7a2d4120fc 100644 --- a/vendor/golang.org/x/sys/unix/syscall_illumos.go +++ b/vendor/golang.org/x/sys/unix/syscall_illumos.go @@ -75,16 +75,3 @@ func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) { } return } - -//sysnb pipe2(p *[2]_C_int, flags int) (err error) - -func Pipe2(p []int, flags int) error { - if len(p) != 2 { - return EINVAL - } - var pp [2]_C_int - err := pipe2(&pp, flags) - p[0] = int(pp[0]) - p[1] = int(pp[1]) - return err -} diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index fee6e99528..184786ed99 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -68,6 +68,19 @@ func Pipe(p []int) (err error) { return nil } +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) error { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err := pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return err +} + func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { if sa.Port < 0 || sa.Port > 0xFFFF { return nil, 0, EINVAL diff --git a/vendor/golang.org/x/sys/unix/timestruct.go b/vendor/golang.org/x/sys/unix/timestruct.go index 4a672f5694..103604299e 100644 --- a/vendor/golang.org/x/sys/unix/timestruct.go +++ b/vendor/golang.org/x/sys/unix/timestruct.go @@ -8,12 +8,10 @@ package unix import "time" -// TimespecToNsec converts a Timespec value into a number of -// nanoseconds since the Unix epoch. -func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } +// TimespecToNSec returns the time stored in ts as nanoseconds. +func TimespecToNsec(ts Timespec) int64 { return ts.Nano() } -// NsecToTimespec takes a number of nanoseconds since the Unix epoch -// and returns the corresponding Timespec value. +// NsecToTimespec converts a number of nanoseconds into a Timespec. func NsecToTimespec(nsec int64) Timespec { sec := nsec / 1e9 nsec = nsec % 1e9 @@ -42,12 +40,10 @@ func TimeToTimespec(t time.Time) (Timespec, error) { return ts, nil } -// TimevalToNsec converts a Timeval value into a number of nanoseconds -// since the Unix epoch. -func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 } +// TimevalToNsec returns the time stored in tv as nanoseconds. +func TimevalToNsec(tv Timeval) int64 { return tv.Nano() } -// NsecToTimeval takes a number of nanoseconds since the Unix epoch -// and returns the corresponding Timeval value. +// NsecToTimeval converts a number of nanoseconds into a Timeval. func NsecToTimeval(nsec int64) Timeval { nsec += 999 // round up to microsecond usec := nsec % 1e9 / 1e3 @@ -59,24 +55,22 @@ func NsecToTimeval(nsec int64) Timeval { return setTimeval(sec, usec) } -// Unix returns ts as the number of seconds and nanoseconds elapsed since the -// Unix epoch. +// Unix returns the time stored in ts as seconds plus nanoseconds. func (ts *Timespec) Unix() (sec int64, nsec int64) { return int64(ts.Sec), int64(ts.Nsec) } -// Unix returns tv as the number of seconds and nanoseconds elapsed since the -// Unix epoch. +// Unix returns the time stored in tv as seconds plus nanoseconds. func (tv *Timeval) Unix() (sec int64, nsec int64) { return int64(tv.Sec), int64(tv.Usec) * 1000 } -// Nano returns ts as the number of nanoseconds elapsed since the Unix epoch. +// Nano returns the time stored in ts as nanoseconds. func (ts *Timespec) Nano() int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } -// Nano returns tv as the number of nanoseconds elapsed since the Unix epoch. +// Nano returns the time stored in tv as nanoseconds. func (tv *Timeval) Nano() int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 } diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index b46110354d..b3463a8b5a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -65,6 +65,7 @@ const ( ALG_OP_ENCRYPT = 0x1 ALG_SET_AEAD_ASSOCLEN = 0x4 ALG_SET_AEAD_AUTHSIZE = 0x5 + ALG_SET_DRBG_ENTROPY = 0x6 ALG_SET_IV = 0x2 ALG_SET_KEY = 0x1 ALG_SET_OP = 0x3 @@ -179,8 +180,10 @@ const ( BPF_F_ANY_ALIGNMENT = 0x2 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_REPLACE = 0x4 + BPF_F_SLEEPABLE = 0x10 BPF_F_STRICT_ALIGNMENT = 0x1 BPF_F_TEST_RND_HI32 = 0x4 + BPF_F_TEST_RUN_ON_CPU = 0x1 BPF_F_TEST_STATE_FREQ = 0x8 BPF_H = 0x8 BPF_IMM = 0x0 @@ -219,6 +222,7 @@ const ( BPF_NET_OFF = -0x100000 BPF_OBJ_NAME_LEN = 0x10 BPF_OR = 0x40 + BPF_PSEUDO_BTF_ID = 0x3 BPF_PSEUDO_CALL = 0x1 BPF_PSEUDO_MAP_FD = 0x1 BPF_PSEUDO_MAP_VALUE = 0x2 @@ -429,10 +433,13 @@ const ( DEBUGFS_MAGIC = 0x64626720 DEVLINK_CMD_ESWITCH_MODE_GET = 0x1d DEVLINK_CMD_ESWITCH_MODE_SET = 0x1e + DEVLINK_FLASH_OVERWRITE_IDENTIFIERS = 0x2 + DEVLINK_FLASH_OVERWRITE_SETTINGS = 0x1 DEVLINK_GENL_MCGRP_CONFIG_NAME = "config" DEVLINK_GENL_NAME = "devlink" DEVLINK_GENL_VERSION = 0x1 DEVLINK_SB_THRESHOLD_TO_ALPHA_MAX = 0x14 + DEVLINK_SUPPORTED_FLASH_OVERWRITE_SECTIONS = 0x3 DEVMEM_MAGIC = 0x454d444d DEVPTS_SUPER_MAGIC = 0x1cd1 DMA_BUF_MAGIC = 0x444d4142 @@ -477,9 +484,9 @@ const ( DM_UUID_FLAG = 0x4000 DM_UUID_LEN = 0x81 DM_VERSION = 0xc138fd00 - DM_VERSION_EXTRA = "-ioctl (2020-02-27)" + DM_VERSION_EXTRA = "-ioctl (2020-10-01)" DM_VERSION_MAJOR = 0x4 - DM_VERSION_MINOR = 0x2a + DM_VERSION_MINOR = 0x2b DM_VERSION_PATCHLEVEL = 0x0 DT_BLK = 0x6 DT_CHR = 0x2 @@ -520,6 +527,119 @@ const ( EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 + ESP_V4_FLOW = 0xa + ESP_V6_FLOW = 0xc + ETHER_FLOW = 0x12 + ETHTOOL_BUSINFO_LEN = 0x20 + ETHTOOL_EROMVERS_LEN = 0x20 + ETHTOOL_FEC_AUTO = 0x2 + ETHTOOL_FEC_BASER = 0x10 + ETHTOOL_FEC_LLRS = 0x20 + ETHTOOL_FEC_NONE = 0x1 + ETHTOOL_FEC_OFF = 0x4 + ETHTOOL_FEC_RS = 0x8 + ETHTOOL_FLAG_ALL = 0x7 + ETHTOOL_FLAG_COMPACT_BITSETS = 0x1 + ETHTOOL_FLAG_OMIT_REPLY = 0x2 + ETHTOOL_FLAG_STATS = 0x4 + ETHTOOL_FLASHDEV = 0x33 + ETHTOOL_FLASH_MAX_FILENAME = 0x80 + ETHTOOL_FWVERS_LEN = 0x20 + ETHTOOL_F_COMPAT = 0x4 + ETHTOOL_F_UNSUPPORTED = 0x1 + ETHTOOL_F_WISH = 0x2 + ETHTOOL_GCHANNELS = 0x3c + ETHTOOL_GCOALESCE = 0xe + ETHTOOL_GDRVINFO = 0x3 + ETHTOOL_GEEE = 0x44 + ETHTOOL_GEEPROM = 0xb + ETHTOOL_GENL_NAME = "ethtool" + ETHTOOL_GENL_VERSION = 0x1 + ETHTOOL_GET_DUMP_DATA = 0x40 + ETHTOOL_GET_DUMP_FLAG = 0x3f + ETHTOOL_GET_TS_INFO = 0x41 + ETHTOOL_GFEATURES = 0x3a + ETHTOOL_GFECPARAM = 0x50 + ETHTOOL_GFLAGS = 0x25 + ETHTOOL_GGRO = 0x2b + ETHTOOL_GGSO = 0x23 + ETHTOOL_GLINK = 0xa + ETHTOOL_GLINKSETTINGS = 0x4c + ETHTOOL_GMODULEEEPROM = 0x43 + ETHTOOL_GMODULEINFO = 0x42 + ETHTOOL_GMSGLVL = 0x7 + ETHTOOL_GPAUSEPARAM = 0x12 + ETHTOOL_GPERMADDR = 0x20 + ETHTOOL_GPFLAGS = 0x27 + ETHTOOL_GPHYSTATS = 0x4a + ETHTOOL_GREGS = 0x4 + ETHTOOL_GRINGPARAM = 0x10 + ETHTOOL_GRSSH = 0x46 + ETHTOOL_GRXCLSRLALL = 0x30 + ETHTOOL_GRXCLSRLCNT = 0x2e + ETHTOOL_GRXCLSRULE = 0x2f + ETHTOOL_GRXCSUM = 0x14 + ETHTOOL_GRXFH = 0x29 + ETHTOOL_GRXFHINDIR = 0x38 + ETHTOOL_GRXNTUPLE = 0x36 + ETHTOOL_GRXRINGS = 0x2d + ETHTOOL_GSET = 0x1 + ETHTOOL_GSG = 0x18 + ETHTOOL_GSSET_INFO = 0x37 + ETHTOOL_GSTATS = 0x1d + ETHTOOL_GSTRINGS = 0x1b + ETHTOOL_GTSO = 0x1e + ETHTOOL_GTUNABLE = 0x48 + ETHTOOL_GTXCSUM = 0x16 + ETHTOOL_GUFO = 0x21 + ETHTOOL_GWOL = 0x5 + ETHTOOL_MCGRP_MONITOR_NAME = "monitor" + ETHTOOL_NWAY_RST = 0x9 + ETHTOOL_PERQUEUE = 0x4b + ETHTOOL_PHYS_ID = 0x1c + ETHTOOL_PHY_EDPD_DFLT_TX_MSECS = 0xffff + ETHTOOL_PHY_EDPD_DISABLE = 0x0 + ETHTOOL_PHY_EDPD_NO_TX = 0xfffe + ETHTOOL_PHY_FAST_LINK_DOWN_OFF = 0xff + ETHTOOL_PHY_FAST_LINK_DOWN_ON = 0x0 + ETHTOOL_PHY_GTUNABLE = 0x4e + ETHTOOL_PHY_STUNABLE = 0x4f + ETHTOOL_RESET = 0x34 + ETHTOOL_RXNTUPLE_ACTION_CLEAR = -0x2 + ETHTOOL_RXNTUPLE_ACTION_DROP = -0x1 + ETHTOOL_RX_FLOW_SPEC_RING = 0xffffffff + ETHTOOL_RX_FLOW_SPEC_RING_VF = 0xff00000000 + ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF = 0x20 + ETHTOOL_SCHANNELS = 0x3d + ETHTOOL_SCOALESCE = 0xf + ETHTOOL_SEEE = 0x45 + ETHTOOL_SEEPROM = 0xc + ETHTOOL_SET_DUMP = 0x3e + ETHTOOL_SFEATURES = 0x3b + ETHTOOL_SFECPARAM = 0x51 + ETHTOOL_SFLAGS = 0x26 + ETHTOOL_SGRO = 0x2c + ETHTOOL_SGSO = 0x24 + ETHTOOL_SLINKSETTINGS = 0x4d + ETHTOOL_SMSGLVL = 0x8 + ETHTOOL_SPAUSEPARAM = 0x13 + ETHTOOL_SPFLAGS = 0x28 + ETHTOOL_SRINGPARAM = 0x11 + ETHTOOL_SRSSH = 0x47 + ETHTOOL_SRXCLSRLDEL = 0x31 + ETHTOOL_SRXCLSRLINS = 0x32 + ETHTOOL_SRXCSUM = 0x15 + ETHTOOL_SRXFH = 0x2a + ETHTOOL_SRXFHINDIR = 0x39 + ETHTOOL_SRXNTUPLE = 0x35 + ETHTOOL_SSET = 0x2 + ETHTOOL_SSG = 0x19 + ETHTOOL_STSO = 0x1f + ETHTOOL_STUNABLE = 0x49 + ETHTOOL_STXCSUM = 0x17 + ETHTOOL_SUFO = 0x22 + ETHTOOL_SWOL = 0x6 + ETHTOOL_TEST = 0x1a ETH_P_1588 = 0x88f7 ETH_P_8021AD = 0x88a8 ETH_P_8021AH = 0x88e7 @@ -989,6 +1109,7 @@ const ( IPV6_DONTFRAG = 0x3e IPV6_DROP_MEMBERSHIP = 0x15 IPV6_DSTOPTS = 0x3b + IPV6_FLOW = 0x11 IPV6_FREEBIND = 0x4e IPV6_HDRINCL = 0x24 IPV6_HOPLIMIT = 0x34 @@ -1038,6 +1159,7 @@ const ( IPV6_TRANSPARENT = 0x4b IPV6_UNICAST_HOPS = 0x10 IPV6_UNICAST_IF = 0x4c + IPV6_USER_FLOW = 0xe IPV6_V6ONLY = 0x1a IPV6_XFRM_POLICY = 0x23 IP_ADD_MEMBERSHIP = 0x23 @@ -1094,6 +1216,7 @@ const ( IP_TTL = 0x2 IP_UNBLOCK_SOURCE = 0x25 IP_UNICAST_IF = 0x32 + IP_USER_FLOW = 0xd IP_XFRM_POLICY = 0x11 ISOFS_SUPER_MAGIC = 0x9660 ISTRIP = 0x20 @@ -1331,6 +1454,7 @@ const ( MS_NOREMOTELOCK = 0x8000000 MS_NOSEC = 0x10000000 MS_NOSUID = 0x2 + MS_NOSYMFOLLOW = 0x100 MS_NOUSER = -0x80000000 MS_POSIXACL = 0x10000 MS_PRIVATE = 0x40000 @@ -1572,7 +1696,7 @@ const ( PERF_MEM_REMOTE_REMOTE = 0x1 PERF_MEM_REMOTE_SHIFT = 0x25 PERF_MEM_SNOOPX_FWD = 0x1 - PERF_MEM_SNOOPX_SHIFT = 0x25 + PERF_MEM_SNOOPX_SHIFT = 0x26 PERF_MEM_SNOOP_HIT = 0x4 PERF_MEM_SNOOP_HITM = 0x10 PERF_MEM_SNOOP_MISS = 0x8 @@ -1672,6 +1796,13 @@ const ( PR_MCE_KILL_SET = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_MTE_TAG_MASK = 0x7fff8 + PR_MTE_TAG_SHIFT = 0x3 + PR_MTE_TCF_ASYNC = 0x4 + PR_MTE_TCF_MASK = 0x6 + PR_MTE_TCF_NONE = 0x0 + PR_MTE_TCF_SHIFT = 0x1 + PR_MTE_TCF_SYNC = 0x2 PR_PAC_APDAKEY = 0x4 PR_PAC_APDBKEY = 0x8 PR_PAC_APGAKEY = 0x10 @@ -2206,7 +2337,7 @@ const ( STATX_ATTR_APPEND = 0x20 STATX_ATTR_AUTOMOUNT = 0x1000 STATX_ATTR_COMPRESSED = 0x4 - STATX_ATTR_DAX = 0x2000 + STATX_ATTR_DAX = 0x200000 STATX_ATTR_ENCRYPTED = 0x800 STATX_ATTR_IMMUTABLE = 0x10 STATX_ATTR_MOUNT_ROOT = 0x2000 @@ -2325,6 +2456,8 @@ const ( TCP_TX_DELAY = 0x25 TCP_ULP = 0x1f TCP_USER_TIMEOUT = 0x12 + TCP_V4_FLOW = 0x1 + TCP_V6_FLOW = 0x5 TCP_WINDOW_CLAMP = 0xa TCP_ZEROCOPY_RECEIVE = 0x23 TFD_TIMER_ABSTIME = 0x1 @@ -2390,6 +2523,7 @@ const ( TIPC_NODE_STATE = 0x0 TIPC_OK = 0x0 TIPC_PUBLISHED = 0x1 + TIPC_REKEYING_NOW = 0xffffffff TIPC_RESERVED_TYPES = 0x40 TIPC_RETDATA = 0x2 TIPC_SERVICE_ADDR = 0x2 @@ -2450,6 +2584,7 @@ const ( VM_SOCKETS_INVALID_VERSION = 0xffffffff VQUIT = 0x1 VT0 = 0x0 + WAKE_MAGIC = 0x20 WALL = 0x40000000 WCLONE = 0x80000000 WCONTINUED = 0x8 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index dd282c08b7..336e0b326a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -4,7 +4,7 @@ // +build 386,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 82fc93c7bb..961507e937 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -4,7 +4,7 @@ // +build amd64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index fe7094f276..a65576db7b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -4,7 +4,7 @@ // +build arm,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 3b6cc58803..cf075caa8c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -4,7 +4,7 @@ // +build arm64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/_const.go package unix @@ -196,6 +196,8 @@ const ( PPPIOCXFERUNIT = 0x744e PROT_BTI = 0x10 PR_SET_PTRACER_ANY = 0xffffffffffffffff + PTRACE_PEEKMTETAGS = 0x21 + PTRACE_POKEMTETAGS = 0x22 PTRACE_SYSEMU = 0x1f PTRACE_SYSEMU_SINGLESTEP = 0x20 RLIMIT_AS = 0x9 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index ce3d9ae156..efe90deeab 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -4,7 +4,7 @@ // +build mips,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 7a85215ce5..8b0e8911dc 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -4,7 +4,7 @@ // +build mips64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 07d4cc1bd5..e9430cd1a2 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -4,7 +4,7 @@ // +build mips64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index d4842ba1c2..61e4f5db67 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -4,7 +4,7 @@ // +build mipsle,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 941e20dace..973ad93463 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -4,7 +4,7 @@ // +build ppc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 63d3bc5662..70a7406ba1 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -4,7 +4,7 @@ // +build ppc64le,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index 490bee1ab1..b1bf7997cb 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -4,7 +4,7 @@ // +build riscv64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 467b8218e8..7053d10ba0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -4,7 +4,7 @@ // +build s390x,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 79fbafbcf6..137cfe7962 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -4,7 +4,7 @@ // +build sparc64,linux // Code generated by cmd/cgo -godefs; DO NOT EDIT. -// cgo -godefs -- -Wall -Werror -static -I/tmp/include _const.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/_const.go package unix diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go index e263fbdb8b..c8c142c59a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_13.go @@ -24,7 +24,6 @@ func closedir(dir uintptr) (err error) { func libc_closedir_trampoline() -//go:linkname libc_closedir libc_closedir //go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -37,5 +36,4 @@ func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { func libc_readdir_r_trampoline() -//go:linkname libc_readdir_r libc_readdir_r //go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go index 6eb4579832..3877183483 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -25,7 +25,6 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { func libc_getgroups_trampoline() -//go:linkname libc_getgroups libc_getgroups //go:cgo_import_dynamic libc_getgroups getgroups "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -40,7 +39,6 @@ func setgroups(ngid int, gid *_Gid_t) (err error) { func libc_setgroups_trampoline() -//go:linkname libc_setgroups libc_setgroups //go:cgo_import_dynamic libc_setgroups setgroups "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -56,7 +54,6 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err func libc_wait4_trampoline() -//go:linkname libc_wait4 libc_wait4 //go:cgo_import_dynamic libc_wait4 wait4 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -72,7 +69,6 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { func libc_accept_trampoline() -//go:linkname libc_accept libc_accept //go:cgo_import_dynamic libc_accept accept "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -87,7 +83,6 @@ func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { func libc_bind_trampoline() -//go:linkname libc_bind libc_bind //go:cgo_import_dynamic libc_bind bind "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -102,7 +97,6 @@ func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { func libc_connect_trampoline() -//go:linkname libc_connect libc_connect //go:cgo_import_dynamic libc_connect connect "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -118,7 +112,6 @@ func socket(domain int, typ int, proto int) (fd int, err error) { func libc_socket_trampoline() -//go:linkname libc_socket libc_socket //go:cgo_import_dynamic libc_socket socket "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -133,7 +126,6 @@ func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen func libc_getsockopt_trampoline() -//go:linkname libc_getsockopt libc_getsockopt //go:cgo_import_dynamic libc_getsockopt getsockopt "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -148,7 +140,6 @@ func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) func libc_setsockopt_trampoline() -//go:linkname libc_setsockopt libc_setsockopt //go:cgo_import_dynamic libc_setsockopt setsockopt "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -163,7 +154,6 @@ func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { func libc_getpeername_trampoline() -//go:linkname libc_getpeername libc_getpeername //go:cgo_import_dynamic libc_getpeername getpeername "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -178,7 +168,6 @@ func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { func libc_getsockname_trampoline() -//go:linkname libc_getsockname libc_getsockname //go:cgo_import_dynamic libc_getsockname getsockname "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -193,7 +182,6 @@ func Shutdown(s int, how int) (err error) { func libc_shutdown_trampoline() -//go:linkname libc_shutdown libc_shutdown //go:cgo_import_dynamic libc_shutdown shutdown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -208,7 +196,6 @@ func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { func libc_socketpair_trampoline() -//go:linkname libc_socketpair libc_socketpair //go:cgo_import_dynamic libc_socketpair socketpair "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -230,7 +217,6 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl func libc_recvfrom_trampoline() -//go:linkname libc_recvfrom libc_recvfrom //go:cgo_import_dynamic libc_recvfrom recvfrom "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -251,7 +237,6 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( func libc_sendto_trampoline() -//go:linkname libc_sendto libc_sendto //go:cgo_import_dynamic libc_sendto sendto "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -267,7 +252,6 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { func libc_recvmsg_trampoline() -//go:linkname libc_recvmsg libc_recvmsg //go:cgo_import_dynamic libc_recvmsg recvmsg "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -283,7 +267,6 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { func libc_sendmsg_trampoline() -//go:linkname libc_sendmsg libc_sendmsg //go:cgo_import_dynamic libc_sendmsg sendmsg "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -299,7 +282,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne func libc_kevent_trampoline() -//go:linkname libc_kevent libc_kevent //go:cgo_import_dynamic libc_kevent kevent "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -319,7 +301,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { func libc_utimes_trampoline() -//go:linkname libc_utimes libc_utimes //go:cgo_import_dynamic libc_utimes utimes "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -334,7 +315,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { func libc_futimes_trampoline() -//go:linkname libc_futimes libc_futimes //go:cgo_import_dynamic libc_futimes futimes "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -350,7 +330,6 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { func libc_poll_trampoline() -//go:linkname libc_poll libc_poll //go:cgo_import_dynamic libc_poll poll "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -371,7 +350,6 @@ func Madvise(b []byte, behav int) (err error) { func libc_madvise_trampoline() -//go:linkname libc_madvise libc_madvise //go:cgo_import_dynamic libc_madvise madvise "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -392,7 +370,6 @@ func Mlock(b []byte) (err error) { func libc_mlock_trampoline() -//go:linkname libc_mlock libc_mlock //go:cgo_import_dynamic libc_mlock mlock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -407,7 +384,6 @@ func Mlockall(flags int) (err error) { func libc_mlockall_trampoline() -//go:linkname libc_mlockall libc_mlockall //go:cgo_import_dynamic libc_mlockall mlockall "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -428,7 +404,6 @@ func Mprotect(b []byte, prot int) (err error) { func libc_mprotect_trampoline() -//go:linkname libc_mprotect libc_mprotect //go:cgo_import_dynamic libc_mprotect mprotect "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -449,7 +424,6 @@ func Msync(b []byte, flags int) (err error) { func libc_msync_trampoline() -//go:linkname libc_msync libc_msync //go:cgo_import_dynamic libc_msync msync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -470,7 +444,6 @@ func Munlock(b []byte) (err error) { func libc_munlock_trampoline() -//go:linkname libc_munlock libc_munlock //go:cgo_import_dynamic libc_munlock munlock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -485,15 +458,12 @@ func Munlockall() (err error) { func libc_munlockall_trampoline() -//go:linkname libc_munlockall libc_munlockall //go:cgo_import_dynamic libc_munlockall munlockall "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (r int, w int, err error) { - r0, r1, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), 0, 0, 0) - r = int(r0) - w = int(r1) +func pipe(p *[2]int32) (err error) { + _, _, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -502,7 +472,6 @@ func pipe() (r int, w int, err error) { func libc_pipe_trampoline() -//go:linkname libc_pipe libc_pipe //go:cgo_import_dynamic libc_pipe pipe "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -528,7 +497,6 @@ func getxattr(path string, attr string, dest *byte, size int, position uint32, o func libc_getxattr_trampoline() -//go:linkname libc_getxattr libc_getxattr //go:cgo_import_dynamic libc_getxattr getxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -549,7 +517,6 @@ func fgetxattr(fd int, attr string, dest *byte, size int, position uint32, optio func libc_fgetxattr_trampoline() -//go:linkname libc_fgetxattr libc_fgetxattr //go:cgo_import_dynamic libc_fgetxattr fgetxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -574,7 +541,6 @@ func setxattr(path string, attr string, data *byte, size int, position uint32, o func libc_setxattr_trampoline() -//go:linkname libc_setxattr libc_setxattr //go:cgo_import_dynamic libc_setxattr setxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -594,7 +560,6 @@ func fsetxattr(fd int, attr string, data *byte, size int, position uint32, optio func libc_fsetxattr_trampoline() -//go:linkname libc_fsetxattr libc_fsetxattr //go:cgo_import_dynamic libc_fsetxattr fsetxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -619,7 +584,6 @@ func removexattr(path string, attr string, options int) (err error) { func libc_removexattr_trampoline() -//go:linkname libc_removexattr libc_removexattr //go:cgo_import_dynamic libc_removexattr removexattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -639,7 +603,6 @@ func fremovexattr(fd int, attr string, options int) (err error) { func libc_fremovexattr_trampoline() -//go:linkname libc_fremovexattr libc_fremovexattr //go:cgo_import_dynamic libc_fremovexattr fremovexattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -660,7 +623,6 @@ func listxattr(path string, dest *byte, size int, options int) (sz int, err erro func libc_listxattr_trampoline() -//go:linkname libc_listxattr libc_listxattr //go:cgo_import_dynamic libc_listxattr listxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -676,7 +638,6 @@ func flistxattr(fd int, dest *byte, size int, options int) (sz int, err error) { func libc_flistxattr_trampoline() -//go:linkname libc_flistxattr libc_flistxattr //go:cgo_import_dynamic libc_flistxattr flistxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -691,7 +652,6 @@ func setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintp func libc_setattrlist_trampoline() -//go:linkname libc_setattrlist libc_setattrlist //go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -707,7 +667,6 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { func libc_fcntl_trampoline() -//go:linkname libc_fcntl libc_fcntl //go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -722,7 +681,6 @@ func kill(pid int, signum int, posix int) (err error) { func libc_kill_trampoline() -//go:linkname libc_kill libc_kill //go:cgo_import_dynamic libc_kill kill "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -737,7 +695,6 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { func libc_ioctl_trampoline() -//go:linkname libc_ioctl libc_ioctl //go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -758,7 +715,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) func libc_sysctl_trampoline() -//go:linkname libc_sysctl libc_sysctl //go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -773,7 +729,6 @@ func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer func libc_sendfile_trampoline() -//go:linkname libc_sendfile libc_sendfile //go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -793,7 +748,6 @@ func Access(path string, mode uint32) (err error) { func libc_access_trampoline() -//go:linkname libc_access libc_access //go:cgo_import_dynamic libc_access access "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -808,7 +762,6 @@ func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { func libc_adjtime_trampoline() -//go:linkname libc_adjtime libc_adjtime //go:cgo_import_dynamic libc_adjtime adjtime "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -828,7 +781,6 @@ func Chdir(path string) (err error) { func libc_chdir_trampoline() -//go:linkname libc_chdir libc_chdir //go:cgo_import_dynamic libc_chdir chdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -848,7 +800,6 @@ func Chflags(path string, flags int) (err error) { func libc_chflags_trampoline() -//go:linkname libc_chflags libc_chflags //go:cgo_import_dynamic libc_chflags chflags "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -868,7 +819,6 @@ func Chmod(path string, mode uint32) (err error) { func libc_chmod_trampoline() -//go:linkname libc_chmod libc_chmod //go:cgo_import_dynamic libc_chmod chmod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -888,7 +838,6 @@ func Chown(path string, uid int, gid int) (err error) { func libc_chown_trampoline() -//go:linkname libc_chown libc_chown //go:cgo_import_dynamic libc_chown chown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -908,7 +857,6 @@ func Chroot(path string) (err error) { func libc_chroot_trampoline() -//go:linkname libc_chroot libc_chroot //go:cgo_import_dynamic libc_chroot chroot "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -923,7 +871,6 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { func libc_clock_gettime_trampoline() -//go:linkname libc_clock_gettime libc_clock_gettime //go:cgo_import_dynamic libc_clock_gettime clock_gettime "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -938,7 +885,6 @@ func Close(fd int) (err error) { func libc_close_trampoline() -//go:linkname libc_close libc_close //go:cgo_import_dynamic libc_close close "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -963,7 +909,6 @@ func Clonefile(src string, dst string, flags int) (err error) { func libc_clonefile_trampoline() -//go:linkname libc_clonefile libc_clonefile //go:cgo_import_dynamic libc_clonefile clonefile "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -988,7 +933,6 @@ func Clonefileat(srcDirfd int, src string, dstDirfd int, dst string, flags int) func libc_clonefileat_trampoline() -//go:linkname libc_clonefileat libc_clonefileat //go:cgo_import_dynamic libc_clonefileat clonefileat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1004,7 +948,6 @@ func Dup(fd int) (nfd int, err error) { func libc_dup_trampoline() -//go:linkname libc_dup libc_dup //go:cgo_import_dynamic libc_dup dup "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1019,7 +962,6 @@ func Dup2(from int, to int) (err error) { func libc_dup2_trampoline() -//go:linkname libc_dup2 libc_dup2 //go:cgo_import_dynamic libc_dup2 dup2 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1044,7 +986,6 @@ func Exchangedata(path1 string, path2 string, options int) (err error) { func libc_exchangedata_trampoline() -//go:linkname libc_exchangedata libc_exchangedata //go:cgo_import_dynamic libc_exchangedata exchangedata "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1056,7 +997,6 @@ func Exit(code int) { func libc_exit_trampoline() -//go:linkname libc_exit libc_exit //go:cgo_import_dynamic libc_exit exit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1076,7 +1016,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { func libc_faccessat_trampoline() -//go:linkname libc_faccessat libc_faccessat //go:cgo_import_dynamic libc_faccessat faccessat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1091,7 +1030,6 @@ func Fchdir(fd int) (err error) { func libc_fchdir_trampoline() -//go:linkname libc_fchdir libc_fchdir //go:cgo_import_dynamic libc_fchdir fchdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1106,7 +1044,6 @@ func Fchflags(fd int, flags int) (err error) { func libc_fchflags_trampoline() -//go:linkname libc_fchflags libc_fchflags //go:cgo_import_dynamic libc_fchflags fchflags "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1121,7 +1058,6 @@ func Fchmod(fd int, mode uint32) (err error) { func libc_fchmod_trampoline() -//go:linkname libc_fchmod libc_fchmod //go:cgo_import_dynamic libc_fchmod fchmod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1141,7 +1077,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { func libc_fchmodat_trampoline() -//go:linkname libc_fchmodat libc_fchmodat //go:cgo_import_dynamic libc_fchmodat fchmodat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1156,7 +1091,6 @@ func Fchown(fd int, uid int, gid int) (err error) { func libc_fchown_trampoline() -//go:linkname libc_fchown libc_fchown //go:cgo_import_dynamic libc_fchown fchown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1176,7 +1110,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { func libc_fchownat_trampoline() -//go:linkname libc_fchownat libc_fchownat //go:cgo_import_dynamic libc_fchownat fchownat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1196,7 +1129,6 @@ func Fclonefileat(srcDirfd int, dstDirfd int, dst string, flags int) (err error) func libc_fclonefileat_trampoline() -//go:linkname libc_fclonefileat libc_fclonefileat //go:cgo_import_dynamic libc_fclonefileat fclonefileat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1211,7 +1143,6 @@ func Flock(fd int, how int) (err error) { func libc_flock_trampoline() -//go:linkname libc_flock libc_flock //go:cgo_import_dynamic libc_flock flock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1227,7 +1158,6 @@ func Fpathconf(fd int, name int) (val int, err error) { func libc_fpathconf_trampoline() -//go:linkname libc_fpathconf libc_fpathconf //go:cgo_import_dynamic libc_fpathconf fpathconf "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1242,7 +1172,6 @@ func Fsync(fd int) (err error) { func libc_fsync_trampoline() -//go:linkname libc_fsync libc_fsync //go:cgo_import_dynamic libc_fsync fsync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1257,7 +1186,6 @@ func Ftruncate(fd int, length int64) (err error) { func libc_ftruncate_trampoline() -//go:linkname libc_ftruncate libc_ftruncate //go:cgo_import_dynamic libc_ftruncate ftruncate "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1279,7 +1207,6 @@ func Getcwd(buf []byte) (n int, err error) { func libc_getcwd_trampoline() -//go:linkname libc_getcwd libc_getcwd //go:cgo_import_dynamic libc_getcwd getcwd "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1292,7 +1219,6 @@ func Getdtablesize() (size int) { func libc_getdtablesize_trampoline() -//go:linkname libc_getdtablesize libc_getdtablesize //go:cgo_import_dynamic libc_getdtablesize getdtablesize "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1305,7 +1231,6 @@ func Getegid() (egid int) { func libc_getegid_trampoline() -//go:linkname libc_getegid libc_getegid //go:cgo_import_dynamic libc_getegid getegid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1318,7 +1243,6 @@ func Geteuid() (uid int) { func libc_geteuid_trampoline() -//go:linkname libc_geteuid libc_geteuid //go:cgo_import_dynamic libc_geteuid geteuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1331,7 +1255,6 @@ func Getgid() (gid int) { func libc_getgid_trampoline() -//go:linkname libc_getgid libc_getgid //go:cgo_import_dynamic libc_getgid getgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1347,7 +1270,6 @@ func Getpgid(pid int) (pgid int, err error) { func libc_getpgid_trampoline() -//go:linkname libc_getpgid libc_getpgid //go:cgo_import_dynamic libc_getpgid getpgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1360,7 +1282,6 @@ func Getpgrp() (pgrp int) { func libc_getpgrp_trampoline() -//go:linkname libc_getpgrp libc_getpgrp //go:cgo_import_dynamic libc_getpgrp getpgrp "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1373,7 +1294,6 @@ func Getpid() (pid int) { func libc_getpid_trampoline() -//go:linkname libc_getpid libc_getpid //go:cgo_import_dynamic libc_getpid getpid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1386,7 +1306,6 @@ func Getppid() (ppid int) { func libc_getppid_trampoline() -//go:linkname libc_getppid libc_getppid //go:cgo_import_dynamic libc_getppid getppid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1402,7 +1321,6 @@ func Getpriority(which int, who int) (prio int, err error) { func libc_getpriority_trampoline() -//go:linkname libc_getpriority libc_getpriority //go:cgo_import_dynamic libc_getpriority getpriority "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1417,7 +1335,6 @@ func Getrlimit(which int, lim *Rlimit) (err error) { func libc_getrlimit_trampoline() -//go:linkname libc_getrlimit libc_getrlimit //go:cgo_import_dynamic libc_getrlimit getrlimit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1432,7 +1349,6 @@ func Getrusage(who int, rusage *Rusage) (err error) { func libc_getrusage_trampoline() -//go:linkname libc_getrusage libc_getrusage //go:cgo_import_dynamic libc_getrusage getrusage "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1448,7 +1364,6 @@ func Getsid(pid int) (sid int, err error) { func libc_getsid_trampoline() -//go:linkname libc_getsid libc_getsid //go:cgo_import_dynamic libc_getsid getsid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1463,7 +1378,6 @@ func Gettimeofday(tp *Timeval) (err error) { func libc_gettimeofday_trampoline() -//go:linkname libc_gettimeofday libc_gettimeofday //go:cgo_import_dynamic libc_gettimeofday gettimeofday "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1476,7 +1390,6 @@ func Getuid() (uid int) { func libc_getuid_trampoline() -//go:linkname libc_getuid libc_getuid //go:cgo_import_dynamic libc_getuid getuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1489,7 +1402,6 @@ func Issetugid() (tainted bool) { func libc_issetugid_trampoline() -//go:linkname libc_issetugid libc_issetugid //go:cgo_import_dynamic libc_issetugid issetugid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1505,7 +1417,6 @@ func Kqueue() (fd int, err error) { func libc_kqueue_trampoline() -//go:linkname libc_kqueue libc_kqueue //go:cgo_import_dynamic libc_kqueue kqueue "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1525,7 +1436,6 @@ func Lchown(path string, uid int, gid int) (err error) { func libc_lchown_trampoline() -//go:linkname libc_lchown libc_lchown //go:cgo_import_dynamic libc_lchown lchown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1550,7 +1460,6 @@ func Link(path string, link string) (err error) { func libc_link_trampoline() -//go:linkname libc_link libc_link //go:cgo_import_dynamic libc_link link "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1575,7 +1484,6 @@ func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err er func libc_linkat_trampoline() -//go:linkname libc_linkat libc_linkat //go:cgo_import_dynamic libc_linkat linkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1590,7 +1498,6 @@ func Listen(s int, backlog int) (err error) { func libc_listen_trampoline() -//go:linkname libc_listen libc_listen //go:cgo_import_dynamic libc_listen listen "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1610,7 +1517,6 @@ func Mkdir(path string, mode uint32) (err error) { func libc_mkdir_trampoline() -//go:linkname libc_mkdir libc_mkdir //go:cgo_import_dynamic libc_mkdir mkdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1630,7 +1536,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { func libc_mkdirat_trampoline() -//go:linkname libc_mkdirat libc_mkdirat //go:cgo_import_dynamic libc_mkdirat mkdirat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1650,7 +1555,6 @@ func Mkfifo(path string, mode uint32) (err error) { func libc_mkfifo_trampoline() -//go:linkname libc_mkfifo libc_mkfifo //go:cgo_import_dynamic libc_mkfifo mkfifo "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1670,7 +1574,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { func libc_mknod_trampoline() -//go:linkname libc_mknod libc_mknod //go:cgo_import_dynamic libc_mknod mknod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1691,7 +1594,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { func libc_open_trampoline() -//go:linkname libc_open libc_open //go:cgo_import_dynamic libc_open open "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1712,7 +1614,6 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { func libc_openat_trampoline() -//go:linkname libc_openat libc_openat //go:cgo_import_dynamic libc_openat openat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1733,7 +1634,6 @@ func Pathconf(path string, name int) (val int, err error) { func libc_pathconf_trampoline() -//go:linkname libc_pathconf libc_pathconf //go:cgo_import_dynamic libc_pathconf pathconf "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1755,7 +1655,6 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { func libc_pread_trampoline() -//go:linkname libc_pread libc_pread //go:cgo_import_dynamic libc_pread pread "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1777,7 +1676,6 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { func libc_pwrite_trampoline() -//go:linkname libc_pwrite libc_pwrite //go:cgo_import_dynamic libc_pwrite pwrite "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1799,7 +1697,6 @@ func read(fd int, p []byte) (n int, err error) { func libc_read_trampoline() -//go:linkname libc_read libc_read //go:cgo_import_dynamic libc_read read "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1826,7 +1723,6 @@ func Readlink(path string, buf []byte) (n int, err error) { func libc_readlink_trampoline() -//go:linkname libc_readlink libc_readlink //go:cgo_import_dynamic libc_readlink readlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1853,7 +1749,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { func libc_readlinkat_trampoline() -//go:linkname libc_readlinkat libc_readlinkat //go:cgo_import_dynamic libc_readlinkat readlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1878,7 +1773,6 @@ func Rename(from string, to string) (err error) { func libc_rename_trampoline() -//go:linkname libc_rename libc_rename //go:cgo_import_dynamic libc_rename rename "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1903,7 +1797,6 @@ func Renameat(fromfd int, from string, tofd int, to string) (err error) { func libc_renameat_trampoline() -//go:linkname libc_renameat libc_renameat //go:cgo_import_dynamic libc_renameat renameat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1923,7 +1816,6 @@ func Revoke(path string) (err error) { func libc_revoke_trampoline() -//go:linkname libc_revoke libc_revoke //go:cgo_import_dynamic libc_revoke revoke "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1943,7 +1835,6 @@ func Rmdir(path string) (err error) { func libc_rmdir_trampoline() -//go:linkname libc_rmdir libc_rmdir //go:cgo_import_dynamic libc_rmdir rmdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1959,7 +1850,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { func libc_lseek_trampoline() -//go:linkname libc_lseek libc_lseek //go:cgo_import_dynamic libc_lseek lseek "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1975,7 +1865,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err func libc_select_trampoline() -//go:linkname libc_select libc_select //go:cgo_import_dynamic libc_select select "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1990,7 +1879,6 @@ func Setegid(egid int) (err error) { func libc_setegid_trampoline() -//go:linkname libc_setegid libc_setegid //go:cgo_import_dynamic libc_setegid setegid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2005,7 +1893,6 @@ func Seteuid(euid int) (err error) { func libc_seteuid_trampoline() -//go:linkname libc_seteuid libc_seteuid //go:cgo_import_dynamic libc_seteuid seteuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2020,7 +1907,6 @@ func Setgid(gid int) (err error) { func libc_setgid_trampoline() -//go:linkname libc_setgid libc_setgid //go:cgo_import_dynamic libc_setgid setgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2040,7 +1926,6 @@ func Setlogin(name string) (err error) { func libc_setlogin_trampoline() -//go:linkname libc_setlogin libc_setlogin //go:cgo_import_dynamic libc_setlogin setlogin "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2055,7 +1940,6 @@ func Setpgid(pid int, pgid int) (err error) { func libc_setpgid_trampoline() -//go:linkname libc_setpgid libc_setpgid //go:cgo_import_dynamic libc_setpgid setpgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2070,7 +1954,6 @@ func Setpriority(which int, who int, prio int) (err error) { func libc_setpriority_trampoline() -//go:linkname libc_setpriority libc_setpriority //go:cgo_import_dynamic libc_setpriority setpriority "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2085,7 +1968,6 @@ func Setprivexec(flag int) (err error) { func libc_setprivexec_trampoline() -//go:linkname libc_setprivexec libc_setprivexec //go:cgo_import_dynamic libc_setprivexec setprivexec "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2100,7 +1982,6 @@ func Setregid(rgid int, egid int) (err error) { func libc_setregid_trampoline() -//go:linkname libc_setregid libc_setregid //go:cgo_import_dynamic libc_setregid setregid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2115,7 +1996,6 @@ func Setreuid(ruid int, euid int) (err error) { func libc_setreuid_trampoline() -//go:linkname libc_setreuid libc_setreuid //go:cgo_import_dynamic libc_setreuid setreuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2130,7 +2010,6 @@ func Setrlimit(which int, lim *Rlimit) (err error) { func libc_setrlimit_trampoline() -//go:linkname libc_setrlimit libc_setrlimit //go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2146,7 +2025,6 @@ func Setsid() (pid int, err error) { func libc_setsid_trampoline() -//go:linkname libc_setsid libc_setsid //go:cgo_import_dynamic libc_setsid setsid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2161,7 +2039,6 @@ func Settimeofday(tp *Timeval) (err error) { func libc_settimeofday_trampoline() -//go:linkname libc_settimeofday libc_settimeofday //go:cgo_import_dynamic libc_settimeofday settimeofday "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2176,7 +2053,6 @@ func Setuid(uid int) (err error) { func libc_setuid_trampoline() -//go:linkname libc_setuid libc_setuid //go:cgo_import_dynamic libc_setuid setuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2201,7 +2077,6 @@ func Symlink(path string, link string) (err error) { func libc_symlink_trampoline() -//go:linkname libc_symlink libc_symlink //go:cgo_import_dynamic libc_symlink symlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2226,7 +2101,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { func libc_symlinkat_trampoline() -//go:linkname libc_symlinkat libc_symlinkat //go:cgo_import_dynamic libc_symlinkat symlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2241,7 +2115,6 @@ func Sync() (err error) { func libc_sync_trampoline() -//go:linkname libc_sync libc_sync //go:cgo_import_dynamic libc_sync sync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2261,7 +2134,6 @@ func Truncate(path string, length int64) (err error) { func libc_truncate_trampoline() -//go:linkname libc_truncate libc_truncate //go:cgo_import_dynamic libc_truncate truncate "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2274,7 +2146,6 @@ func Umask(newmask int) (oldmask int) { func libc_umask_trampoline() -//go:linkname libc_umask libc_umask //go:cgo_import_dynamic libc_umask umask "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2294,7 +2165,6 @@ func Undelete(path string) (err error) { func libc_undelete_trampoline() -//go:linkname libc_undelete libc_undelete //go:cgo_import_dynamic libc_undelete undelete "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2314,7 +2184,6 @@ func Unlink(path string) (err error) { func libc_unlink_trampoline() -//go:linkname libc_unlink libc_unlink //go:cgo_import_dynamic libc_unlink unlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2334,7 +2203,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { func libc_unlinkat_trampoline() -//go:linkname libc_unlinkat libc_unlinkat //go:cgo_import_dynamic libc_unlinkat unlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2354,7 +2222,6 @@ func Unmount(path string, flags int) (err error) { func libc_unmount_trampoline() -//go:linkname libc_unmount libc_unmount //go:cgo_import_dynamic libc_unmount unmount "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2376,7 +2243,6 @@ func write(fd int, p []byte) (n int, err error) { func libc_write_trampoline() -//go:linkname libc_write libc_write //go:cgo_import_dynamic libc_write write "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2392,7 +2258,6 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( func libc_mmap_trampoline() -//go:linkname libc_mmap libc_mmap //go:cgo_import_dynamic libc_mmap mmap "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2407,7 +2272,6 @@ func munmap(addr uintptr, length uintptr) (err error) { func libc_munmap_trampoline() -//go:linkname libc_munmap libc_munmap //go:cgo_import_dynamic libc_munmap munmap "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2444,7 +2308,6 @@ func Fstat(fd int, stat *Stat_t) (err error) { func libc_fstat64_trampoline() -//go:linkname libc_fstat64 libc_fstat64 //go:cgo_import_dynamic libc_fstat64 fstat64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2464,7 +2327,6 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { func libc_fstatat64_trampoline() -//go:linkname libc_fstatat64 libc_fstatat64 //go:cgo_import_dynamic libc_fstatat64 fstatat64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2479,7 +2341,6 @@ func Fstatfs(fd int, stat *Statfs_t) (err error) { func libc_fstatfs64_trampoline() -//go:linkname libc_fstatfs64 libc_fstatfs64 //go:cgo_import_dynamic libc_fstatfs64 fstatfs64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2495,7 +2356,6 @@ func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) { func libc_getfsstat64_trampoline() -//go:linkname libc_getfsstat64 libc_getfsstat64 //go:cgo_import_dynamic libc_getfsstat64 getfsstat64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2515,12 +2375,11 @@ func Lstat(path string, stat *Stat_t) (err error) { func libc_lstat64_trampoline() -//go:linkname libc_lstat64 libc_lstat64 //go:cgo_import_dynamic libc_lstat64 lstat64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { +func ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) @@ -2530,7 +2389,6 @@ func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { func libc_ptrace_trampoline() -//go:linkname libc_ptrace libc_ptrace //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2550,7 +2408,6 @@ func Stat(path string, stat *Stat_t) (err error) { func libc_stat64_trampoline() -//go:linkname libc_stat64 libc_stat64 //go:cgo_import_dynamic libc_stat64 stat64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2570,5 +2427,4 @@ func Statfs(path string, stat *Statfs_t) (err error) { func libc_statfs64_trampoline() -//go:linkname libc_statfs64 libc_statfs64 //go:cgo_import_dynamic libc_statfs64 statfs64 "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go index 314042a9d4..8882623613 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_13.go @@ -24,7 +24,6 @@ func closedir(dir uintptr) (err error) { func libc_closedir_trampoline() -//go:linkname libc_closedir libc_closedir //go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -37,5 +36,4 @@ func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { func libc_readdir_r_trampoline() -//go:linkname libc_readdir_r libc_readdir_r //go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index 889c14059e..508e5639bf 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -25,7 +25,6 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { func libc_getgroups_trampoline() -//go:linkname libc_getgroups libc_getgroups //go:cgo_import_dynamic libc_getgroups getgroups "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -40,7 +39,6 @@ func setgroups(ngid int, gid *_Gid_t) (err error) { func libc_setgroups_trampoline() -//go:linkname libc_setgroups libc_setgroups //go:cgo_import_dynamic libc_setgroups setgroups "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -56,7 +54,6 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err func libc_wait4_trampoline() -//go:linkname libc_wait4 libc_wait4 //go:cgo_import_dynamic libc_wait4 wait4 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -72,7 +69,6 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { func libc_accept_trampoline() -//go:linkname libc_accept libc_accept //go:cgo_import_dynamic libc_accept accept "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -87,7 +83,6 @@ func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { func libc_bind_trampoline() -//go:linkname libc_bind libc_bind //go:cgo_import_dynamic libc_bind bind "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -102,7 +97,6 @@ func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { func libc_connect_trampoline() -//go:linkname libc_connect libc_connect //go:cgo_import_dynamic libc_connect connect "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -118,7 +112,6 @@ func socket(domain int, typ int, proto int) (fd int, err error) { func libc_socket_trampoline() -//go:linkname libc_socket libc_socket //go:cgo_import_dynamic libc_socket socket "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -133,7 +126,6 @@ func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen func libc_getsockopt_trampoline() -//go:linkname libc_getsockopt libc_getsockopt //go:cgo_import_dynamic libc_getsockopt getsockopt "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -148,7 +140,6 @@ func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) func libc_setsockopt_trampoline() -//go:linkname libc_setsockopt libc_setsockopt //go:cgo_import_dynamic libc_setsockopt setsockopt "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -163,7 +154,6 @@ func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { func libc_getpeername_trampoline() -//go:linkname libc_getpeername libc_getpeername //go:cgo_import_dynamic libc_getpeername getpeername "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -178,7 +168,6 @@ func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { func libc_getsockname_trampoline() -//go:linkname libc_getsockname libc_getsockname //go:cgo_import_dynamic libc_getsockname getsockname "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -193,7 +182,6 @@ func Shutdown(s int, how int) (err error) { func libc_shutdown_trampoline() -//go:linkname libc_shutdown libc_shutdown //go:cgo_import_dynamic libc_shutdown shutdown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -208,7 +196,6 @@ func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { func libc_socketpair_trampoline() -//go:linkname libc_socketpair libc_socketpair //go:cgo_import_dynamic libc_socketpair socketpair "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -230,7 +217,6 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl func libc_recvfrom_trampoline() -//go:linkname libc_recvfrom libc_recvfrom //go:cgo_import_dynamic libc_recvfrom recvfrom "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -251,7 +237,6 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( func libc_sendto_trampoline() -//go:linkname libc_sendto libc_sendto //go:cgo_import_dynamic libc_sendto sendto "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -267,7 +252,6 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { func libc_recvmsg_trampoline() -//go:linkname libc_recvmsg libc_recvmsg //go:cgo_import_dynamic libc_recvmsg recvmsg "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -283,7 +267,6 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { func libc_sendmsg_trampoline() -//go:linkname libc_sendmsg libc_sendmsg //go:cgo_import_dynamic libc_sendmsg sendmsg "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -299,7 +282,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne func libc_kevent_trampoline() -//go:linkname libc_kevent libc_kevent //go:cgo_import_dynamic libc_kevent kevent "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -319,7 +301,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { func libc_utimes_trampoline() -//go:linkname libc_utimes libc_utimes //go:cgo_import_dynamic libc_utimes utimes "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -334,7 +315,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { func libc_futimes_trampoline() -//go:linkname libc_futimes libc_futimes //go:cgo_import_dynamic libc_futimes futimes "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -350,7 +330,6 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { func libc_poll_trampoline() -//go:linkname libc_poll libc_poll //go:cgo_import_dynamic libc_poll poll "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -371,7 +350,6 @@ func Madvise(b []byte, behav int) (err error) { func libc_madvise_trampoline() -//go:linkname libc_madvise libc_madvise //go:cgo_import_dynamic libc_madvise madvise "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -392,7 +370,6 @@ func Mlock(b []byte) (err error) { func libc_mlock_trampoline() -//go:linkname libc_mlock libc_mlock //go:cgo_import_dynamic libc_mlock mlock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -407,7 +384,6 @@ func Mlockall(flags int) (err error) { func libc_mlockall_trampoline() -//go:linkname libc_mlockall libc_mlockall //go:cgo_import_dynamic libc_mlockall mlockall "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -428,7 +404,6 @@ func Mprotect(b []byte, prot int) (err error) { func libc_mprotect_trampoline() -//go:linkname libc_mprotect libc_mprotect //go:cgo_import_dynamic libc_mprotect mprotect "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -449,7 +424,6 @@ func Msync(b []byte, flags int) (err error) { func libc_msync_trampoline() -//go:linkname libc_msync libc_msync //go:cgo_import_dynamic libc_msync msync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -470,7 +444,6 @@ func Munlock(b []byte) (err error) { func libc_munlock_trampoline() -//go:linkname libc_munlock libc_munlock //go:cgo_import_dynamic libc_munlock munlock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -485,15 +458,12 @@ func Munlockall() (err error) { func libc_munlockall_trampoline() -//go:linkname libc_munlockall libc_munlockall //go:cgo_import_dynamic libc_munlockall munlockall "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (r int, w int, err error) { - r0, r1, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), 0, 0, 0) - r = int(r0) - w = int(r1) +func pipe(p *[2]int32) (err error) { + _, _, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -502,7 +472,6 @@ func pipe() (r int, w int, err error) { func libc_pipe_trampoline() -//go:linkname libc_pipe libc_pipe //go:cgo_import_dynamic libc_pipe pipe "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -528,7 +497,6 @@ func getxattr(path string, attr string, dest *byte, size int, position uint32, o func libc_getxattr_trampoline() -//go:linkname libc_getxattr libc_getxattr //go:cgo_import_dynamic libc_getxattr getxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -549,7 +517,6 @@ func fgetxattr(fd int, attr string, dest *byte, size int, position uint32, optio func libc_fgetxattr_trampoline() -//go:linkname libc_fgetxattr libc_fgetxattr //go:cgo_import_dynamic libc_fgetxattr fgetxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -574,7 +541,6 @@ func setxattr(path string, attr string, data *byte, size int, position uint32, o func libc_setxattr_trampoline() -//go:linkname libc_setxattr libc_setxattr //go:cgo_import_dynamic libc_setxattr setxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -594,7 +560,6 @@ func fsetxattr(fd int, attr string, data *byte, size int, position uint32, optio func libc_fsetxattr_trampoline() -//go:linkname libc_fsetxattr libc_fsetxattr //go:cgo_import_dynamic libc_fsetxattr fsetxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -619,7 +584,6 @@ func removexattr(path string, attr string, options int) (err error) { func libc_removexattr_trampoline() -//go:linkname libc_removexattr libc_removexattr //go:cgo_import_dynamic libc_removexattr removexattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -639,7 +603,6 @@ func fremovexattr(fd int, attr string, options int) (err error) { func libc_fremovexattr_trampoline() -//go:linkname libc_fremovexattr libc_fremovexattr //go:cgo_import_dynamic libc_fremovexattr fremovexattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -660,7 +623,6 @@ func listxattr(path string, dest *byte, size int, options int) (sz int, err erro func libc_listxattr_trampoline() -//go:linkname libc_listxattr libc_listxattr //go:cgo_import_dynamic libc_listxattr listxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -676,7 +638,6 @@ func flistxattr(fd int, dest *byte, size int, options int) (sz int, err error) { func libc_flistxattr_trampoline() -//go:linkname libc_flistxattr libc_flistxattr //go:cgo_import_dynamic libc_flistxattr flistxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -691,7 +652,6 @@ func setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintp func libc_setattrlist_trampoline() -//go:linkname libc_setattrlist libc_setattrlist //go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -707,7 +667,6 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { func libc_fcntl_trampoline() -//go:linkname libc_fcntl libc_fcntl //go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -722,7 +681,6 @@ func kill(pid int, signum int, posix int) (err error) { func libc_kill_trampoline() -//go:linkname libc_kill libc_kill //go:cgo_import_dynamic libc_kill kill "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -737,7 +695,6 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { func libc_ioctl_trampoline() -//go:linkname libc_ioctl libc_ioctl //go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -758,7 +715,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) func libc_sysctl_trampoline() -//go:linkname libc_sysctl libc_sysctl //go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -773,7 +729,6 @@ func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer func libc_sendfile_trampoline() -//go:linkname libc_sendfile libc_sendfile //go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -793,7 +748,6 @@ func Access(path string, mode uint32) (err error) { func libc_access_trampoline() -//go:linkname libc_access libc_access //go:cgo_import_dynamic libc_access access "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -808,7 +762,6 @@ func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { func libc_adjtime_trampoline() -//go:linkname libc_adjtime libc_adjtime //go:cgo_import_dynamic libc_adjtime adjtime "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -828,7 +781,6 @@ func Chdir(path string) (err error) { func libc_chdir_trampoline() -//go:linkname libc_chdir libc_chdir //go:cgo_import_dynamic libc_chdir chdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -848,7 +800,6 @@ func Chflags(path string, flags int) (err error) { func libc_chflags_trampoline() -//go:linkname libc_chflags libc_chflags //go:cgo_import_dynamic libc_chflags chflags "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -868,7 +819,6 @@ func Chmod(path string, mode uint32) (err error) { func libc_chmod_trampoline() -//go:linkname libc_chmod libc_chmod //go:cgo_import_dynamic libc_chmod chmod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -888,7 +838,6 @@ func Chown(path string, uid int, gid int) (err error) { func libc_chown_trampoline() -//go:linkname libc_chown libc_chown //go:cgo_import_dynamic libc_chown chown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -908,7 +857,6 @@ func Chroot(path string) (err error) { func libc_chroot_trampoline() -//go:linkname libc_chroot libc_chroot //go:cgo_import_dynamic libc_chroot chroot "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -923,7 +871,6 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { func libc_clock_gettime_trampoline() -//go:linkname libc_clock_gettime libc_clock_gettime //go:cgo_import_dynamic libc_clock_gettime clock_gettime "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -938,7 +885,6 @@ func Close(fd int) (err error) { func libc_close_trampoline() -//go:linkname libc_close libc_close //go:cgo_import_dynamic libc_close close "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -963,7 +909,6 @@ func Clonefile(src string, dst string, flags int) (err error) { func libc_clonefile_trampoline() -//go:linkname libc_clonefile libc_clonefile //go:cgo_import_dynamic libc_clonefile clonefile "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -988,7 +933,6 @@ func Clonefileat(srcDirfd int, src string, dstDirfd int, dst string, flags int) func libc_clonefileat_trampoline() -//go:linkname libc_clonefileat libc_clonefileat //go:cgo_import_dynamic libc_clonefileat clonefileat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1004,7 +948,6 @@ func Dup(fd int) (nfd int, err error) { func libc_dup_trampoline() -//go:linkname libc_dup libc_dup //go:cgo_import_dynamic libc_dup dup "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1019,7 +962,6 @@ func Dup2(from int, to int) (err error) { func libc_dup2_trampoline() -//go:linkname libc_dup2 libc_dup2 //go:cgo_import_dynamic libc_dup2 dup2 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1044,7 +986,6 @@ func Exchangedata(path1 string, path2 string, options int) (err error) { func libc_exchangedata_trampoline() -//go:linkname libc_exchangedata libc_exchangedata //go:cgo_import_dynamic libc_exchangedata exchangedata "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1056,7 +997,6 @@ func Exit(code int) { func libc_exit_trampoline() -//go:linkname libc_exit libc_exit //go:cgo_import_dynamic libc_exit exit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1076,7 +1016,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { func libc_faccessat_trampoline() -//go:linkname libc_faccessat libc_faccessat //go:cgo_import_dynamic libc_faccessat faccessat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1091,7 +1030,6 @@ func Fchdir(fd int) (err error) { func libc_fchdir_trampoline() -//go:linkname libc_fchdir libc_fchdir //go:cgo_import_dynamic libc_fchdir fchdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1106,7 +1044,6 @@ func Fchflags(fd int, flags int) (err error) { func libc_fchflags_trampoline() -//go:linkname libc_fchflags libc_fchflags //go:cgo_import_dynamic libc_fchflags fchflags "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1121,7 +1058,6 @@ func Fchmod(fd int, mode uint32) (err error) { func libc_fchmod_trampoline() -//go:linkname libc_fchmod libc_fchmod //go:cgo_import_dynamic libc_fchmod fchmod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1141,7 +1077,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { func libc_fchmodat_trampoline() -//go:linkname libc_fchmodat libc_fchmodat //go:cgo_import_dynamic libc_fchmodat fchmodat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1156,7 +1091,6 @@ func Fchown(fd int, uid int, gid int) (err error) { func libc_fchown_trampoline() -//go:linkname libc_fchown libc_fchown //go:cgo_import_dynamic libc_fchown fchown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1176,7 +1110,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { func libc_fchownat_trampoline() -//go:linkname libc_fchownat libc_fchownat //go:cgo_import_dynamic libc_fchownat fchownat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1196,7 +1129,6 @@ func Fclonefileat(srcDirfd int, dstDirfd int, dst string, flags int) (err error) func libc_fclonefileat_trampoline() -//go:linkname libc_fclonefileat libc_fclonefileat //go:cgo_import_dynamic libc_fclonefileat fclonefileat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1211,7 +1143,6 @@ func Flock(fd int, how int) (err error) { func libc_flock_trampoline() -//go:linkname libc_flock libc_flock //go:cgo_import_dynamic libc_flock flock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1227,7 +1158,6 @@ func Fpathconf(fd int, name int) (val int, err error) { func libc_fpathconf_trampoline() -//go:linkname libc_fpathconf libc_fpathconf //go:cgo_import_dynamic libc_fpathconf fpathconf "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1242,7 +1172,6 @@ func Fsync(fd int) (err error) { func libc_fsync_trampoline() -//go:linkname libc_fsync libc_fsync //go:cgo_import_dynamic libc_fsync fsync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1257,7 +1186,6 @@ func Ftruncate(fd int, length int64) (err error) { func libc_ftruncate_trampoline() -//go:linkname libc_ftruncate libc_ftruncate //go:cgo_import_dynamic libc_ftruncate ftruncate "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1279,7 +1207,6 @@ func Getcwd(buf []byte) (n int, err error) { func libc_getcwd_trampoline() -//go:linkname libc_getcwd libc_getcwd //go:cgo_import_dynamic libc_getcwd getcwd "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1292,7 +1219,6 @@ func Getdtablesize() (size int) { func libc_getdtablesize_trampoline() -//go:linkname libc_getdtablesize libc_getdtablesize //go:cgo_import_dynamic libc_getdtablesize getdtablesize "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1305,7 +1231,6 @@ func Getegid() (egid int) { func libc_getegid_trampoline() -//go:linkname libc_getegid libc_getegid //go:cgo_import_dynamic libc_getegid getegid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1318,7 +1243,6 @@ func Geteuid() (uid int) { func libc_geteuid_trampoline() -//go:linkname libc_geteuid libc_geteuid //go:cgo_import_dynamic libc_geteuid geteuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1331,7 +1255,6 @@ func Getgid() (gid int) { func libc_getgid_trampoline() -//go:linkname libc_getgid libc_getgid //go:cgo_import_dynamic libc_getgid getgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1347,7 +1270,6 @@ func Getpgid(pid int) (pgid int, err error) { func libc_getpgid_trampoline() -//go:linkname libc_getpgid libc_getpgid //go:cgo_import_dynamic libc_getpgid getpgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1360,7 +1282,6 @@ func Getpgrp() (pgrp int) { func libc_getpgrp_trampoline() -//go:linkname libc_getpgrp libc_getpgrp //go:cgo_import_dynamic libc_getpgrp getpgrp "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1373,7 +1294,6 @@ func Getpid() (pid int) { func libc_getpid_trampoline() -//go:linkname libc_getpid libc_getpid //go:cgo_import_dynamic libc_getpid getpid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1386,7 +1306,6 @@ func Getppid() (ppid int) { func libc_getppid_trampoline() -//go:linkname libc_getppid libc_getppid //go:cgo_import_dynamic libc_getppid getppid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1402,7 +1321,6 @@ func Getpriority(which int, who int) (prio int, err error) { func libc_getpriority_trampoline() -//go:linkname libc_getpriority libc_getpriority //go:cgo_import_dynamic libc_getpriority getpriority "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1417,7 +1335,6 @@ func Getrlimit(which int, lim *Rlimit) (err error) { func libc_getrlimit_trampoline() -//go:linkname libc_getrlimit libc_getrlimit //go:cgo_import_dynamic libc_getrlimit getrlimit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1432,7 +1349,6 @@ func Getrusage(who int, rusage *Rusage) (err error) { func libc_getrusage_trampoline() -//go:linkname libc_getrusage libc_getrusage //go:cgo_import_dynamic libc_getrusage getrusage "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1448,7 +1364,6 @@ func Getsid(pid int) (sid int, err error) { func libc_getsid_trampoline() -//go:linkname libc_getsid libc_getsid //go:cgo_import_dynamic libc_getsid getsid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1463,7 +1378,6 @@ func Gettimeofday(tp *Timeval) (err error) { func libc_gettimeofday_trampoline() -//go:linkname libc_gettimeofday libc_gettimeofday //go:cgo_import_dynamic libc_gettimeofday gettimeofday "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1476,7 +1390,6 @@ func Getuid() (uid int) { func libc_getuid_trampoline() -//go:linkname libc_getuid libc_getuid //go:cgo_import_dynamic libc_getuid getuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1489,7 +1402,6 @@ func Issetugid() (tainted bool) { func libc_issetugid_trampoline() -//go:linkname libc_issetugid libc_issetugid //go:cgo_import_dynamic libc_issetugid issetugid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1505,7 +1417,6 @@ func Kqueue() (fd int, err error) { func libc_kqueue_trampoline() -//go:linkname libc_kqueue libc_kqueue //go:cgo_import_dynamic libc_kqueue kqueue "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1525,7 +1436,6 @@ func Lchown(path string, uid int, gid int) (err error) { func libc_lchown_trampoline() -//go:linkname libc_lchown libc_lchown //go:cgo_import_dynamic libc_lchown lchown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1550,7 +1460,6 @@ func Link(path string, link string) (err error) { func libc_link_trampoline() -//go:linkname libc_link libc_link //go:cgo_import_dynamic libc_link link "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1575,7 +1484,6 @@ func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err er func libc_linkat_trampoline() -//go:linkname libc_linkat libc_linkat //go:cgo_import_dynamic libc_linkat linkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1590,7 +1498,6 @@ func Listen(s int, backlog int) (err error) { func libc_listen_trampoline() -//go:linkname libc_listen libc_listen //go:cgo_import_dynamic libc_listen listen "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1610,7 +1517,6 @@ func Mkdir(path string, mode uint32) (err error) { func libc_mkdir_trampoline() -//go:linkname libc_mkdir libc_mkdir //go:cgo_import_dynamic libc_mkdir mkdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1630,7 +1536,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { func libc_mkdirat_trampoline() -//go:linkname libc_mkdirat libc_mkdirat //go:cgo_import_dynamic libc_mkdirat mkdirat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1650,7 +1555,6 @@ func Mkfifo(path string, mode uint32) (err error) { func libc_mkfifo_trampoline() -//go:linkname libc_mkfifo libc_mkfifo //go:cgo_import_dynamic libc_mkfifo mkfifo "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1670,7 +1574,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { func libc_mknod_trampoline() -//go:linkname libc_mknod libc_mknod //go:cgo_import_dynamic libc_mknod mknod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1691,7 +1594,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { func libc_open_trampoline() -//go:linkname libc_open libc_open //go:cgo_import_dynamic libc_open open "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1712,7 +1614,6 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { func libc_openat_trampoline() -//go:linkname libc_openat libc_openat //go:cgo_import_dynamic libc_openat openat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1733,7 +1634,6 @@ func Pathconf(path string, name int) (val int, err error) { func libc_pathconf_trampoline() -//go:linkname libc_pathconf libc_pathconf //go:cgo_import_dynamic libc_pathconf pathconf "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1755,7 +1655,6 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { func libc_pread_trampoline() -//go:linkname libc_pread libc_pread //go:cgo_import_dynamic libc_pread pread "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1777,7 +1676,6 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { func libc_pwrite_trampoline() -//go:linkname libc_pwrite libc_pwrite //go:cgo_import_dynamic libc_pwrite pwrite "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1799,7 +1697,6 @@ func read(fd int, p []byte) (n int, err error) { func libc_read_trampoline() -//go:linkname libc_read libc_read //go:cgo_import_dynamic libc_read read "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1826,7 +1723,6 @@ func Readlink(path string, buf []byte) (n int, err error) { func libc_readlink_trampoline() -//go:linkname libc_readlink libc_readlink //go:cgo_import_dynamic libc_readlink readlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1853,7 +1749,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { func libc_readlinkat_trampoline() -//go:linkname libc_readlinkat libc_readlinkat //go:cgo_import_dynamic libc_readlinkat readlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1878,7 +1773,6 @@ func Rename(from string, to string) (err error) { func libc_rename_trampoline() -//go:linkname libc_rename libc_rename //go:cgo_import_dynamic libc_rename rename "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1903,7 +1797,6 @@ func Renameat(fromfd int, from string, tofd int, to string) (err error) { func libc_renameat_trampoline() -//go:linkname libc_renameat libc_renameat //go:cgo_import_dynamic libc_renameat renameat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1923,7 +1816,6 @@ func Revoke(path string) (err error) { func libc_revoke_trampoline() -//go:linkname libc_revoke libc_revoke //go:cgo_import_dynamic libc_revoke revoke "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1943,7 +1835,6 @@ func Rmdir(path string) (err error) { func libc_rmdir_trampoline() -//go:linkname libc_rmdir libc_rmdir //go:cgo_import_dynamic libc_rmdir rmdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1959,7 +1850,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { func libc_lseek_trampoline() -//go:linkname libc_lseek libc_lseek //go:cgo_import_dynamic libc_lseek lseek "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1975,7 +1865,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err func libc_select_trampoline() -//go:linkname libc_select libc_select //go:cgo_import_dynamic libc_select select "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1990,7 +1879,6 @@ func Setegid(egid int) (err error) { func libc_setegid_trampoline() -//go:linkname libc_setegid libc_setegid //go:cgo_import_dynamic libc_setegid setegid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2005,7 +1893,6 @@ func Seteuid(euid int) (err error) { func libc_seteuid_trampoline() -//go:linkname libc_seteuid libc_seteuid //go:cgo_import_dynamic libc_seteuid seteuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2020,7 +1907,6 @@ func Setgid(gid int) (err error) { func libc_setgid_trampoline() -//go:linkname libc_setgid libc_setgid //go:cgo_import_dynamic libc_setgid setgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2040,7 +1926,6 @@ func Setlogin(name string) (err error) { func libc_setlogin_trampoline() -//go:linkname libc_setlogin libc_setlogin //go:cgo_import_dynamic libc_setlogin setlogin "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2055,7 +1940,6 @@ func Setpgid(pid int, pgid int) (err error) { func libc_setpgid_trampoline() -//go:linkname libc_setpgid libc_setpgid //go:cgo_import_dynamic libc_setpgid setpgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2070,7 +1954,6 @@ func Setpriority(which int, who int, prio int) (err error) { func libc_setpriority_trampoline() -//go:linkname libc_setpriority libc_setpriority //go:cgo_import_dynamic libc_setpriority setpriority "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2085,7 +1968,6 @@ func Setprivexec(flag int) (err error) { func libc_setprivexec_trampoline() -//go:linkname libc_setprivexec libc_setprivexec //go:cgo_import_dynamic libc_setprivexec setprivexec "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2100,7 +1982,6 @@ func Setregid(rgid int, egid int) (err error) { func libc_setregid_trampoline() -//go:linkname libc_setregid libc_setregid //go:cgo_import_dynamic libc_setregid setregid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2115,7 +1996,6 @@ func Setreuid(ruid int, euid int) (err error) { func libc_setreuid_trampoline() -//go:linkname libc_setreuid libc_setreuid //go:cgo_import_dynamic libc_setreuid setreuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2130,7 +2010,6 @@ func Setrlimit(which int, lim *Rlimit) (err error) { func libc_setrlimit_trampoline() -//go:linkname libc_setrlimit libc_setrlimit //go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2146,7 +2025,6 @@ func Setsid() (pid int, err error) { func libc_setsid_trampoline() -//go:linkname libc_setsid libc_setsid //go:cgo_import_dynamic libc_setsid setsid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2161,7 +2039,6 @@ func Settimeofday(tp *Timeval) (err error) { func libc_settimeofday_trampoline() -//go:linkname libc_settimeofday libc_settimeofday //go:cgo_import_dynamic libc_settimeofday settimeofday "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2176,7 +2053,6 @@ func Setuid(uid int) (err error) { func libc_setuid_trampoline() -//go:linkname libc_setuid libc_setuid //go:cgo_import_dynamic libc_setuid setuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2201,7 +2077,6 @@ func Symlink(path string, link string) (err error) { func libc_symlink_trampoline() -//go:linkname libc_symlink libc_symlink //go:cgo_import_dynamic libc_symlink symlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2226,7 +2101,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { func libc_symlinkat_trampoline() -//go:linkname libc_symlinkat libc_symlinkat //go:cgo_import_dynamic libc_symlinkat symlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2241,7 +2115,6 @@ func Sync() (err error) { func libc_sync_trampoline() -//go:linkname libc_sync libc_sync //go:cgo_import_dynamic libc_sync sync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2261,7 +2134,6 @@ func Truncate(path string, length int64) (err error) { func libc_truncate_trampoline() -//go:linkname libc_truncate libc_truncate //go:cgo_import_dynamic libc_truncate truncate "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2274,7 +2146,6 @@ func Umask(newmask int) (oldmask int) { func libc_umask_trampoline() -//go:linkname libc_umask libc_umask //go:cgo_import_dynamic libc_umask umask "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2294,7 +2165,6 @@ func Undelete(path string) (err error) { func libc_undelete_trampoline() -//go:linkname libc_undelete libc_undelete //go:cgo_import_dynamic libc_undelete undelete "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2314,7 +2184,6 @@ func Unlink(path string) (err error) { func libc_unlink_trampoline() -//go:linkname libc_unlink libc_unlink //go:cgo_import_dynamic libc_unlink unlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2334,7 +2203,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { func libc_unlinkat_trampoline() -//go:linkname libc_unlinkat libc_unlinkat //go:cgo_import_dynamic libc_unlinkat unlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2354,7 +2222,6 @@ func Unmount(path string, flags int) (err error) { func libc_unmount_trampoline() -//go:linkname libc_unmount libc_unmount //go:cgo_import_dynamic libc_unmount unmount "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2376,7 +2243,6 @@ func write(fd int, p []byte) (n int, err error) { func libc_write_trampoline() -//go:linkname libc_write libc_write //go:cgo_import_dynamic libc_write write "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2392,7 +2258,6 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( func libc_mmap_trampoline() -//go:linkname libc_mmap libc_mmap //go:cgo_import_dynamic libc_mmap mmap "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2407,7 +2272,6 @@ func munmap(addr uintptr, length uintptr) (err error) { func libc_munmap_trampoline() -//go:linkname libc_munmap libc_munmap //go:cgo_import_dynamic libc_munmap munmap "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2444,7 +2308,6 @@ func Fstat(fd int, stat *Stat_t) (err error) { func libc_fstat64_trampoline() -//go:linkname libc_fstat64 libc_fstat64 //go:cgo_import_dynamic libc_fstat64 fstat64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2464,7 +2327,6 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { func libc_fstatat64_trampoline() -//go:linkname libc_fstatat64 libc_fstatat64 //go:cgo_import_dynamic libc_fstatat64 fstatat64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2479,7 +2341,6 @@ func Fstatfs(fd int, stat *Statfs_t) (err error) { func libc_fstatfs64_trampoline() -//go:linkname libc_fstatfs64 libc_fstatfs64 //go:cgo_import_dynamic libc_fstatfs64 fstatfs64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2495,7 +2356,6 @@ func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) { func libc_getfsstat64_trampoline() -//go:linkname libc_getfsstat64 libc_getfsstat64 //go:cgo_import_dynamic libc_getfsstat64 getfsstat64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2515,12 +2375,11 @@ func Lstat(path string, stat *Stat_t) (err error) { func libc_lstat64_trampoline() -//go:linkname libc_lstat64 libc_lstat64 //go:cgo_import_dynamic libc_lstat64 lstat64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { +func ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) @@ -2530,7 +2389,6 @@ func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { func libc_ptrace_trampoline() -//go:linkname libc_ptrace libc_ptrace //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2550,7 +2408,6 @@ func Stat(path string, stat *Stat_t) (err error) { func libc_stat64_trampoline() -//go:linkname libc_stat64 libc_stat64 //go:cgo_import_dynamic libc_stat64 stat64 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2570,5 +2427,4 @@ func Statfs(path string, stat *Statfs_t) (err error) { func libc_statfs64_trampoline() -//go:linkname libc_statfs64 libc_statfs64 //go:cgo_import_dynamic libc_statfs64 statfs64 "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go index f519ce9afb..de4738fff8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_13.go @@ -24,7 +24,6 @@ func closedir(dir uintptr) (err error) { func libc_closedir_trampoline() -//go:linkname libc_closedir libc_closedir //go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -37,5 +36,4 @@ func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { func libc_readdir_r_trampoline() -//go:linkname libc_readdir_r libc_readdir_r //go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go index d6b5249c2f..c0c771f402 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -25,7 +25,6 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { func libc_getgroups_trampoline() -//go:linkname libc_getgroups libc_getgroups //go:cgo_import_dynamic libc_getgroups getgroups "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -40,7 +39,6 @@ func setgroups(ngid int, gid *_Gid_t) (err error) { func libc_setgroups_trampoline() -//go:linkname libc_setgroups libc_setgroups //go:cgo_import_dynamic libc_setgroups setgroups "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -56,7 +54,6 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err func libc_wait4_trampoline() -//go:linkname libc_wait4 libc_wait4 //go:cgo_import_dynamic libc_wait4 wait4 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -72,7 +69,6 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { func libc_accept_trampoline() -//go:linkname libc_accept libc_accept //go:cgo_import_dynamic libc_accept accept "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -87,7 +83,6 @@ func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { func libc_bind_trampoline() -//go:linkname libc_bind libc_bind //go:cgo_import_dynamic libc_bind bind "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -102,7 +97,6 @@ func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { func libc_connect_trampoline() -//go:linkname libc_connect libc_connect //go:cgo_import_dynamic libc_connect connect "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -118,7 +112,6 @@ func socket(domain int, typ int, proto int) (fd int, err error) { func libc_socket_trampoline() -//go:linkname libc_socket libc_socket //go:cgo_import_dynamic libc_socket socket "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -133,7 +126,6 @@ func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen func libc_getsockopt_trampoline() -//go:linkname libc_getsockopt libc_getsockopt //go:cgo_import_dynamic libc_getsockopt getsockopt "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -148,7 +140,6 @@ func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) func libc_setsockopt_trampoline() -//go:linkname libc_setsockopt libc_setsockopt //go:cgo_import_dynamic libc_setsockopt setsockopt "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -163,7 +154,6 @@ func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { func libc_getpeername_trampoline() -//go:linkname libc_getpeername libc_getpeername //go:cgo_import_dynamic libc_getpeername getpeername "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -178,7 +168,6 @@ func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { func libc_getsockname_trampoline() -//go:linkname libc_getsockname libc_getsockname //go:cgo_import_dynamic libc_getsockname getsockname "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -193,7 +182,6 @@ func Shutdown(s int, how int) (err error) { func libc_shutdown_trampoline() -//go:linkname libc_shutdown libc_shutdown //go:cgo_import_dynamic libc_shutdown shutdown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -208,7 +196,6 @@ func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { func libc_socketpair_trampoline() -//go:linkname libc_socketpair libc_socketpair //go:cgo_import_dynamic libc_socketpair socketpair "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -230,7 +217,6 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl func libc_recvfrom_trampoline() -//go:linkname libc_recvfrom libc_recvfrom //go:cgo_import_dynamic libc_recvfrom recvfrom "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -251,7 +237,6 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( func libc_sendto_trampoline() -//go:linkname libc_sendto libc_sendto //go:cgo_import_dynamic libc_sendto sendto "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -267,7 +252,6 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { func libc_recvmsg_trampoline() -//go:linkname libc_recvmsg libc_recvmsg //go:cgo_import_dynamic libc_recvmsg recvmsg "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -283,7 +267,6 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { func libc_sendmsg_trampoline() -//go:linkname libc_sendmsg libc_sendmsg //go:cgo_import_dynamic libc_sendmsg sendmsg "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -299,7 +282,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne func libc_kevent_trampoline() -//go:linkname libc_kevent libc_kevent //go:cgo_import_dynamic libc_kevent kevent "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -319,7 +301,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { func libc_utimes_trampoline() -//go:linkname libc_utimes libc_utimes //go:cgo_import_dynamic libc_utimes utimes "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -334,7 +315,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { func libc_futimes_trampoline() -//go:linkname libc_futimes libc_futimes //go:cgo_import_dynamic libc_futimes futimes "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -350,7 +330,6 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { func libc_poll_trampoline() -//go:linkname libc_poll libc_poll //go:cgo_import_dynamic libc_poll poll "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -371,7 +350,6 @@ func Madvise(b []byte, behav int) (err error) { func libc_madvise_trampoline() -//go:linkname libc_madvise libc_madvise //go:cgo_import_dynamic libc_madvise madvise "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -392,7 +370,6 @@ func Mlock(b []byte) (err error) { func libc_mlock_trampoline() -//go:linkname libc_mlock libc_mlock //go:cgo_import_dynamic libc_mlock mlock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -407,7 +384,6 @@ func Mlockall(flags int) (err error) { func libc_mlockall_trampoline() -//go:linkname libc_mlockall libc_mlockall //go:cgo_import_dynamic libc_mlockall mlockall "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -428,7 +404,6 @@ func Mprotect(b []byte, prot int) (err error) { func libc_mprotect_trampoline() -//go:linkname libc_mprotect libc_mprotect //go:cgo_import_dynamic libc_mprotect mprotect "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -449,7 +424,6 @@ func Msync(b []byte, flags int) (err error) { func libc_msync_trampoline() -//go:linkname libc_msync libc_msync //go:cgo_import_dynamic libc_msync msync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -470,7 +444,6 @@ func Munlock(b []byte) (err error) { func libc_munlock_trampoline() -//go:linkname libc_munlock libc_munlock //go:cgo_import_dynamic libc_munlock munlock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -485,15 +458,12 @@ func Munlockall() (err error) { func libc_munlockall_trampoline() -//go:linkname libc_munlockall libc_munlockall //go:cgo_import_dynamic libc_munlockall munlockall "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (r int, w int, err error) { - r0, r1, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), 0, 0, 0) - r = int(r0) - w = int(r1) +func pipe(p *[2]int32) (err error) { + _, _, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -502,7 +472,6 @@ func pipe() (r int, w int, err error) { func libc_pipe_trampoline() -//go:linkname libc_pipe libc_pipe //go:cgo_import_dynamic libc_pipe pipe "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -528,7 +497,6 @@ func getxattr(path string, attr string, dest *byte, size int, position uint32, o func libc_getxattr_trampoline() -//go:linkname libc_getxattr libc_getxattr //go:cgo_import_dynamic libc_getxattr getxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -549,7 +517,6 @@ func fgetxattr(fd int, attr string, dest *byte, size int, position uint32, optio func libc_fgetxattr_trampoline() -//go:linkname libc_fgetxattr libc_fgetxattr //go:cgo_import_dynamic libc_fgetxattr fgetxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -574,7 +541,6 @@ func setxattr(path string, attr string, data *byte, size int, position uint32, o func libc_setxattr_trampoline() -//go:linkname libc_setxattr libc_setxattr //go:cgo_import_dynamic libc_setxattr setxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -594,7 +560,6 @@ func fsetxattr(fd int, attr string, data *byte, size int, position uint32, optio func libc_fsetxattr_trampoline() -//go:linkname libc_fsetxattr libc_fsetxattr //go:cgo_import_dynamic libc_fsetxattr fsetxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -619,7 +584,6 @@ func removexattr(path string, attr string, options int) (err error) { func libc_removexattr_trampoline() -//go:linkname libc_removexattr libc_removexattr //go:cgo_import_dynamic libc_removexattr removexattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -639,7 +603,6 @@ func fremovexattr(fd int, attr string, options int) (err error) { func libc_fremovexattr_trampoline() -//go:linkname libc_fremovexattr libc_fremovexattr //go:cgo_import_dynamic libc_fremovexattr fremovexattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -660,7 +623,6 @@ func listxattr(path string, dest *byte, size int, options int) (sz int, err erro func libc_listxattr_trampoline() -//go:linkname libc_listxattr libc_listxattr //go:cgo_import_dynamic libc_listxattr listxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -676,7 +638,6 @@ func flistxattr(fd int, dest *byte, size int, options int) (sz int, err error) { func libc_flistxattr_trampoline() -//go:linkname libc_flistxattr libc_flistxattr //go:cgo_import_dynamic libc_flistxattr flistxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -691,7 +652,6 @@ func setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintp func libc_setattrlist_trampoline() -//go:linkname libc_setattrlist libc_setattrlist //go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -707,7 +667,6 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { func libc_fcntl_trampoline() -//go:linkname libc_fcntl libc_fcntl //go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -722,7 +681,6 @@ func kill(pid int, signum int, posix int) (err error) { func libc_kill_trampoline() -//go:linkname libc_kill libc_kill //go:cgo_import_dynamic libc_kill kill "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -737,7 +695,6 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { func libc_ioctl_trampoline() -//go:linkname libc_ioctl libc_ioctl //go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -758,7 +715,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) func libc_sysctl_trampoline() -//go:linkname libc_sysctl libc_sysctl //go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -773,7 +729,6 @@ func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer func libc_sendfile_trampoline() -//go:linkname libc_sendfile libc_sendfile //go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -793,7 +748,6 @@ func Access(path string, mode uint32) (err error) { func libc_access_trampoline() -//go:linkname libc_access libc_access //go:cgo_import_dynamic libc_access access "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -808,7 +762,6 @@ func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { func libc_adjtime_trampoline() -//go:linkname libc_adjtime libc_adjtime //go:cgo_import_dynamic libc_adjtime adjtime "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -828,7 +781,6 @@ func Chdir(path string) (err error) { func libc_chdir_trampoline() -//go:linkname libc_chdir libc_chdir //go:cgo_import_dynamic libc_chdir chdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -848,7 +800,6 @@ func Chflags(path string, flags int) (err error) { func libc_chflags_trampoline() -//go:linkname libc_chflags libc_chflags //go:cgo_import_dynamic libc_chflags chflags "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -868,7 +819,6 @@ func Chmod(path string, mode uint32) (err error) { func libc_chmod_trampoline() -//go:linkname libc_chmod libc_chmod //go:cgo_import_dynamic libc_chmod chmod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -888,7 +838,6 @@ func Chown(path string, uid int, gid int) (err error) { func libc_chown_trampoline() -//go:linkname libc_chown libc_chown //go:cgo_import_dynamic libc_chown chown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -908,7 +857,6 @@ func Chroot(path string) (err error) { func libc_chroot_trampoline() -//go:linkname libc_chroot libc_chroot //go:cgo_import_dynamic libc_chroot chroot "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -923,7 +871,6 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { func libc_clock_gettime_trampoline() -//go:linkname libc_clock_gettime libc_clock_gettime //go:cgo_import_dynamic libc_clock_gettime clock_gettime "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -938,7 +885,6 @@ func Close(fd int) (err error) { func libc_close_trampoline() -//go:linkname libc_close libc_close //go:cgo_import_dynamic libc_close close "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -963,7 +909,6 @@ func Clonefile(src string, dst string, flags int) (err error) { func libc_clonefile_trampoline() -//go:linkname libc_clonefile libc_clonefile //go:cgo_import_dynamic libc_clonefile clonefile "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -988,7 +933,6 @@ func Clonefileat(srcDirfd int, src string, dstDirfd int, dst string, flags int) func libc_clonefileat_trampoline() -//go:linkname libc_clonefileat libc_clonefileat //go:cgo_import_dynamic libc_clonefileat clonefileat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1004,7 +948,6 @@ func Dup(fd int) (nfd int, err error) { func libc_dup_trampoline() -//go:linkname libc_dup libc_dup //go:cgo_import_dynamic libc_dup dup "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1019,7 +962,6 @@ func Dup2(from int, to int) (err error) { func libc_dup2_trampoline() -//go:linkname libc_dup2 libc_dup2 //go:cgo_import_dynamic libc_dup2 dup2 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1044,7 +986,6 @@ func Exchangedata(path1 string, path2 string, options int) (err error) { func libc_exchangedata_trampoline() -//go:linkname libc_exchangedata libc_exchangedata //go:cgo_import_dynamic libc_exchangedata exchangedata "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1056,7 +997,6 @@ func Exit(code int) { func libc_exit_trampoline() -//go:linkname libc_exit libc_exit //go:cgo_import_dynamic libc_exit exit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1076,7 +1016,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { func libc_faccessat_trampoline() -//go:linkname libc_faccessat libc_faccessat //go:cgo_import_dynamic libc_faccessat faccessat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1091,7 +1030,6 @@ func Fchdir(fd int) (err error) { func libc_fchdir_trampoline() -//go:linkname libc_fchdir libc_fchdir //go:cgo_import_dynamic libc_fchdir fchdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1106,7 +1044,6 @@ func Fchflags(fd int, flags int) (err error) { func libc_fchflags_trampoline() -//go:linkname libc_fchflags libc_fchflags //go:cgo_import_dynamic libc_fchflags fchflags "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1121,7 +1058,6 @@ func Fchmod(fd int, mode uint32) (err error) { func libc_fchmod_trampoline() -//go:linkname libc_fchmod libc_fchmod //go:cgo_import_dynamic libc_fchmod fchmod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1141,7 +1077,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { func libc_fchmodat_trampoline() -//go:linkname libc_fchmodat libc_fchmodat //go:cgo_import_dynamic libc_fchmodat fchmodat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1156,7 +1091,6 @@ func Fchown(fd int, uid int, gid int) (err error) { func libc_fchown_trampoline() -//go:linkname libc_fchown libc_fchown //go:cgo_import_dynamic libc_fchown fchown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1176,7 +1110,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { func libc_fchownat_trampoline() -//go:linkname libc_fchownat libc_fchownat //go:cgo_import_dynamic libc_fchownat fchownat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1196,7 +1129,6 @@ func Fclonefileat(srcDirfd int, dstDirfd int, dst string, flags int) (err error) func libc_fclonefileat_trampoline() -//go:linkname libc_fclonefileat libc_fclonefileat //go:cgo_import_dynamic libc_fclonefileat fclonefileat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1211,7 +1143,6 @@ func Flock(fd int, how int) (err error) { func libc_flock_trampoline() -//go:linkname libc_flock libc_flock //go:cgo_import_dynamic libc_flock flock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1227,7 +1158,6 @@ func Fpathconf(fd int, name int) (val int, err error) { func libc_fpathconf_trampoline() -//go:linkname libc_fpathconf libc_fpathconf //go:cgo_import_dynamic libc_fpathconf fpathconf "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1242,7 +1172,6 @@ func Fsync(fd int) (err error) { func libc_fsync_trampoline() -//go:linkname libc_fsync libc_fsync //go:cgo_import_dynamic libc_fsync fsync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1257,7 +1186,6 @@ func Ftruncate(fd int, length int64) (err error) { func libc_ftruncate_trampoline() -//go:linkname libc_ftruncate libc_ftruncate //go:cgo_import_dynamic libc_ftruncate ftruncate "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1279,7 +1207,6 @@ func Getcwd(buf []byte) (n int, err error) { func libc_getcwd_trampoline() -//go:linkname libc_getcwd libc_getcwd //go:cgo_import_dynamic libc_getcwd getcwd "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1292,7 +1219,6 @@ func Getdtablesize() (size int) { func libc_getdtablesize_trampoline() -//go:linkname libc_getdtablesize libc_getdtablesize //go:cgo_import_dynamic libc_getdtablesize getdtablesize "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1305,7 +1231,6 @@ func Getegid() (egid int) { func libc_getegid_trampoline() -//go:linkname libc_getegid libc_getegid //go:cgo_import_dynamic libc_getegid getegid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1318,7 +1243,6 @@ func Geteuid() (uid int) { func libc_geteuid_trampoline() -//go:linkname libc_geteuid libc_geteuid //go:cgo_import_dynamic libc_geteuid geteuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1331,7 +1255,6 @@ func Getgid() (gid int) { func libc_getgid_trampoline() -//go:linkname libc_getgid libc_getgid //go:cgo_import_dynamic libc_getgid getgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1347,7 +1270,6 @@ func Getpgid(pid int) (pgid int, err error) { func libc_getpgid_trampoline() -//go:linkname libc_getpgid libc_getpgid //go:cgo_import_dynamic libc_getpgid getpgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1360,7 +1282,6 @@ func Getpgrp() (pgrp int) { func libc_getpgrp_trampoline() -//go:linkname libc_getpgrp libc_getpgrp //go:cgo_import_dynamic libc_getpgrp getpgrp "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1373,7 +1294,6 @@ func Getpid() (pid int) { func libc_getpid_trampoline() -//go:linkname libc_getpid libc_getpid //go:cgo_import_dynamic libc_getpid getpid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1386,7 +1306,6 @@ func Getppid() (ppid int) { func libc_getppid_trampoline() -//go:linkname libc_getppid libc_getppid //go:cgo_import_dynamic libc_getppid getppid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1402,7 +1321,6 @@ func Getpriority(which int, who int) (prio int, err error) { func libc_getpriority_trampoline() -//go:linkname libc_getpriority libc_getpriority //go:cgo_import_dynamic libc_getpriority getpriority "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1417,7 +1335,6 @@ func Getrlimit(which int, lim *Rlimit) (err error) { func libc_getrlimit_trampoline() -//go:linkname libc_getrlimit libc_getrlimit //go:cgo_import_dynamic libc_getrlimit getrlimit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1432,7 +1349,6 @@ func Getrusage(who int, rusage *Rusage) (err error) { func libc_getrusage_trampoline() -//go:linkname libc_getrusage libc_getrusage //go:cgo_import_dynamic libc_getrusage getrusage "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1448,7 +1364,6 @@ func Getsid(pid int) (sid int, err error) { func libc_getsid_trampoline() -//go:linkname libc_getsid libc_getsid //go:cgo_import_dynamic libc_getsid getsid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1463,7 +1378,6 @@ func Gettimeofday(tp *Timeval) (err error) { func libc_gettimeofday_trampoline() -//go:linkname libc_gettimeofday libc_gettimeofday //go:cgo_import_dynamic libc_gettimeofday gettimeofday "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1476,7 +1390,6 @@ func Getuid() (uid int) { func libc_getuid_trampoline() -//go:linkname libc_getuid libc_getuid //go:cgo_import_dynamic libc_getuid getuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1489,7 +1402,6 @@ func Issetugid() (tainted bool) { func libc_issetugid_trampoline() -//go:linkname libc_issetugid libc_issetugid //go:cgo_import_dynamic libc_issetugid issetugid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1505,7 +1417,6 @@ func Kqueue() (fd int, err error) { func libc_kqueue_trampoline() -//go:linkname libc_kqueue libc_kqueue //go:cgo_import_dynamic libc_kqueue kqueue "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1525,7 +1436,6 @@ func Lchown(path string, uid int, gid int) (err error) { func libc_lchown_trampoline() -//go:linkname libc_lchown libc_lchown //go:cgo_import_dynamic libc_lchown lchown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1550,7 +1460,6 @@ func Link(path string, link string) (err error) { func libc_link_trampoline() -//go:linkname libc_link libc_link //go:cgo_import_dynamic libc_link link "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1575,7 +1484,6 @@ func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err er func libc_linkat_trampoline() -//go:linkname libc_linkat libc_linkat //go:cgo_import_dynamic libc_linkat linkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1590,7 +1498,6 @@ func Listen(s int, backlog int) (err error) { func libc_listen_trampoline() -//go:linkname libc_listen libc_listen //go:cgo_import_dynamic libc_listen listen "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1610,7 +1517,6 @@ func Mkdir(path string, mode uint32) (err error) { func libc_mkdir_trampoline() -//go:linkname libc_mkdir libc_mkdir //go:cgo_import_dynamic libc_mkdir mkdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1630,7 +1536,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { func libc_mkdirat_trampoline() -//go:linkname libc_mkdirat libc_mkdirat //go:cgo_import_dynamic libc_mkdirat mkdirat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1650,7 +1555,6 @@ func Mkfifo(path string, mode uint32) (err error) { func libc_mkfifo_trampoline() -//go:linkname libc_mkfifo libc_mkfifo //go:cgo_import_dynamic libc_mkfifo mkfifo "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1670,7 +1574,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { func libc_mknod_trampoline() -//go:linkname libc_mknod libc_mknod //go:cgo_import_dynamic libc_mknod mknod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1691,7 +1594,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { func libc_open_trampoline() -//go:linkname libc_open libc_open //go:cgo_import_dynamic libc_open open "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1712,7 +1614,6 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { func libc_openat_trampoline() -//go:linkname libc_openat libc_openat //go:cgo_import_dynamic libc_openat openat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1733,7 +1634,6 @@ func Pathconf(path string, name int) (val int, err error) { func libc_pathconf_trampoline() -//go:linkname libc_pathconf libc_pathconf //go:cgo_import_dynamic libc_pathconf pathconf "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1755,7 +1655,6 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { func libc_pread_trampoline() -//go:linkname libc_pread libc_pread //go:cgo_import_dynamic libc_pread pread "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1777,7 +1676,6 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { func libc_pwrite_trampoline() -//go:linkname libc_pwrite libc_pwrite //go:cgo_import_dynamic libc_pwrite pwrite "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1799,7 +1697,6 @@ func read(fd int, p []byte) (n int, err error) { func libc_read_trampoline() -//go:linkname libc_read libc_read //go:cgo_import_dynamic libc_read read "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1826,7 +1723,6 @@ func Readlink(path string, buf []byte) (n int, err error) { func libc_readlink_trampoline() -//go:linkname libc_readlink libc_readlink //go:cgo_import_dynamic libc_readlink readlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1853,7 +1749,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { func libc_readlinkat_trampoline() -//go:linkname libc_readlinkat libc_readlinkat //go:cgo_import_dynamic libc_readlinkat readlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1878,7 +1773,6 @@ func Rename(from string, to string) (err error) { func libc_rename_trampoline() -//go:linkname libc_rename libc_rename //go:cgo_import_dynamic libc_rename rename "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1903,7 +1797,6 @@ func Renameat(fromfd int, from string, tofd int, to string) (err error) { func libc_renameat_trampoline() -//go:linkname libc_renameat libc_renameat //go:cgo_import_dynamic libc_renameat renameat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1923,7 +1816,6 @@ func Revoke(path string) (err error) { func libc_revoke_trampoline() -//go:linkname libc_revoke libc_revoke //go:cgo_import_dynamic libc_revoke revoke "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1943,7 +1835,6 @@ func Rmdir(path string) (err error) { func libc_rmdir_trampoline() -//go:linkname libc_rmdir libc_rmdir //go:cgo_import_dynamic libc_rmdir rmdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1959,7 +1850,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { func libc_lseek_trampoline() -//go:linkname libc_lseek libc_lseek //go:cgo_import_dynamic libc_lseek lseek "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1975,7 +1865,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err func libc_select_trampoline() -//go:linkname libc_select libc_select //go:cgo_import_dynamic libc_select select "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1990,7 +1879,6 @@ func Setegid(egid int) (err error) { func libc_setegid_trampoline() -//go:linkname libc_setegid libc_setegid //go:cgo_import_dynamic libc_setegid setegid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2005,7 +1893,6 @@ func Seteuid(euid int) (err error) { func libc_seteuid_trampoline() -//go:linkname libc_seteuid libc_seteuid //go:cgo_import_dynamic libc_seteuid seteuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2020,7 +1907,6 @@ func Setgid(gid int) (err error) { func libc_setgid_trampoline() -//go:linkname libc_setgid libc_setgid //go:cgo_import_dynamic libc_setgid setgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2040,7 +1926,6 @@ func Setlogin(name string) (err error) { func libc_setlogin_trampoline() -//go:linkname libc_setlogin libc_setlogin //go:cgo_import_dynamic libc_setlogin setlogin "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2055,7 +1940,6 @@ func Setpgid(pid int, pgid int) (err error) { func libc_setpgid_trampoline() -//go:linkname libc_setpgid libc_setpgid //go:cgo_import_dynamic libc_setpgid setpgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2070,7 +1954,6 @@ func Setpriority(which int, who int, prio int) (err error) { func libc_setpriority_trampoline() -//go:linkname libc_setpriority libc_setpriority //go:cgo_import_dynamic libc_setpriority setpriority "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2085,7 +1968,6 @@ func Setprivexec(flag int) (err error) { func libc_setprivexec_trampoline() -//go:linkname libc_setprivexec libc_setprivexec //go:cgo_import_dynamic libc_setprivexec setprivexec "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2100,7 +1982,6 @@ func Setregid(rgid int, egid int) (err error) { func libc_setregid_trampoline() -//go:linkname libc_setregid libc_setregid //go:cgo_import_dynamic libc_setregid setregid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2115,7 +1996,6 @@ func Setreuid(ruid int, euid int) (err error) { func libc_setreuid_trampoline() -//go:linkname libc_setreuid libc_setreuid //go:cgo_import_dynamic libc_setreuid setreuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2130,7 +2010,6 @@ func Setrlimit(which int, lim *Rlimit) (err error) { func libc_setrlimit_trampoline() -//go:linkname libc_setrlimit libc_setrlimit //go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2146,7 +2025,6 @@ func Setsid() (pid int, err error) { func libc_setsid_trampoline() -//go:linkname libc_setsid libc_setsid //go:cgo_import_dynamic libc_setsid setsid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2161,7 +2039,6 @@ func Settimeofday(tp *Timeval) (err error) { func libc_settimeofday_trampoline() -//go:linkname libc_settimeofday libc_settimeofday //go:cgo_import_dynamic libc_settimeofday settimeofday "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2176,7 +2053,6 @@ func Setuid(uid int) (err error) { func libc_setuid_trampoline() -//go:linkname libc_setuid libc_setuid //go:cgo_import_dynamic libc_setuid setuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2201,7 +2077,6 @@ func Symlink(path string, link string) (err error) { func libc_symlink_trampoline() -//go:linkname libc_symlink libc_symlink //go:cgo_import_dynamic libc_symlink symlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2226,7 +2101,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { func libc_symlinkat_trampoline() -//go:linkname libc_symlinkat libc_symlinkat //go:cgo_import_dynamic libc_symlinkat symlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2241,7 +2115,6 @@ func Sync() (err error) { func libc_sync_trampoline() -//go:linkname libc_sync libc_sync //go:cgo_import_dynamic libc_sync sync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2261,7 +2134,6 @@ func Truncate(path string, length int64) (err error) { func libc_truncate_trampoline() -//go:linkname libc_truncate libc_truncate //go:cgo_import_dynamic libc_truncate truncate "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2274,7 +2146,6 @@ func Umask(newmask int) (oldmask int) { func libc_umask_trampoline() -//go:linkname libc_umask libc_umask //go:cgo_import_dynamic libc_umask umask "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2294,7 +2165,6 @@ func Undelete(path string) (err error) { func libc_undelete_trampoline() -//go:linkname libc_undelete libc_undelete //go:cgo_import_dynamic libc_undelete undelete "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2314,7 +2184,6 @@ func Unlink(path string) (err error) { func libc_unlink_trampoline() -//go:linkname libc_unlink libc_unlink //go:cgo_import_dynamic libc_unlink unlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2334,7 +2203,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { func libc_unlinkat_trampoline() -//go:linkname libc_unlinkat libc_unlinkat //go:cgo_import_dynamic libc_unlinkat unlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2354,7 +2222,6 @@ func Unmount(path string, flags int) (err error) { func libc_unmount_trampoline() -//go:linkname libc_unmount libc_unmount //go:cgo_import_dynamic libc_unmount unmount "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2376,7 +2243,6 @@ func write(fd int, p []byte) (n int, err error) { func libc_write_trampoline() -//go:linkname libc_write libc_write //go:cgo_import_dynamic libc_write write "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2392,7 +2258,6 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( func libc_mmap_trampoline() -//go:linkname libc_mmap libc_mmap //go:cgo_import_dynamic libc_mmap mmap "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2407,7 +2272,6 @@ func munmap(addr uintptr, length uintptr) (err error) { func libc_munmap_trampoline() -//go:linkname libc_munmap libc_munmap //go:cgo_import_dynamic libc_munmap munmap "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2444,7 +2308,6 @@ func Fstat(fd int, stat *Stat_t) (err error) { func libc_fstat_trampoline() -//go:linkname libc_fstat libc_fstat //go:cgo_import_dynamic libc_fstat fstat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2464,7 +2327,6 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { func libc_fstatat_trampoline() -//go:linkname libc_fstatat libc_fstatat //go:cgo_import_dynamic libc_fstatat fstatat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2479,7 +2341,6 @@ func Fstatfs(fd int, stat *Statfs_t) (err error) { func libc_fstatfs_trampoline() -//go:linkname libc_fstatfs libc_fstatfs //go:cgo_import_dynamic libc_fstatfs fstatfs "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2495,7 +2356,6 @@ func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) { func libc_getfsstat_trampoline() -//go:linkname libc_getfsstat libc_getfsstat //go:cgo_import_dynamic libc_getfsstat getfsstat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2515,7 +2375,6 @@ func Lstat(path string, stat *Stat_t) (err error) { func libc_lstat_trampoline() -//go:linkname libc_lstat libc_lstat //go:cgo_import_dynamic libc_lstat lstat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2535,7 +2394,6 @@ func Stat(path string, stat *Stat_t) (err error) { func libc_stat_trampoline() -//go:linkname libc_stat libc_stat //go:cgo_import_dynamic libc_stat stat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2555,5 +2413,4 @@ func Statfs(path string, stat *Statfs_t) (err error) { func libc_statfs_trampoline() -//go:linkname libc_statfs libc_statfs //go:cgo_import_dynamic libc_statfs statfs "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go index d64e6c806f..870eb37abf 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_13.go @@ -24,7 +24,6 @@ func closedir(dir uintptr) (err error) { func libc_closedir_trampoline() -//go:linkname libc_closedir libc_closedir //go:cgo_import_dynamic libc_closedir closedir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -37,5 +36,4 @@ func readdir_r(dir uintptr, entry *Dirent, result **Dirent) (res Errno) { func libc_readdir_r_trampoline() -//go:linkname libc_readdir_r libc_readdir_r //go:cgo_import_dynamic libc_readdir_r readdir_r "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index 23b65a5301..9b01a79c41 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -25,7 +25,6 @@ func getgroups(ngid int, gid *_Gid_t) (n int, err error) { func libc_getgroups_trampoline() -//go:linkname libc_getgroups libc_getgroups //go:cgo_import_dynamic libc_getgroups getgroups "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -40,7 +39,6 @@ func setgroups(ngid int, gid *_Gid_t) (err error) { func libc_setgroups_trampoline() -//go:linkname libc_setgroups libc_setgroups //go:cgo_import_dynamic libc_setgroups setgroups "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -56,7 +54,6 @@ func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err func libc_wait4_trampoline() -//go:linkname libc_wait4 libc_wait4 //go:cgo_import_dynamic libc_wait4 wait4 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -72,7 +69,6 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { func libc_accept_trampoline() -//go:linkname libc_accept libc_accept //go:cgo_import_dynamic libc_accept accept "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -87,7 +83,6 @@ func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { func libc_bind_trampoline() -//go:linkname libc_bind libc_bind //go:cgo_import_dynamic libc_bind bind "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -102,7 +97,6 @@ func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { func libc_connect_trampoline() -//go:linkname libc_connect libc_connect //go:cgo_import_dynamic libc_connect connect "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -118,7 +112,6 @@ func socket(domain int, typ int, proto int) (fd int, err error) { func libc_socket_trampoline() -//go:linkname libc_socket libc_socket //go:cgo_import_dynamic libc_socket socket "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -133,7 +126,6 @@ func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen func libc_getsockopt_trampoline() -//go:linkname libc_getsockopt libc_getsockopt //go:cgo_import_dynamic libc_getsockopt getsockopt "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -148,7 +140,6 @@ func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) func libc_setsockopt_trampoline() -//go:linkname libc_setsockopt libc_setsockopt //go:cgo_import_dynamic libc_setsockopt setsockopt "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -163,7 +154,6 @@ func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { func libc_getpeername_trampoline() -//go:linkname libc_getpeername libc_getpeername //go:cgo_import_dynamic libc_getpeername getpeername "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -178,7 +168,6 @@ func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { func libc_getsockname_trampoline() -//go:linkname libc_getsockname libc_getsockname //go:cgo_import_dynamic libc_getsockname getsockname "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -193,7 +182,6 @@ func Shutdown(s int, how int) (err error) { func libc_shutdown_trampoline() -//go:linkname libc_shutdown libc_shutdown //go:cgo_import_dynamic libc_shutdown shutdown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -208,7 +196,6 @@ func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { func libc_socketpair_trampoline() -//go:linkname libc_socketpair libc_socketpair //go:cgo_import_dynamic libc_socketpair socketpair "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -230,7 +217,6 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl func libc_recvfrom_trampoline() -//go:linkname libc_recvfrom libc_recvfrom //go:cgo_import_dynamic libc_recvfrom recvfrom "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -251,7 +237,6 @@ func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) ( func libc_sendto_trampoline() -//go:linkname libc_sendto libc_sendto //go:cgo_import_dynamic libc_sendto sendto "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -267,7 +252,6 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { func libc_recvmsg_trampoline() -//go:linkname libc_recvmsg libc_recvmsg //go:cgo_import_dynamic libc_recvmsg recvmsg "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -283,7 +267,6 @@ func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { func libc_sendmsg_trampoline() -//go:linkname libc_sendmsg libc_sendmsg //go:cgo_import_dynamic libc_sendmsg sendmsg "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -299,7 +282,6 @@ func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, ne func libc_kevent_trampoline() -//go:linkname libc_kevent libc_kevent //go:cgo_import_dynamic libc_kevent kevent "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -319,7 +301,6 @@ func utimes(path string, timeval *[2]Timeval) (err error) { func libc_utimes_trampoline() -//go:linkname libc_utimes libc_utimes //go:cgo_import_dynamic libc_utimes utimes "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -334,7 +315,6 @@ func futimes(fd int, timeval *[2]Timeval) (err error) { func libc_futimes_trampoline() -//go:linkname libc_futimes libc_futimes //go:cgo_import_dynamic libc_futimes futimes "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -350,7 +330,6 @@ func poll(fds *PollFd, nfds int, timeout int) (n int, err error) { func libc_poll_trampoline() -//go:linkname libc_poll libc_poll //go:cgo_import_dynamic libc_poll poll "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -371,7 +350,6 @@ func Madvise(b []byte, behav int) (err error) { func libc_madvise_trampoline() -//go:linkname libc_madvise libc_madvise //go:cgo_import_dynamic libc_madvise madvise "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -392,7 +370,6 @@ func Mlock(b []byte) (err error) { func libc_mlock_trampoline() -//go:linkname libc_mlock libc_mlock //go:cgo_import_dynamic libc_mlock mlock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -407,7 +384,6 @@ func Mlockall(flags int) (err error) { func libc_mlockall_trampoline() -//go:linkname libc_mlockall libc_mlockall //go:cgo_import_dynamic libc_mlockall mlockall "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -428,7 +404,6 @@ func Mprotect(b []byte, prot int) (err error) { func libc_mprotect_trampoline() -//go:linkname libc_mprotect libc_mprotect //go:cgo_import_dynamic libc_mprotect mprotect "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -449,7 +424,6 @@ func Msync(b []byte, flags int) (err error) { func libc_msync_trampoline() -//go:linkname libc_msync libc_msync //go:cgo_import_dynamic libc_msync msync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -470,7 +444,6 @@ func Munlock(b []byte) (err error) { func libc_munlock_trampoline() -//go:linkname libc_munlock libc_munlock //go:cgo_import_dynamic libc_munlock munlock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -485,15 +458,12 @@ func Munlockall() (err error) { func libc_munlockall_trampoline() -//go:linkname libc_munlockall libc_munlockall //go:cgo_import_dynamic libc_munlockall munlockall "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func pipe() (r int, w int, err error) { - r0, r1, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), 0, 0, 0) - r = int(r0) - w = int(r1) +func pipe(p *[2]int32) (err error) { + _, _, e1 := syscall_rawSyscall(funcPC(libc_pipe_trampoline), uintptr(unsafe.Pointer(p)), 0, 0) if e1 != 0 { err = errnoErr(e1) } @@ -502,7 +472,6 @@ func pipe() (r int, w int, err error) { func libc_pipe_trampoline() -//go:linkname libc_pipe libc_pipe //go:cgo_import_dynamic libc_pipe pipe "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -528,7 +497,6 @@ func getxattr(path string, attr string, dest *byte, size int, position uint32, o func libc_getxattr_trampoline() -//go:linkname libc_getxattr libc_getxattr //go:cgo_import_dynamic libc_getxattr getxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -549,7 +517,6 @@ func fgetxattr(fd int, attr string, dest *byte, size int, position uint32, optio func libc_fgetxattr_trampoline() -//go:linkname libc_fgetxattr libc_fgetxattr //go:cgo_import_dynamic libc_fgetxattr fgetxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -574,7 +541,6 @@ func setxattr(path string, attr string, data *byte, size int, position uint32, o func libc_setxattr_trampoline() -//go:linkname libc_setxattr libc_setxattr //go:cgo_import_dynamic libc_setxattr setxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -594,7 +560,6 @@ func fsetxattr(fd int, attr string, data *byte, size int, position uint32, optio func libc_fsetxattr_trampoline() -//go:linkname libc_fsetxattr libc_fsetxattr //go:cgo_import_dynamic libc_fsetxattr fsetxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -619,7 +584,6 @@ func removexattr(path string, attr string, options int) (err error) { func libc_removexattr_trampoline() -//go:linkname libc_removexattr libc_removexattr //go:cgo_import_dynamic libc_removexattr removexattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -639,7 +603,6 @@ func fremovexattr(fd int, attr string, options int) (err error) { func libc_fremovexattr_trampoline() -//go:linkname libc_fremovexattr libc_fremovexattr //go:cgo_import_dynamic libc_fremovexattr fremovexattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -660,7 +623,6 @@ func listxattr(path string, dest *byte, size int, options int) (sz int, err erro func libc_listxattr_trampoline() -//go:linkname libc_listxattr libc_listxattr //go:cgo_import_dynamic libc_listxattr listxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -676,7 +638,6 @@ func flistxattr(fd int, dest *byte, size int, options int) (sz int, err error) { func libc_flistxattr_trampoline() -//go:linkname libc_flistxattr libc_flistxattr //go:cgo_import_dynamic libc_flistxattr flistxattr "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -691,7 +652,6 @@ func setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintp func libc_setattrlist_trampoline() -//go:linkname libc_setattrlist libc_setattrlist //go:cgo_import_dynamic libc_setattrlist setattrlist "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -707,7 +667,6 @@ func fcntl(fd int, cmd int, arg int) (val int, err error) { func libc_fcntl_trampoline() -//go:linkname libc_fcntl libc_fcntl //go:cgo_import_dynamic libc_fcntl fcntl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -722,7 +681,6 @@ func kill(pid int, signum int, posix int) (err error) { func libc_kill_trampoline() -//go:linkname libc_kill libc_kill //go:cgo_import_dynamic libc_kill kill "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -737,7 +695,6 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { func libc_ioctl_trampoline() -//go:linkname libc_ioctl libc_ioctl //go:cgo_import_dynamic libc_ioctl ioctl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -758,7 +715,6 @@ func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) func libc_sysctl_trampoline() -//go:linkname libc_sysctl libc_sysctl //go:cgo_import_dynamic libc_sysctl sysctl "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -773,7 +729,6 @@ func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer func libc_sendfile_trampoline() -//go:linkname libc_sendfile libc_sendfile //go:cgo_import_dynamic libc_sendfile sendfile "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -793,7 +748,6 @@ func Access(path string, mode uint32) (err error) { func libc_access_trampoline() -//go:linkname libc_access libc_access //go:cgo_import_dynamic libc_access access "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -808,7 +762,6 @@ func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { func libc_adjtime_trampoline() -//go:linkname libc_adjtime libc_adjtime //go:cgo_import_dynamic libc_adjtime adjtime "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -828,7 +781,6 @@ func Chdir(path string) (err error) { func libc_chdir_trampoline() -//go:linkname libc_chdir libc_chdir //go:cgo_import_dynamic libc_chdir chdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -848,7 +800,6 @@ func Chflags(path string, flags int) (err error) { func libc_chflags_trampoline() -//go:linkname libc_chflags libc_chflags //go:cgo_import_dynamic libc_chflags chflags "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -868,7 +819,6 @@ func Chmod(path string, mode uint32) (err error) { func libc_chmod_trampoline() -//go:linkname libc_chmod libc_chmod //go:cgo_import_dynamic libc_chmod chmod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -888,7 +838,6 @@ func Chown(path string, uid int, gid int) (err error) { func libc_chown_trampoline() -//go:linkname libc_chown libc_chown //go:cgo_import_dynamic libc_chown chown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -908,7 +857,6 @@ func Chroot(path string) (err error) { func libc_chroot_trampoline() -//go:linkname libc_chroot libc_chroot //go:cgo_import_dynamic libc_chroot chroot "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -923,7 +871,6 @@ func ClockGettime(clockid int32, time *Timespec) (err error) { func libc_clock_gettime_trampoline() -//go:linkname libc_clock_gettime libc_clock_gettime //go:cgo_import_dynamic libc_clock_gettime clock_gettime "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -938,7 +885,6 @@ func Close(fd int) (err error) { func libc_close_trampoline() -//go:linkname libc_close libc_close //go:cgo_import_dynamic libc_close close "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -963,7 +909,6 @@ func Clonefile(src string, dst string, flags int) (err error) { func libc_clonefile_trampoline() -//go:linkname libc_clonefile libc_clonefile //go:cgo_import_dynamic libc_clonefile clonefile "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -988,7 +933,6 @@ func Clonefileat(srcDirfd int, src string, dstDirfd int, dst string, flags int) func libc_clonefileat_trampoline() -//go:linkname libc_clonefileat libc_clonefileat //go:cgo_import_dynamic libc_clonefileat clonefileat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1004,7 +948,6 @@ func Dup(fd int) (nfd int, err error) { func libc_dup_trampoline() -//go:linkname libc_dup libc_dup //go:cgo_import_dynamic libc_dup dup "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1019,7 +962,6 @@ func Dup2(from int, to int) (err error) { func libc_dup2_trampoline() -//go:linkname libc_dup2 libc_dup2 //go:cgo_import_dynamic libc_dup2 dup2 "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1044,7 +986,6 @@ func Exchangedata(path1 string, path2 string, options int) (err error) { func libc_exchangedata_trampoline() -//go:linkname libc_exchangedata libc_exchangedata //go:cgo_import_dynamic libc_exchangedata exchangedata "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1056,7 +997,6 @@ func Exit(code int) { func libc_exit_trampoline() -//go:linkname libc_exit libc_exit //go:cgo_import_dynamic libc_exit exit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1076,7 +1016,6 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { func libc_faccessat_trampoline() -//go:linkname libc_faccessat libc_faccessat //go:cgo_import_dynamic libc_faccessat faccessat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1091,7 +1030,6 @@ func Fchdir(fd int) (err error) { func libc_fchdir_trampoline() -//go:linkname libc_fchdir libc_fchdir //go:cgo_import_dynamic libc_fchdir fchdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1106,7 +1044,6 @@ func Fchflags(fd int, flags int) (err error) { func libc_fchflags_trampoline() -//go:linkname libc_fchflags libc_fchflags //go:cgo_import_dynamic libc_fchflags fchflags "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1121,7 +1058,6 @@ func Fchmod(fd int, mode uint32) (err error) { func libc_fchmod_trampoline() -//go:linkname libc_fchmod libc_fchmod //go:cgo_import_dynamic libc_fchmod fchmod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1141,7 +1077,6 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { func libc_fchmodat_trampoline() -//go:linkname libc_fchmodat libc_fchmodat //go:cgo_import_dynamic libc_fchmodat fchmodat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1156,7 +1091,6 @@ func Fchown(fd int, uid int, gid int) (err error) { func libc_fchown_trampoline() -//go:linkname libc_fchown libc_fchown //go:cgo_import_dynamic libc_fchown fchown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1176,7 +1110,6 @@ func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { func libc_fchownat_trampoline() -//go:linkname libc_fchownat libc_fchownat //go:cgo_import_dynamic libc_fchownat fchownat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1196,7 +1129,6 @@ func Fclonefileat(srcDirfd int, dstDirfd int, dst string, flags int) (err error) func libc_fclonefileat_trampoline() -//go:linkname libc_fclonefileat libc_fclonefileat //go:cgo_import_dynamic libc_fclonefileat fclonefileat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1211,7 +1143,6 @@ func Flock(fd int, how int) (err error) { func libc_flock_trampoline() -//go:linkname libc_flock libc_flock //go:cgo_import_dynamic libc_flock flock "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1227,7 +1158,6 @@ func Fpathconf(fd int, name int) (val int, err error) { func libc_fpathconf_trampoline() -//go:linkname libc_fpathconf libc_fpathconf //go:cgo_import_dynamic libc_fpathconf fpathconf "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1242,7 +1172,6 @@ func Fsync(fd int) (err error) { func libc_fsync_trampoline() -//go:linkname libc_fsync libc_fsync //go:cgo_import_dynamic libc_fsync fsync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1257,7 +1186,6 @@ func Ftruncate(fd int, length int64) (err error) { func libc_ftruncate_trampoline() -//go:linkname libc_ftruncate libc_ftruncate //go:cgo_import_dynamic libc_ftruncate ftruncate "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1279,7 +1207,6 @@ func Getcwd(buf []byte) (n int, err error) { func libc_getcwd_trampoline() -//go:linkname libc_getcwd libc_getcwd //go:cgo_import_dynamic libc_getcwd getcwd "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1292,7 +1219,6 @@ func Getdtablesize() (size int) { func libc_getdtablesize_trampoline() -//go:linkname libc_getdtablesize libc_getdtablesize //go:cgo_import_dynamic libc_getdtablesize getdtablesize "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1305,7 +1231,6 @@ func Getegid() (egid int) { func libc_getegid_trampoline() -//go:linkname libc_getegid libc_getegid //go:cgo_import_dynamic libc_getegid getegid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1318,7 +1243,6 @@ func Geteuid() (uid int) { func libc_geteuid_trampoline() -//go:linkname libc_geteuid libc_geteuid //go:cgo_import_dynamic libc_geteuid geteuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1331,7 +1255,6 @@ func Getgid() (gid int) { func libc_getgid_trampoline() -//go:linkname libc_getgid libc_getgid //go:cgo_import_dynamic libc_getgid getgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1347,7 +1270,6 @@ func Getpgid(pid int) (pgid int, err error) { func libc_getpgid_trampoline() -//go:linkname libc_getpgid libc_getpgid //go:cgo_import_dynamic libc_getpgid getpgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1360,7 +1282,6 @@ func Getpgrp() (pgrp int) { func libc_getpgrp_trampoline() -//go:linkname libc_getpgrp libc_getpgrp //go:cgo_import_dynamic libc_getpgrp getpgrp "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1373,7 +1294,6 @@ func Getpid() (pid int) { func libc_getpid_trampoline() -//go:linkname libc_getpid libc_getpid //go:cgo_import_dynamic libc_getpid getpid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1386,7 +1306,6 @@ func Getppid() (ppid int) { func libc_getppid_trampoline() -//go:linkname libc_getppid libc_getppid //go:cgo_import_dynamic libc_getppid getppid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1402,7 +1321,6 @@ func Getpriority(which int, who int) (prio int, err error) { func libc_getpriority_trampoline() -//go:linkname libc_getpriority libc_getpriority //go:cgo_import_dynamic libc_getpriority getpriority "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1417,7 +1335,6 @@ func Getrlimit(which int, lim *Rlimit) (err error) { func libc_getrlimit_trampoline() -//go:linkname libc_getrlimit libc_getrlimit //go:cgo_import_dynamic libc_getrlimit getrlimit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1432,7 +1349,6 @@ func Getrusage(who int, rusage *Rusage) (err error) { func libc_getrusage_trampoline() -//go:linkname libc_getrusage libc_getrusage //go:cgo_import_dynamic libc_getrusage getrusage "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1448,7 +1364,6 @@ func Getsid(pid int) (sid int, err error) { func libc_getsid_trampoline() -//go:linkname libc_getsid libc_getsid //go:cgo_import_dynamic libc_getsid getsid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1463,7 +1378,6 @@ func Gettimeofday(tp *Timeval) (err error) { func libc_gettimeofday_trampoline() -//go:linkname libc_gettimeofday libc_gettimeofday //go:cgo_import_dynamic libc_gettimeofday gettimeofday "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1476,7 +1390,6 @@ func Getuid() (uid int) { func libc_getuid_trampoline() -//go:linkname libc_getuid libc_getuid //go:cgo_import_dynamic libc_getuid getuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1489,7 +1402,6 @@ func Issetugid() (tainted bool) { func libc_issetugid_trampoline() -//go:linkname libc_issetugid libc_issetugid //go:cgo_import_dynamic libc_issetugid issetugid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1505,7 +1417,6 @@ func Kqueue() (fd int, err error) { func libc_kqueue_trampoline() -//go:linkname libc_kqueue libc_kqueue //go:cgo_import_dynamic libc_kqueue kqueue "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1525,7 +1436,6 @@ func Lchown(path string, uid int, gid int) (err error) { func libc_lchown_trampoline() -//go:linkname libc_lchown libc_lchown //go:cgo_import_dynamic libc_lchown lchown "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1550,7 +1460,6 @@ func Link(path string, link string) (err error) { func libc_link_trampoline() -//go:linkname libc_link libc_link //go:cgo_import_dynamic libc_link link "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1575,7 +1484,6 @@ func Linkat(pathfd int, path string, linkfd int, link string, flags int) (err er func libc_linkat_trampoline() -//go:linkname libc_linkat libc_linkat //go:cgo_import_dynamic libc_linkat linkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1590,7 +1498,6 @@ func Listen(s int, backlog int) (err error) { func libc_listen_trampoline() -//go:linkname libc_listen libc_listen //go:cgo_import_dynamic libc_listen listen "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1610,7 +1517,6 @@ func Mkdir(path string, mode uint32) (err error) { func libc_mkdir_trampoline() -//go:linkname libc_mkdir libc_mkdir //go:cgo_import_dynamic libc_mkdir mkdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1630,7 +1536,6 @@ func Mkdirat(dirfd int, path string, mode uint32) (err error) { func libc_mkdirat_trampoline() -//go:linkname libc_mkdirat libc_mkdirat //go:cgo_import_dynamic libc_mkdirat mkdirat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1650,7 +1555,6 @@ func Mkfifo(path string, mode uint32) (err error) { func libc_mkfifo_trampoline() -//go:linkname libc_mkfifo libc_mkfifo //go:cgo_import_dynamic libc_mkfifo mkfifo "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1670,7 +1574,6 @@ func Mknod(path string, mode uint32, dev int) (err error) { func libc_mknod_trampoline() -//go:linkname libc_mknod libc_mknod //go:cgo_import_dynamic libc_mknod mknod "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1691,7 +1594,6 @@ func Open(path string, mode int, perm uint32) (fd int, err error) { func libc_open_trampoline() -//go:linkname libc_open libc_open //go:cgo_import_dynamic libc_open open "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1712,7 +1614,6 @@ func Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) { func libc_openat_trampoline() -//go:linkname libc_openat libc_openat //go:cgo_import_dynamic libc_openat openat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1733,7 +1634,6 @@ func Pathconf(path string, name int) (val int, err error) { func libc_pathconf_trampoline() -//go:linkname libc_pathconf libc_pathconf //go:cgo_import_dynamic libc_pathconf pathconf "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1755,7 +1655,6 @@ func Pread(fd int, p []byte, offset int64) (n int, err error) { func libc_pread_trampoline() -//go:linkname libc_pread libc_pread //go:cgo_import_dynamic libc_pread pread "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1777,7 +1676,6 @@ func Pwrite(fd int, p []byte, offset int64) (n int, err error) { func libc_pwrite_trampoline() -//go:linkname libc_pwrite libc_pwrite //go:cgo_import_dynamic libc_pwrite pwrite "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1799,7 +1697,6 @@ func read(fd int, p []byte) (n int, err error) { func libc_read_trampoline() -//go:linkname libc_read libc_read //go:cgo_import_dynamic libc_read read "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1826,7 +1723,6 @@ func Readlink(path string, buf []byte) (n int, err error) { func libc_readlink_trampoline() -//go:linkname libc_readlink libc_readlink //go:cgo_import_dynamic libc_readlink readlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1853,7 +1749,6 @@ func Readlinkat(dirfd int, path string, buf []byte) (n int, err error) { func libc_readlinkat_trampoline() -//go:linkname libc_readlinkat libc_readlinkat //go:cgo_import_dynamic libc_readlinkat readlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1878,7 +1773,6 @@ func Rename(from string, to string) (err error) { func libc_rename_trampoline() -//go:linkname libc_rename libc_rename //go:cgo_import_dynamic libc_rename rename "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1903,7 +1797,6 @@ func Renameat(fromfd int, from string, tofd int, to string) (err error) { func libc_renameat_trampoline() -//go:linkname libc_renameat libc_renameat //go:cgo_import_dynamic libc_renameat renameat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1923,7 +1816,6 @@ func Revoke(path string) (err error) { func libc_revoke_trampoline() -//go:linkname libc_revoke libc_revoke //go:cgo_import_dynamic libc_revoke revoke "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1943,7 +1835,6 @@ func Rmdir(path string) (err error) { func libc_rmdir_trampoline() -//go:linkname libc_rmdir libc_rmdir //go:cgo_import_dynamic libc_rmdir rmdir "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1959,7 +1850,6 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { func libc_lseek_trampoline() -//go:linkname libc_lseek libc_lseek //go:cgo_import_dynamic libc_lseek lseek "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1975,7 +1865,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err func libc_select_trampoline() -//go:linkname libc_select libc_select //go:cgo_import_dynamic libc_select select "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1990,7 +1879,6 @@ func Setegid(egid int) (err error) { func libc_setegid_trampoline() -//go:linkname libc_setegid libc_setegid //go:cgo_import_dynamic libc_setegid setegid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2005,7 +1893,6 @@ func Seteuid(euid int) (err error) { func libc_seteuid_trampoline() -//go:linkname libc_seteuid libc_seteuid //go:cgo_import_dynamic libc_seteuid seteuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2020,7 +1907,6 @@ func Setgid(gid int) (err error) { func libc_setgid_trampoline() -//go:linkname libc_setgid libc_setgid //go:cgo_import_dynamic libc_setgid setgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2040,7 +1926,6 @@ func Setlogin(name string) (err error) { func libc_setlogin_trampoline() -//go:linkname libc_setlogin libc_setlogin //go:cgo_import_dynamic libc_setlogin setlogin "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2055,7 +1940,6 @@ func Setpgid(pid int, pgid int) (err error) { func libc_setpgid_trampoline() -//go:linkname libc_setpgid libc_setpgid //go:cgo_import_dynamic libc_setpgid setpgid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2070,7 +1954,6 @@ func Setpriority(which int, who int, prio int) (err error) { func libc_setpriority_trampoline() -//go:linkname libc_setpriority libc_setpriority //go:cgo_import_dynamic libc_setpriority setpriority "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2085,7 +1968,6 @@ func Setprivexec(flag int) (err error) { func libc_setprivexec_trampoline() -//go:linkname libc_setprivexec libc_setprivexec //go:cgo_import_dynamic libc_setprivexec setprivexec "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2100,7 +1982,6 @@ func Setregid(rgid int, egid int) (err error) { func libc_setregid_trampoline() -//go:linkname libc_setregid libc_setregid //go:cgo_import_dynamic libc_setregid setregid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2115,7 +1996,6 @@ func Setreuid(ruid int, euid int) (err error) { func libc_setreuid_trampoline() -//go:linkname libc_setreuid libc_setreuid //go:cgo_import_dynamic libc_setreuid setreuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2130,7 +2010,6 @@ func Setrlimit(which int, lim *Rlimit) (err error) { func libc_setrlimit_trampoline() -//go:linkname libc_setrlimit libc_setrlimit //go:cgo_import_dynamic libc_setrlimit setrlimit "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2146,7 +2025,6 @@ func Setsid() (pid int, err error) { func libc_setsid_trampoline() -//go:linkname libc_setsid libc_setsid //go:cgo_import_dynamic libc_setsid setsid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2161,7 +2039,6 @@ func Settimeofday(tp *Timeval) (err error) { func libc_settimeofday_trampoline() -//go:linkname libc_settimeofday libc_settimeofday //go:cgo_import_dynamic libc_settimeofday settimeofday "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2176,7 +2053,6 @@ func Setuid(uid int) (err error) { func libc_setuid_trampoline() -//go:linkname libc_setuid libc_setuid //go:cgo_import_dynamic libc_setuid setuid "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2201,7 +2077,6 @@ func Symlink(path string, link string) (err error) { func libc_symlink_trampoline() -//go:linkname libc_symlink libc_symlink //go:cgo_import_dynamic libc_symlink symlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2226,7 +2101,6 @@ func Symlinkat(oldpath string, newdirfd int, newpath string) (err error) { func libc_symlinkat_trampoline() -//go:linkname libc_symlinkat libc_symlinkat //go:cgo_import_dynamic libc_symlinkat symlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2241,7 +2115,6 @@ func Sync() (err error) { func libc_sync_trampoline() -//go:linkname libc_sync libc_sync //go:cgo_import_dynamic libc_sync sync "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2261,7 +2134,6 @@ func Truncate(path string, length int64) (err error) { func libc_truncate_trampoline() -//go:linkname libc_truncate libc_truncate //go:cgo_import_dynamic libc_truncate truncate "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2274,7 +2146,6 @@ func Umask(newmask int) (oldmask int) { func libc_umask_trampoline() -//go:linkname libc_umask libc_umask //go:cgo_import_dynamic libc_umask umask "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2294,7 +2165,6 @@ func Undelete(path string) (err error) { func libc_undelete_trampoline() -//go:linkname libc_undelete libc_undelete //go:cgo_import_dynamic libc_undelete undelete "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2314,7 +2184,6 @@ func Unlink(path string) (err error) { func libc_unlink_trampoline() -//go:linkname libc_unlink libc_unlink //go:cgo_import_dynamic libc_unlink unlink "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2334,7 +2203,6 @@ func Unlinkat(dirfd int, path string, flags int) (err error) { func libc_unlinkat_trampoline() -//go:linkname libc_unlinkat libc_unlinkat //go:cgo_import_dynamic libc_unlinkat unlinkat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2354,7 +2222,6 @@ func Unmount(path string, flags int) (err error) { func libc_unmount_trampoline() -//go:linkname libc_unmount libc_unmount //go:cgo_import_dynamic libc_unmount unmount "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2376,7 +2243,6 @@ func write(fd int, p []byte) (n int, err error) { func libc_write_trampoline() -//go:linkname libc_write libc_write //go:cgo_import_dynamic libc_write write "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2392,7 +2258,6 @@ func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) ( func libc_mmap_trampoline() -//go:linkname libc_mmap libc_mmap //go:cgo_import_dynamic libc_mmap mmap "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2407,7 +2272,6 @@ func munmap(addr uintptr, length uintptr) (err error) { func libc_munmap_trampoline() -//go:linkname libc_munmap libc_munmap //go:cgo_import_dynamic libc_munmap munmap "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2444,7 +2308,6 @@ func Fstat(fd int, stat *Stat_t) (err error) { func libc_fstat_trampoline() -//go:linkname libc_fstat libc_fstat //go:cgo_import_dynamic libc_fstat fstat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2464,7 +2327,6 @@ func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { func libc_fstatat_trampoline() -//go:linkname libc_fstatat libc_fstatat //go:cgo_import_dynamic libc_fstatat fstatat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2479,7 +2341,6 @@ func Fstatfs(fd int, stat *Statfs_t) (err error) { func libc_fstatfs_trampoline() -//go:linkname libc_fstatfs libc_fstatfs //go:cgo_import_dynamic libc_fstatfs fstatfs "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2495,7 +2356,6 @@ func getfsstat(buf unsafe.Pointer, size uintptr, flags int) (n int, err error) { func libc_getfsstat_trampoline() -//go:linkname libc_getfsstat libc_getfsstat //go:cgo_import_dynamic libc_getfsstat getfsstat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2515,12 +2375,11 @@ func Lstat(path string, stat *Stat_t) (err error) { func libc_lstat_trampoline() -//go:linkname libc_lstat libc_lstat //go:cgo_import_dynamic libc_lstat lstat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { +func ptrace1(request int, pid int, addr uintptr, data uintptr) (err error) { _, _, e1 := syscall_syscall6(funcPC(libc_ptrace_trampoline), uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) if e1 != 0 { err = errnoErr(e1) @@ -2530,7 +2389,6 @@ func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { func libc_ptrace_trampoline() -//go:linkname libc_ptrace libc_ptrace //go:cgo_import_dynamic libc_ptrace ptrace "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2550,7 +2408,6 @@ func Stat(path string, stat *Stat_t) (err error) { func libc_stat_trampoline() -//go:linkname libc_stat libc_stat //go:cgo_import_dynamic libc_stat stat "/usr/lib/libSystem.B.dylib" // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -2570,5 +2427,4 @@ func Statfs(path string, stat *Statfs_t) (err error) { func libc_statfs_trampoline() -//go:linkname libc_statfs libc_statfs //go:cgo_import_dynamic libc_statfs statfs "/usr/lib/libSystem.B.dylib" diff --git a/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go index d3af083f4e..665dd9e4b4 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_illumos_amd64.go @@ -14,22 +14,19 @@ import ( //go:cgo_import_dynamic libc_writev writev "libc.so" //go:cgo_import_dynamic libc_pwritev pwritev "libc.so" //go:cgo_import_dynamic libc_accept4 accept4 "libsocket.so" -//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" //go:linkname procreadv libc_readv //go:linkname procpreadv libc_preadv //go:linkname procwritev libc_writev //go:linkname procpwritev libc_pwritev //go:linkname procaccept4 libc_accept4 -//go:linkname procpipe2 libc_pipe2 var ( procreadv, procpreadv, procwritev, procpwritev, - procaccept4, - procpipe2 syscallFunc + procaccept4 syscallFunc ) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -102,13 +99,3 @@ func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, } return } - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - -func pipe2(p *[2]_C_int, flags int) (err error) { - _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe2)), 2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0, 0, 0, 0) - if e1 != 0 { - err = e1 - } - return -} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index a96165d4bf..6dbb83716c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -11,6 +11,7 @@ import ( ) //go:cgo_import_dynamic libc_pipe pipe "libc.so" +//go:cgo_import_dynamic libc_pipe2 pipe2 "libc.so" //go:cgo_import_dynamic libc_getsockname getsockname "libsocket.so" //go:cgo_import_dynamic libc_getcwd getcwd "libc.so" //go:cgo_import_dynamic libc_getgroups getgroups "libc.so" @@ -140,6 +141,7 @@ import ( //go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" //go:linkname procpipe libc_pipe +//go:linkname procpipe2 libc_pipe2 //go:linkname procgetsockname libc_getsockname //go:linkname procGetcwd libc_getcwd //go:linkname procgetgroups libc_getgroups @@ -270,6 +272,7 @@ import ( var ( procpipe, + procpipe2, procgetsockname, procGetcwd, procgetgroups, @@ -412,6 +415,16 @@ func pipe(p *[2]_C_int) (n int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procpipe2)), 2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index 0f5a3f6970..f6742bdee0 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -435,4 +435,5 @@ const ( SYS_OPENAT2 = 437 SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index 36d5219ef8..f7e525573b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -357,4 +357,5 @@ const ( SYS_OPENAT2 = 437 SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index 3622ba14b4..3f60977da6 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -399,4 +399,5 @@ const ( SYS_OPENAT2 = 437 SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 6193c3dc07..dbedf4cbac 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -302,4 +302,5 @@ const ( SYS_OPENAT2 = 437 SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index 640b974345..eeff7e1dc9 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -420,4 +420,5 @@ const ( SYS_OPENAT2 = 4437 SYS_PIDFD_GETFD = 4438 SYS_FACCESSAT2 = 4439 + SYS_PROCESS_MADVISE = 4440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 3467fbb5ff..73cfa535cd 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -350,4 +350,5 @@ const ( SYS_OPENAT2 = 5437 SYS_PIDFD_GETFD = 5438 SYS_FACCESSAT2 = 5439 + SYS_PROCESS_MADVISE = 5440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index 0fc38d5a72..be74729e0c 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -350,4 +350,5 @@ const ( SYS_OPENAT2 = 5437 SYS_PIDFD_GETFD = 5438 SYS_FACCESSAT2 = 5439 + SYS_PROCESS_MADVISE = 5440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 999fd55bcc..2a1047c818 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -420,4 +420,5 @@ const ( SYS_OPENAT2 = 4437 SYS_PIDFD_GETFD = 4438 SYS_FACCESSAT2 = 4439 + SYS_PROCESS_MADVISE = 4440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index 1df0d79935..32707428ce 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -399,4 +399,5 @@ const ( SYS_OPENAT2 = 437 SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 4db39cca4d..a58572f781 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -399,4 +399,5 @@ const ( SYS_OPENAT2 = 437 SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index e692740144..72a65b7602 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -301,4 +301,5 @@ const ( SYS_OPENAT2 = 437 SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index a585aec4e7..1fb9ae5d49 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -364,4 +364,5 @@ const ( SYS_OPENAT2 = 437 SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index d047e567af..57636e09e4 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -378,4 +378,5 @@ const ( SYS_OPENAT2 = 437 SYS_PIDFD_GETFD = 438 SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go index 2c1f815e6f..295859c503 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go @@ -219,6 +219,7 @@ const ( SizeofSockaddrUnix = 0x401 SizeofSockaddrDatalink = 0x80 SizeofLinger = 0x8 + SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofIPv6MTUInfo = 0x20 diff --git a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go index b4a069ecbd..a9ee0ffd44 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go @@ -223,6 +223,7 @@ const ( SizeofSockaddrUnix = 0x401 SizeofSockaddrDatalink = 0x80 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofIPv6MTUInfo = 0x20 diff --git a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go index c4772df23b..85506a05d4 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go @@ -234,6 +234,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 2a3ec615f7..3e9dad33e3 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -313,6 +313,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 SizeofLinger = 0x8 + SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index e11e95499e..e00e615544 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -309,6 +309,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index b91c2ae0f0..5da13c871b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -311,6 +311,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 SizeofLinger = 0x8 + SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go index c6fe1d097d..995ecf9d4e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go @@ -309,6 +309,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 504ef131fb..9f3b1a4e56 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -1381,6 +1381,11 @@ const ( IFLA_PROP_LIST = 0x34 IFLA_ALT_IFNAME = 0x35 IFLA_PERM_ADDRESS = 0x36 + IFLA_PROTO_DOWN_REASON = 0x37 + IFLA_PROTO_DOWN_REASON_UNSPEC = 0x0 + IFLA_PROTO_DOWN_REASON_MASK = 0x1 + IFLA_PROTO_DOWN_REASON_VALUE = 0x2 + IFLA_PROTO_DOWN_REASON_MAX = 0x2 IFLA_INET_UNSPEC = 0x0 IFLA_INET_CONF = 0x1 IFLA_INET6_UNSPEC = 0x0 @@ -1475,6 +1480,7 @@ const ( IFLA_BRPORT_ISOLATED = 0x21 IFLA_BRPORT_BACKUP_PORT = 0x22 IFLA_BRPORT_MRP_RING_OPEN = 0x23 + IFLA_BRPORT_MRP_IN_OPEN = 0x24 IFLA_INFO_UNSPEC = 0x0 IFLA_INFO_KIND = 0x1 IFLA_INFO_DATA = 0x2 @@ -1673,6 +1679,7 @@ const ( IFLA_HSR_SUPERVISION_ADDR = 0x4 IFLA_HSR_SEQ_NR = 0x5 IFLA_HSR_VERSION = 0x6 + IFLA_HSR_PROTOCOL = 0x7 IFLA_STATS_UNSPEC = 0x0 IFLA_STATS_LINK_64 = 0x1 IFLA_STATS_LINK_XSTATS = 0x2 @@ -2217,10 +2224,12 @@ const ( ) const ( - NETNSA_NONE = 0x0 - NETNSA_NSID = 0x1 - NETNSA_PID = 0x2 - NETNSA_FD = 0x3 + NETNSA_NONE = 0x0 + NETNSA_NSID = 0x1 + NETNSA_PID = 0x2 + NETNSA_FD = 0x3 + NETNSA_TARGET_NSID = 0x4 + NETNSA_CURRENT_NSID = 0x5 ) type XDPRingOffset struct { @@ -2370,281 +2379,309 @@ const ( ) const ( - BPF_REG_0 = 0x0 - BPF_REG_1 = 0x1 - BPF_REG_2 = 0x2 - BPF_REG_3 = 0x3 - BPF_REG_4 = 0x4 - BPF_REG_5 = 0x5 - BPF_REG_6 = 0x6 - BPF_REG_7 = 0x7 - BPF_REG_8 = 0x8 - BPF_REG_9 = 0x9 - BPF_REG_10 = 0xa - BPF_MAP_CREATE = 0x0 - BPF_MAP_LOOKUP_ELEM = 0x1 - BPF_MAP_UPDATE_ELEM = 0x2 - BPF_MAP_DELETE_ELEM = 0x3 - BPF_MAP_GET_NEXT_KEY = 0x4 - BPF_PROG_LOAD = 0x5 - BPF_OBJ_PIN = 0x6 - BPF_OBJ_GET = 0x7 - BPF_PROG_ATTACH = 0x8 - BPF_PROG_DETACH = 0x9 - BPF_PROG_TEST_RUN = 0xa - BPF_PROG_GET_NEXT_ID = 0xb - BPF_MAP_GET_NEXT_ID = 0xc - BPF_PROG_GET_FD_BY_ID = 0xd - BPF_MAP_GET_FD_BY_ID = 0xe - BPF_OBJ_GET_INFO_BY_FD = 0xf - BPF_PROG_QUERY = 0x10 - BPF_RAW_TRACEPOINT_OPEN = 0x11 - BPF_BTF_LOAD = 0x12 - BPF_BTF_GET_FD_BY_ID = 0x13 - BPF_TASK_FD_QUERY = 0x14 - BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 - BPF_MAP_FREEZE = 0x16 - BPF_BTF_GET_NEXT_ID = 0x17 - BPF_MAP_LOOKUP_BATCH = 0x18 - BPF_MAP_LOOKUP_AND_DELETE_BATCH = 0x19 - BPF_MAP_UPDATE_BATCH = 0x1a - BPF_MAP_DELETE_BATCH = 0x1b - BPF_LINK_CREATE = 0x1c - BPF_LINK_UPDATE = 0x1d - BPF_LINK_GET_FD_BY_ID = 0x1e - BPF_LINK_GET_NEXT_ID = 0x1f - BPF_ENABLE_STATS = 0x20 - BPF_ITER_CREATE = 0x21 - BPF_MAP_TYPE_UNSPEC = 0x0 - BPF_MAP_TYPE_HASH = 0x1 - BPF_MAP_TYPE_ARRAY = 0x2 - BPF_MAP_TYPE_PROG_ARRAY = 0x3 - BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 - BPF_MAP_TYPE_PERCPU_HASH = 0x5 - BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 - BPF_MAP_TYPE_STACK_TRACE = 0x7 - BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 - BPF_MAP_TYPE_LRU_HASH = 0x9 - BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa - BPF_MAP_TYPE_LPM_TRIE = 0xb - BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc - BPF_MAP_TYPE_HASH_OF_MAPS = 0xd - BPF_MAP_TYPE_DEVMAP = 0xe - BPF_MAP_TYPE_SOCKMAP = 0xf - BPF_MAP_TYPE_CPUMAP = 0x10 - BPF_MAP_TYPE_XSKMAP = 0x11 - BPF_MAP_TYPE_SOCKHASH = 0x12 - BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 - BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 - BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 - BPF_MAP_TYPE_QUEUE = 0x16 - BPF_MAP_TYPE_STACK = 0x17 - BPF_MAP_TYPE_SK_STORAGE = 0x18 - BPF_MAP_TYPE_DEVMAP_HASH = 0x19 - BPF_MAP_TYPE_STRUCT_OPS = 0x1a - BPF_MAP_TYPE_RINGBUF = 0x1b - BPF_PROG_TYPE_UNSPEC = 0x0 - BPF_PROG_TYPE_SOCKET_FILTER = 0x1 - BPF_PROG_TYPE_KPROBE = 0x2 - BPF_PROG_TYPE_SCHED_CLS = 0x3 - BPF_PROG_TYPE_SCHED_ACT = 0x4 - BPF_PROG_TYPE_TRACEPOINT = 0x5 - BPF_PROG_TYPE_XDP = 0x6 - BPF_PROG_TYPE_PERF_EVENT = 0x7 - BPF_PROG_TYPE_CGROUP_SKB = 0x8 - BPF_PROG_TYPE_CGROUP_SOCK = 0x9 - BPF_PROG_TYPE_LWT_IN = 0xa - BPF_PROG_TYPE_LWT_OUT = 0xb - BPF_PROG_TYPE_LWT_XMIT = 0xc - BPF_PROG_TYPE_SOCK_OPS = 0xd - BPF_PROG_TYPE_SK_SKB = 0xe - BPF_PROG_TYPE_CGROUP_DEVICE = 0xf - BPF_PROG_TYPE_SK_MSG = 0x10 - BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 - BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 - BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 - BPF_PROG_TYPE_LIRC_MODE2 = 0x14 - BPF_PROG_TYPE_SK_REUSEPORT = 0x15 - BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 - BPF_PROG_TYPE_CGROUP_SYSCTL = 0x17 - BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 0x18 - BPF_PROG_TYPE_CGROUP_SOCKOPT = 0x19 - BPF_PROG_TYPE_TRACING = 0x1a - BPF_PROG_TYPE_STRUCT_OPS = 0x1b - BPF_PROG_TYPE_EXT = 0x1c - BPF_PROG_TYPE_LSM = 0x1d - BPF_CGROUP_INET_INGRESS = 0x0 - BPF_CGROUP_INET_EGRESS = 0x1 - BPF_CGROUP_INET_SOCK_CREATE = 0x2 - BPF_CGROUP_SOCK_OPS = 0x3 - BPF_SK_SKB_STREAM_PARSER = 0x4 - BPF_SK_SKB_STREAM_VERDICT = 0x5 - BPF_CGROUP_DEVICE = 0x6 - BPF_SK_MSG_VERDICT = 0x7 - BPF_CGROUP_INET4_BIND = 0x8 - BPF_CGROUP_INET6_BIND = 0x9 - BPF_CGROUP_INET4_CONNECT = 0xa - BPF_CGROUP_INET6_CONNECT = 0xb - BPF_CGROUP_INET4_POST_BIND = 0xc - BPF_CGROUP_INET6_POST_BIND = 0xd - BPF_CGROUP_UDP4_SENDMSG = 0xe - BPF_CGROUP_UDP6_SENDMSG = 0xf - BPF_LIRC_MODE2 = 0x10 - BPF_FLOW_DISSECTOR = 0x11 - BPF_CGROUP_SYSCTL = 0x12 - BPF_CGROUP_UDP4_RECVMSG = 0x13 - BPF_CGROUP_UDP6_RECVMSG = 0x14 - BPF_CGROUP_GETSOCKOPT = 0x15 - BPF_CGROUP_SETSOCKOPT = 0x16 - BPF_TRACE_RAW_TP = 0x17 - BPF_TRACE_FENTRY = 0x18 - BPF_TRACE_FEXIT = 0x19 - BPF_MODIFY_RETURN = 0x1a - BPF_LSM_MAC = 0x1b - BPF_TRACE_ITER = 0x1c - BPF_CGROUP_INET4_GETPEERNAME = 0x1d - BPF_CGROUP_INET6_GETPEERNAME = 0x1e - BPF_CGROUP_INET4_GETSOCKNAME = 0x1f - BPF_CGROUP_INET6_GETSOCKNAME = 0x20 - BPF_XDP_DEVMAP = 0x21 - BPF_LINK_TYPE_UNSPEC = 0x0 - BPF_LINK_TYPE_RAW_TRACEPOINT = 0x1 - BPF_LINK_TYPE_TRACING = 0x2 - BPF_LINK_TYPE_CGROUP = 0x3 - BPF_LINK_TYPE_ITER = 0x4 - BPF_LINK_TYPE_NETNS = 0x5 - BPF_ANY = 0x0 - BPF_NOEXIST = 0x1 - BPF_EXIST = 0x2 - BPF_F_LOCK = 0x4 - BPF_F_NO_PREALLOC = 0x1 - BPF_F_NO_COMMON_LRU = 0x2 - BPF_F_NUMA_NODE = 0x4 - BPF_F_RDONLY = 0x8 - BPF_F_WRONLY = 0x10 - BPF_F_STACK_BUILD_ID = 0x20 - BPF_F_ZERO_SEED = 0x40 - BPF_F_RDONLY_PROG = 0x80 - BPF_F_WRONLY_PROG = 0x100 - BPF_F_CLONE = 0x200 - BPF_F_MMAPABLE = 0x400 - BPF_STATS_RUN_TIME = 0x0 - BPF_STACK_BUILD_ID_EMPTY = 0x0 - BPF_STACK_BUILD_ID_VALID = 0x1 - BPF_STACK_BUILD_ID_IP = 0x2 - BPF_F_RECOMPUTE_CSUM = 0x1 - BPF_F_INVALIDATE_HASH = 0x2 - BPF_F_HDR_FIELD_MASK = 0xf - BPF_F_PSEUDO_HDR = 0x10 - BPF_F_MARK_MANGLED_0 = 0x20 - BPF_F_MARK_ENFORCE = 0x40 - BPF_F_INGRESS = 0x1 - BPF_F_TUNINFO_IPV6 = 0x1 - BPF_F_SKIP_FIELD_MASK = 0xff - BPF_F_USER_STACK = 0x100 - BPF_F_FAST_STACK_CMP = 0x200 - BPF_F_REUSE_STACKID = 0x400 - BPF_F_USER_BUILD_ID = 0x800 - BPF_F_ZERO_CSUM_TX = 0x2 - BPF_F_DONT_FRAGMENT = 0x4 - BPF_F_SEQ_NUMBER = 0x8 - BPF_F_INDEX_MASK = 0xffffffff - BPF_F_CURRENT_CPU = 0xffffffff - BPF_F_CTXLEN_MASK = 0xfffff00000000 - BPF_F_CURRENT_NETNS = -0x1 - BPF_CSUM_LEVEL_QUERY = 0x0 - BPF_CSUM_LEVEL_INC = 0x1 - BPF_CSUM_LEVEL_DEC = 0x2 - BPF_CSUM_LEVEL_RESET = 0x3 - BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 - BPF_F_ADJ_ROOM_NO_CSUM_RESET = 0x20 - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 - BPF_F_SYSCTL_BASE_NAME = 0x1 - BPF_SK_STORAGE_GET_F_CREATE = 0x1 - BPF_F_GET_BRANCH_RECORDS_SIZE = 0x1 - BPF_RB_NO_WAKEUP = 0x1 - BPF_RB_FORCE_WAKEUP = 0x2 - BPF_RB_AVAIL_DATA = 0x0 - BPF_RB_RING_SIZE = 0x1 - BPF_RB_CONS_POS = 0x2 - BPF_RB_PROD_POS = 0x3 - BPF_RINGBUF_BUSY_BIT = 0x80000000 - BPF_RINGBUF_DISCARD_BIT = 0x40000000 - BPF_RINGBUF_HDR_SZ = 0x8 - BPF_ADJ_ROOM_NET = 0x0 - BPF_ADJ_ROOM_MAC = 0x1 - BPF_HDR_START_MAC = 0x0 - BPF_HDR_START_NET = 0x1 - BPF_LWT_ENCAP_SEG6 = 0x0 - BPF_LWT_ENCAP_SEG6_INLINE = 0x1 - BPF_LWT_ENCAP_IP = 0x2 - BPF_OK = 0x0 - BPF_DROP = 0x2 - BPF_REDIRECT = 0x7 - BPF_LWT_REROUTE = 0x80 - BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 - BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 - BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 - BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 - BPF_SOCK_OPS_ALL_CB_FLAGS = 0xf - BPF_SOCK_OPS_VOID = 0x0 - BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 - BPF_SOCK_OPS_RWND_INIT = 0x2 - BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 - BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 - BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 - BPF_SOCK_OPS_NEEDS_ECN = 0x6 - BPF_SOCK_OPS_BASE_RTT = 0x7 - BPF_SOCK_OPS_RTO_CB = 0x8 - BPF_SOCK_OPS_RETRANS_CB = 0x9 - BPF_SOCK_OPS_STATE_CB = 0xa - BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb - BPF_SOCK_OPS_RTT_CB = 0xc - BPF_TCP_ESTABLISHED = 0x1 - BPF_TCP_SYN_SENT = 0x2 - BPF_TCP_SYN_RECV = 0x3 - BPF_TCP_FIN_WAIT1 = 0x4 - BPF_TCP_FIN_WAIT2 = 0x5 - BPF_TCP_TIME_WAIT = 0x6 - BPF_TCP_CLOSE = 0x7 - BPF_TCP_CLOSE_WAIT = 0x8 - BPF_TCP_LAST_ACK = 0x9 - BPF_TCP_LISTEN = 0xa - BPF_TCP_CLOSING = 0xb - BPF_TCP_NEW_SYN_RECV = 0xc - BPF_TCP_MAX_STATES = 0xd - TCP_BPF_IW = 0x3e9 - TCP_BPF_SNDCWND_CLAMP = 0x3ea - BPF_DEVCG_ACC_MKNOD = 0x1 - BPF_DEVCG_ACC_READ = 0x2 - BPF_DEVCG_ACC_WRITE = 0x4 - BPF_DEVCG_DEV_BLOCK = 0x1 - BPF_DEVCG_DEV_CHAR = 0x2 - BPF_FIB_LOOKUP_DIRECT = 0x1 - BPF_FIB_LOOKUP_OUTPUT = 0x2 - BPF_FIB_LKUP_RET_SUCCESS = 0x0 - BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 - BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 - BPF_FIB_LKUP_RET_PROHIBIT = 0x3 - BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 - BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 - BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 - BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 - BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 - BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 - BPF_FD_TYPE_TRACEPOINT = 0x1 - BPF_FD_TYPE_KPROBE = 0x2 - BPF_FD_TYPE_KRETPROBE = 0x3 - BPF_FD_TYPE_UPROBE = 0x4 - BPF_FD_TYPE_URETPROBE = 0x5 - BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 - BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 - BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 + BPF_REG_0 = 0x0 + BPF_REG_1 = 0x1 + BPF_REG_2 = 0x2 + BPF_REG_3 = 0x3 + BPF_REG_4 = 0x4 + BPF_REG_5 = 0x5 + BPF_REG_6 = 0x6 + BPF_REG_7 = 0x7 + BPF_REG_8 = 0x8 + BPF_REG_9 = 0x9 + BPF_REG_10 = 0xa + BPF_MAP_CREATE = 0x0 + BPF_MAP_LOOKUP_ELEM = 0x1 + BPF_MAP_UPDATE_ELEM = 0x2 + BPF_MAP_DELETE_ELEM = 0x3 + BPF_MAP_GET_NEXT_KEY = 0x4 + BPF_PROG_LOAD = 0x5 + BPF_OBJ_PIN = 0x6 + BPF_OBJ_GET = 0x7 + BPF_PROG_ATTACH = 0x8 + BPF_PROG_DETACH = 0x9 + BPF_PROG_TEST_RUN = 0xa + BPF_PROG_GET_NEXT_ID = 0xb + BPF_MAP_GET_NEXT_ID = 0xc + BPF_PROG_GET_FD_BY_ID = 0xd + BPF_MAP_GET_FD_BY_ID = 0xe + BPF_OBJ_GET_INFO_BY_FD = 0xf + BPF_PROG_QUERY = 0x10 + BPF_RAW_TRACEPOINT_OPEN = 0x11 + BPF_BTF_LOAD = 0x12 + BPF_BTF_GET_FD_BY_ID = 0x13 + BPF_TASK_FD_QUERY = 0x14 + BPF_MAP_LOOKUP_AND_DELETE_ELEM = 0x15 + BPF_MAP_FREEZE = 0x16 + BPF_BTF_GET_NEXT_ID = 0x17 + BPF_MAP_LOOKUP_BATCH = 0x18 + BPF_MAP_LOOKUP_AND_DELETE_BATCH = 0x19 + BPF_MAP_UPDATE_BATCH = 0x1a + BPF_MAP_DELETE_BATCH = 0x1b + BPF_LINK_CREATE = 0x1c + BPF_LINK_UPDATE = 0x1d + BPF_LINK_GET_FD_BY_ID = 0x1e + BPF_LINK_GET_NEXT_ID = 0x1f + BPF_ENABLE_STATS = 0x20 + BPF_ITER_CREATE = 0x21 + BPF_LINK_DETACH = 0x22 + BPF_PROG_BIND_MAP = 0x23 + BPF_MAP_TYPE_UNSPEC = 0x0 + BPF_MAP_TYPE_HASH = 0x1 + BPF_MAP_TYPE_ARRAY = 0x2 + BPF_MAP_TYPE_PROG_ARRAY = 0x3 + BPF_MAP_TYPE_PERF_EVENT_ARRAY = 0x4 + BPF_MAP_TYPE_PERCPU_HASH = 0x5 + BPF_MAP_TYPE_PERCPU_ARRAY = 0x6 + BPF_MAP_TYPE_STACK_TRACE = 0x7 + BPF_MAP_TYPE_CGROUP_ARRAY = 0x8 + BPF_MAP_TYPE_LRU_HASH = 0x9 + BPF_MAP_TYPE_LRU_PERCPU_HASH = 0xa + BPF_MAP_TYPE_LPM_TRIE = 0xb + BPF_MAP_TYPE_ARRAY_OF_MAPS = 0xc + BPF_MAP_TYPE_HASH_OF_MAPS = 0xd + BPF_MAP_TYPE_DEVMAP = 0xe + BPF_MAP_TYPE_SOCKMAP = 0xf + BPF_MAP_TYPE_CPUMAP = 0x10 + BPF_MAP_TYPE_XSKMAP = 0x11 + BPF_MAP_TYPE_SOCKHASH = 0x12 + BPF_MAP_TYPE_CGROUP_STORAGE = 0x13 + BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 0x14 + BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 0x15 + BPF_MAP_TYPE_QUEUE = 0x16 + BPF_MAP_TYPE_STACK = 0x17 + BPF_MAP_TYPE_SK_STORAGE = 0x18 + BPF_MAP_TYPE_DEVMAP_HASH = 0x19 + BPF_MAP_TYPE_STRUCT_OPS = 0x1a + BPF_MAP_TYPE_RINGBUF = 0x1b + BPF_MAP_TYPE_INODE_STORAGE = 0x1c + BPF_PROG_TYPE_UNSPEC = 0x0 + BPF_PROG_TYPE_SOCKET_FILTER = 0x1 + BPF_PROG_TYPE_KPROBE = 0x2 + BPF_PROG_TYPE_SCHED_CLS = 0x3 + BPF_PROG_TYPE_SCHED_ACT = 0x4 + BPF_PROG_TYPE_TRACEPOINT = 0x5 + BPF_PROG_TYPE_XDP = 0x6 + BPF_PROG_TYPE_PERF_EVENT = 0x7 + BPF_PROG_TYPE_CGROUP_SKB = 0x8 + BPF_PROG_TYPE_CGROUP_SOCK = 0x9 + BPF_PROG_TYPE_LWT_IN = 0xa + BPF_PROG_TYPE_LWT_OUT = 0xb + BPF_PROG_TYPE_LWT_XMIT = 0xc + BPF_PROG_TYPE_SOCK_OPS = 0xd + BPF_PROG_TYPE_SK_SKB = 0xe + BPF_PROG_TYPE_CGROUP_DEVICE = 0xf + BPF_PROG_TYPE_SK_MSG = 0x10 + BPF_PROG_TYPE_RAW_TRACEPOINT = 0x11 + BPF_PROG_TYPE_CGROUP_SOCK_ADDR = 0x12 + BPF_PROG_TYPE_LWT_SEG6LOCAL = 0x13 + BPF_PROG_TYPE_LIRC_MODE2 = 0x14 + BPF_PROG_TYPE_SK_REUSEPORT = 0x15 + BPF_PROG_TYPE_FLOW_DISSECTOR = 0x16 + BPF_PROG_TYPE_CGROUP_SYSCTL = 0x17 + BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE = 0x18 + BPF_PROG_TYPE_CGROUP_SOCKOPT = 0x19 + BPF_PROG_TYPE_TRACING = 0x1a + BPF_PROG_TYPE_STRUCT_OPS = 0x1b + BPF_PROG_TYPE_EXT = 0x1c + BPF_PROG_TYPE_LSM = 0x1d + BPF_PROG_TYPE_SK_LOOKUP = 0x1e + BPF_CGROUP_INET_INGRESS = 0x0 + BPF_CGROUP_INET_EGRESS = 0x1 + BPF_CGROUP_INET_SOCK_CREATE = 0x2 + BPF_CGROUP_SOCK_OPS = 0x3 + BPF_SK_SKB_STREAM_PARSER = 0x4 + BPF_SK_SKB_STREAM_VERDICT = 0x5 + BPF_CGROUP_DEVICE = 0x6 + BPF_SK_MSG_VERDICT = 0x7 + BPF_CGROUP_INET4_BIND = 0x8 + BPF_CGROUP_INET6_BIND = 0x9 + BPF_CGROUP_INET4_CONNECT = 0xa + BPF_CGROUP_INET6_CONNECT = 0xb + BPF_CGROUP_INET4_POST_BIND = 0xc + BPF_CGROUP_INET6_POST_BIND = 0xd + BPF_CGROUP_UDP4_SENDMSG = 0xe + BPF_CGROUP_UDP6_SENDMSG = 0xf + BPF_LIRC_MODE2 = 0x10 + BPF_FLOW_DISSECTOR = 0x11 + BPF_CGROUP_SYSCTL = 0x12 + BPF_CGROUP_UDP4_RECVMSG = 0x13 + BPF_CGROUP_UDP6_RECVMSG = 0x14 + BPF_CGROUP_GETSOCKOPT = 0x15 + BPF_CGROUP_SETSOCKOPT = 0x16 + BPF_TRACE_RAW_TP = 0x17 + BPF_TRACE_FENTRY = 0x18 + BPF_TRACE_FEXIT = 0x19 + BPF_MODIFY_RETURN = 0x1a + BPF_LSM_MAC = 0x1b + BPF_TRACE_ITER = 0x1c + BPF_CGROUP_INET4_GETPEERNAME = 0x1d + BPF_CGROUP_INET6_GETPEERNAME = 0x1e + BPF_CGROUP_INET4_GETSOCKNAME = 0x1f + BPF_CGROUP_INET6_GETSOCKNAME = 0x20 + BPF_XDP_DEVMAP = 0x21 + BPF_CGROUP_INET_SOCK_RELEASE = 0x22 + BPF_XDP_CPUMAP = 0x23 + BPF_SK_LOOKUP = 0x24 + BPF_XDP = 0x25 + BPF_LINK_TYPE_UNSPEC = 0x0 + BPF_LINK_TYPE_RAW_TRACEPOINT = 0x1 + BPF_LINK_TYPE_TRACING = 0x2 + BPF_LINK_TYPE_CGROUP = 0x3 + BPF_LINK_TYPE_ITER = 0x4 + BPF_LINK_TYPE_NETNS = 0x5 + BPF_LINK_TYPE_XDP = 0x6 + BPF_ANY = 0x0 + BPF_NOEXIST = 0x1 + BPF_EXIST = 0x2 + BPF_F_LOCK = 0x4 + BPF_F_NO_PREALLOC = 0x1 + BPF_F_NO_COMMON_LRU = 0x2 + BPF_F_NUMA_NODE = 0x4 + BPF_F_RDONLY = 0x8 + BPF_F_WRONLY = 0x10 + BPF_F_STACK_BUILD_ID = 0x20 + BPF_F_ZERO_SEED = 0x40 + BPF_F_RDONLY_PROG = 0x80 + BPF_F_WRONLY_PROG = 0x100 + BPF_F_CLONE = 0x200 + BPF_F_MMAPABLE = 0x400 + BPF_F_PRESERVE_ELEMS = 0x800 + BPF_F_INNER_MAP = 0x1000 + BPF_STATS_RUN_TIME = 0x0 + BPF_STACK_BUILD_ID_EMPTY = 0x0 + BPF_STACK_BUILD_ID_VALID = 0x1 + BPF_STACK_BUILD_ID_IP = 0x2 + BPF_F_RECOMPUTE_CSUM = 0x1 + BPF_F_INVALIDATE_HASH = 0x2 + BPF_F_HDR_FIELD_MASK = 0xf + BPF_F_PSEUDO_HDR = 0x10 + BPF_F_MARK_MANGLED_0 = 0x20 + BPF_F_MARK_ENFORCE = 0x40 + BPF_F_INGRESS = 0x1 + BPF_F_TUNINFO_IPV6 = 0x1 + BPF_F_SKIP_FIELD_MASK = 0xff + BPF_F_USER_STACK = 0x100 + BPF_F_FAST_STACK_CMP = 0x200 + BPF_F_REUSE_STACKID = 0x400 + BPF_F_USER_BUILD_ID = 0x800 + BPF_F_ZERO_CSUM_TX = 0x2 + BPF_F_DONT_FRAGMENT = 0x4 + BPF_F_SEQ_NUMBER = 0x8 + BPF_F_INDEX_MASK = 0xffffffff + BPF_F_CURRENT_CPU = 0xffffffff + BPF_F_CTXLEN_MASK = 0xfffff00000000 + BPF_F_CURRENT_NETNS = -0x1 + BPF_CSUM_LEVEL_QUERY = 0x0 + BPF_CSUM_LEVEL_INC = 0x1 + BPF_CSUM_LEVEL_DEC = 0x2 + BPF_CSUM_LEVEL_RESET = 0x3 + BPF_F_ADJ_ROOM_FIXED_GSO = 0x1 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = 0x2 + BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = 0x4 + BPF_F_ADJ_ROOM_ENCAP_L4_GRE = 0x8 + BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 + BPF_F_ADJ_ROOM_NO_CSUM_RESET = 0x20 + BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff + BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 + BPF_F_SYSCTL_BASE_NAME = 0x1 + BPF_LOCAL_STORAGE_GET_F_CREATE = 0x1 + BPF_SK_STORAGE_GET_F_CREATE = 0x1 + BPF_F_GET_BRANCH_RECORDS_SIZE = 0x1 + BPF_RB_NO_WAKEUP = 0x1 + BPF_RB_FORCE_WAKEUP = 0x2 + BPF_RB_AVAIL_DATA = 0x0 + BPF_RB_RING_SIZE = 0x1 + BPF_RB_CONS_POS = 0x2 + BPF_RB_PROD_POS = 0x3 + BPF_RINGBUF_BUSY_BIT = 0x80000000 + BPF_RINGBUF_DISCARD_BIT = 0x40000000 + BPF_RINGBUF_HDR_SZ = 0x8 + BPF_SK_LOOKUP_F_REPLACE = 0x1 + BPF_SK_LOOKUP_F_NO_REUSEPORT = 0x2 + BPF_ADJ_ROOM_NET = 0x0 + BPF_ADJ_ROOM_MAC = 0x1 + BPF_HDR_START_MAC = 0x0 + BPF_HDR_START_NET = 0x1 + BPF_LWT_ENCAP_SEG6 = 0x0 + BPF_LWT_ENCAP_SEG6_INLINE = 0x1 + BPF_LWT_ENCAP_IP = 0x2 + BPF_OK = 0x0 + BPF_DROP = 0x2 + BPF_REDIRECT = 0x7 + BPF_LWT_REROUTE = 0x80 + BPF_SOCK_OPS_RTO_CB_FLAG = 0x1 + BPF_SOCK_OPS_RETRANS_CB_FLAG = 0x2 + BPF_SOCK_OPS_STATE_CB_FLAG = 0x4 + BPF_SOCK_OPS_RTT_CB_FLAG = 0x8 + BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = 0x10 + BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = 0x20 + BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = 0x40 + BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7f + BPF_SOCK_OPS_VOID = 0x0 + BPF_SOCK_OPS_TIMEOUT_INIT = 0x1 + BPF_SOCK_OPS_RWND_INIT = 0x2 + BPF_SOCK_OPS_TCP_CONNECT_CB = 0x3 + BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB = 0x4 + BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB = 0x5 + BPF_SOCK_OPS_NEEDS_ECN = 0x6 + BPF_SOCK_OPS_BASE_RTT = 0x7 + BPF_SOCK_OPS_RTO_CB = 0x8 + BPF_SOCK_OPS_RETRANS_CB = 0x9 + BPF_SOCK_OPS_STATE_CB = 0xa + BPF_SOCK_OPS_TCP_LISTEN_CB = 0xb + BPF_SOCK_OPS_RTT_CB = 0xc + BPF_SOCK_OPS_PARSE_HDR_OPT_CB = 0xd + BPF_SOCK_OPS_HDR_OPT_LEN_CB = 0xe + BPF_SOCK_OPS_WRITE_HDR_OPT_CB = 0xf + BPF_TCP_ESTABLISHED = 0x1 + BPF_TCP_SYN_SENT = 0x2 + BPF_TCP_SYN_RECV = 0x3 + BPF_TCP_FIN_WAIT1 = 0x4 + BPF_TCP_FIN_WAIT2 = 0x5 + BPF_TCP_TIME_WAIT = 0x6 + BPF_TCP_CLOSE = 0x7 + BPF_TCP_CLOSE_WAIT = 0x8 + BPF_TCP_LAST_ACK = 0x9 + BPF_TCP_LISTEN = 0xa + BPF_TCP_CLOSING = 0xb + BPF_TCP_NEW_SYN_RECV = 0xc + BPF_TCP_MAX_STATES = 0xd + TCP_BPF_IW = 0x3e9 + TCP_BPF_SNDCWND_CLAMP = 0x3ea + TCP_BPF_DELACK_MAX = 0x3eb + TCP_BPF_RTO_MIN = 0x3ec + TCP_BPF_SYN = 0x3ed + TCP_BPF_SYN_IP = 0x3ee + TCP_BPF_SYN_MAC = 0x3ef + BPF_LOAD_HDR_OPT_TCP_SYN = 0x1 + BPF_WRITE_HDR_TCP_CURRENT_MSS = 0x1 + BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 0x2 + BPF_DEVCG_ACC_MKNOD = 0x1 + BPF_DEVCG_ACC_READ = 0x2 + BPF_DEVCG_ACC_WRITE = 0x4 + BPF_DEVCG_DEV_BLOCK = 0x1 + BPF_DEVCG_DEV_CHAR = 0x2 + BPF_FIB_LOOKUP_DIRECT = 0x1 + BPF_FIB_LOOKUP_OUTPUT = 0x2 + BPF_FIB_LKUP_RET_SUCCESS = 0x0 + BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 + BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 + BPF_FIB_LKUP_RET_PROHIBIT = 0x3 + BPF_FIB_LKUP_RET_NOT_FWDED = 0x4 + BPF_FIB_LKUP_RET_FWD_DISABLED = 0x5 + BPF_FIB_LKUP_RET_UNSUPP_LWT = 0x6 + BPF_FIB_LKUP_RET_NO_NEIGH = 0x7 + BPF_FIB_LKUP_RET_FRAG_NEEDED = 0x8 + BPF_FD_TYPE_RAW_TRACEPOINT = 0x0 + BPF_FD_TYPE_TRACEPOINT = 0x1 + BPF_FD_TYPE_KPROBE = 0x2 + BPF_FD_TYPE_KRETPROBE = 0x3 + BPF_FD_TYPE_UPROBE = 0x4 + BPF_FD_TYPE_URETPROBE = 0x5 + BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = 0x1 + BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = 0x2 + BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = 0x4 ) const ( @@ -2681,6 +2718,7 @@ const ( RTNLGRP_IPV4_MROUTE_R = 0x1e RTNLGRP_IPV6_MROUTE_R = 0x1f RTNLGRP_NEXTHOP = 0x20 + RTNLGRP_BRVLAN = 0x21 ) type CapUserHeader struct { @@ -2775,132 +2813,317 @@ const ( ) const ( - DEVLINK_CMD_UNSPEC = 0x0 - DEVLINK_CMD_GET = 0x1 - DEVLINK_CMD_SET = 0x2 - DEVLINK_CMD_NEW = 0x3 - DEVLINK_CMD_DEL = 0x4 - DEVLINK_CMD_PORT_GET = 0x5 - DEVLINK_CMD_PORT_SET = 0x6 - DEVLINK_CMD_PORT_NEW = 0x7 - DEVLINK_CMD_PORT_DEL = 0x8 - DEVLINK_CMD_PORT_SPLIT = 0x9 - DEVLINK_CMD_PORT_UNSPLIT = 0xa - DEVLINK_CMD_SB_GET = 0xb - DEVLINK_CMD_SB_SET = 0xc - DEVLINK_CMD_SB_NEW = 0xd - DEVLINK_CMD_SB_DEL = 0xe - DEVLINK_CMD_SB_POOL_GET = 0xf - DEVLINK_CMD_SB_POOL_SET = 0x10 - DEVLINK_CMD_SB_POOL_NEW = 0x11 - DEVLINK_CMD_SB_POOL_DEL = 0x12 - DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 - DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 - DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 - DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 - DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 - DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 - DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 - DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a - DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b - DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c - DEVLINK_CMD_ESWITCH_GET = 0x1d - DEVLINK_CMD_ESWITCH_SET = 0x1e - DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f - DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 - DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 - DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 - DEVLINK_CMD_MAX = 0x48 - DEVLINK_PORT_TYPE_NOTSET = 0x0 - DEVLINK_PORT_TYPE_AUTO = 0x1 - DEVLINK_PORT_TYPE_ETH = 0x2 - DEVLINK_PORT_TYPE_IB = 0x3 - DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 - DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 - DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 - DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 - DEVLINK_ESWITCH_MODE_LEGACY = 0x0 - DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 - DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 - DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 - DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 - DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 - DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 - DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 - DEVLINK_ATTR_UNSPEC = 0x0 - DEVLINK_ATTR_BUS_NAME = 0x1 - DEVLINK_ATTR_DEV_NAME = 0x2 - DEVLINK_ATTR_PORT_INDEX = 0x3 - DEVLINK_ATTR_PORT_TYPE = 0x4 - DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 - DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 - DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 - DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 - DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 - DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa - DEVLINK_ATTR_SB_INDEX = 0xb - DEVLINK_ATTR_SB_SIZE = 0xc - DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd - DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe - DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf - DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 - DEVLINK_ATTR_SB_POOL_INDEX = 0x11 - DEVLINK_ATTR_SB_POOL_TYPE = 0x12 - DEVLINK_ATTR_SB_POOL_SIZE = 0x13 - DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 - DEVLINK_ATTR_SB_THRESHOLD = 0x15 - DEVLINK_ATTR_SB_TC_INDEX = 0x16 - DEVLINK_ATTR_SB_OCC_CUR = 0x17 - DEVLINK_ATTR_SB_OCC_MAX = 0x18 - DEVLINK_ATTR_ESWITCH_MODE = 0x19 - DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a - DEVLINK_ATTR_DPIPE_TABLES = 0x1b - DEVLINK_ATTR_DPIPE_TABLE = 0x1c - DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d - DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e - DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f - DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 - DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 - DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 - DEVLINK_ATTR_DPIPE_ENTRY = 0x23 - DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 - DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 - DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 - DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 - DEVLINK_ATTR_DPIPE_MATCH = 0x28 - DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 - DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a - DEVLINK_ATTR_DPIPE_ACTION = 0x2b - DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c - DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d - DEVLINK_ATTR_DPIPE_VALUE = 0x2e - DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f - DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 - DEVLINK_ATTR_DPIPE_HEADERS = 0x31 - DEVLINK_ATTR_DPIPE_HEADER = 0x32 - DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 - DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 - DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 - DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 - DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 - DEVLINK_ATTR_DPIPE_FIELD = 0x38 - DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 - DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a - DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b - DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c - DEVLINK_ATTR_PAD = 0x3d - DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e - DEVLINK_ATTR_MAX = 0x94 - DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 - DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 - DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 - DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 - DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 - DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 - DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 - DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 - DEVLINK_DPIPE_HEADER_IPV4 = 0x1 - DEVLINK_DPIPE_HEADER_IPV6 = 0x2 + DEVLINK_CMD_UNSPEC = 0x0 + DEVLINK_CMD_GET = 0x1 + DEVLINK_CMD_SET = 0x2 + DEVLINK_CMD_NEW = 0x3 + DEVLINK_CMD_DEL = 0x4 + DEVLINK_CMD_PORT_GET = 0x5 + DEVLINK_CMD_PORT_SET = 0x6 + DEVLINK_CMD_PORT_NEW = 0x7 + DEVLINK_CMD_PORT_DEL = 0x8 + DEVLINK_CMD_PORT_SPLIT = 0x9 + DEVLINK_CMD_PORT_UNSPLIT = 0xa + DEVLINK_CMD_SB_GET = 0xb + DEVLINK_CMD_SB_SET = 0xc + DEVLINK_CMD_SB_NEW = 0xd + DEVLINK_CMD_SB_DEL = 0xe + DEVLINK_CMD_SB_POOL_GET = 0xf + DEVLINK_CMD_SB_POOL_SET = 0x10 + DEVLINK_CMD_SB_POOL_NEW = 0x11 + DEVLINK_CMD_SB_POOL_DEL = 0x12 + DEVLINK_CMD_SB_PORT_POOL_GET = 0x13 + DEVLINK_CMD_SB_PORT_POOL_SET = 0x14 + DEVLINK_CMD_SB_PORT_POOL_NEW = 0x15 + DEVLINK_CMD_SB_PORT_POOL_DEL = 0x16 + DEVLINK_CMD_SB_TC_POOL_BIND_GET = 0x17 + DEVLINK_CMD_SB_TC_POOL_BIND_SET = 0x18 + DEVLINK_CMD_SB_TC_POOL_BIND_NEW = 0x19 + DEVLINK_CMD_SB_TC_POOL_BIND_DEL = 0x1a + DEVLINK_CMD_SB_OCC_SNAPSHOT = 0x1b + DEVLINK_CMD_SB_OCC_MAX_CLEAR = 0x1c + DEVLINK_CMD_ESWITCH_GET = 0x1d + DEVLINK_CMD_ESWITCH_SET = 0x1e + DEVLINK_CMD_DPIPE_TABLE_GET = 0x1f + DEVLINK_CMD_DPIPE_ENTRIES_GET = 0x20 + DEVLINK_CMD_DPIPE_HEADERS_GET = 0x21 + DEVLINK_CMD_DPIPE_TABLE_COUNTERS_SET = 0x22 + DEVLINK_CMD_RESOURCE_SET = 0x23 + DEVLINK_CMD_RESOURCE_DUMP = 0x24 + DEVLINK_CMD_RELOAD = 0x25 + DEVLINK_CMD_PARAM_GET = 0x26 + DEVLINK_CMD_PARAM_SET = 0x27 + DEVLINK_CMD_PARAM_NEW = 0x28 + DEVLINK_CMD_PARAM_DEL = 0x29 + DEVLINK_CMD_REGION_GET = 0x2a + DEVLINK_CMD_REGION_SET = 0x2b + DEVLINK_CMD_REGION_NEW = 0x2c + DEVLINK_CMD_REGION_DEL = 0x2d + DEVLINK_CMD_REGION_READ = 0x2e + DEVLINK_CMD_PORT_PARAM_GET = 0x2f + DEVLINK_CMD_PORT_PARAM_SET = 0x30 + DEVLINK_CMD_PORT_PARAM_NEW = 0x31 + DEVLINK_CMD_PORT_PARAM_DEL = 0x32 + DEVLINK_CMD_INFO_GET = 0x33 + DEVLINK_CMD_HEALTH_REPORTER_GET = 0x34 + DEVLINK_CMD_HEALTH_REPORTER_SET = 0x35 + DEVLINK_CMD_HEALTH_REPORTER_RECOVER = 0x36 + DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE = 0x37 + DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET = 0x38 + DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR = 0x39 + DEVLINK_CMD_FLASH_UPDATE = 0x3a + DEVLINK_CMD_FLASH_UPDATE_END = 0x3b + DEVLINK_CMD_FLASH_UPDATE_STATUS = 0x3c + DEVLINK_CMD_TRAP_GET = 0x3d + DEVLINK_CMD_TRAP_SET = 0x3e + DEVLINK_CMD_TRAP_NEW = 0x3f + DEVLINK_CMD_TRAP_DEL = 0x40 + DEVLINK_CMD_TRAP_GROUP_GET = 0x41 + DEVLINK_CMD_TRAP_GROUP_SET = 0x42 + DEVLINK_CMD_TRAP_GROUP_NEW = 0x43 + DEVLINK_CMD_TRAP_GROUP_DEL = 0x44 + DEVLINK_CMD_TRAP_POLICER_GET = 0x45 + DEVLINK_CMD_TRAP_POLICER_SET = 0x46 + DEVLINK_CMD_TRAP_POLICER_NEW = 0x47 + DEVLINK_CMD_TRAP_POLICER_DEL = 0x48 + DEVLINK_CMD_HEALTH_REPORTER_TEST = 0x49 + DEVLINK_CMD_MAX = 0x49 + DEVLINK_PORT_TYPE_NOTSET = 0x0 + DEVLINK_PORT_TYPE_AUTO = 0x1 + DEVLINK_PORT_TYPE_ETH = 0x2 + DEVLINK_PORT_TYPE_IB = 0x3 + DEVLINK_SB_POOL_TYPE_INGRESS = 0x0 + DEVLINK_SB_POOL_TYPE_EGRESS = 0x1 + DEVLINK_SB_THRESHOLD_TYPE_STATIC = 0x0 + DEVLINK_SB_THRESHOLD_TYPE_DYNAMIC = 0x1 + DEVLINK_ESWITCH_MODE_LEGACY = 0x0 + DEVLINK_ESWITCH_MODE_SWITCHDEV = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NONE = 0x0 + DEVLINK_ESWITCH_INLINE_MODE_LINK = 0x1 + DEVLINK_ESWITCH_INLINE_MODE_NETWORK = 0x2 + DEVLINK_ESWITCH_INLINE_MODE_TRANSPORT = 0x3 + DEVLINK_ESWITCH_ENCAP_MODE_NONE = 0x0 + DEVLINK_ESWITCH_ENCAP_MODE_BASIC = 0x1 + DEVLINK_PORT_FLAVOUR_PHYSICAL = 0x0 + DEVLINK_PORT_FLAVOUR_CPU = 0x1 + DEVLINK_PORT_FLAVOUR_DSA = 0x2 + DEVLINK_PORT_FLAVOUR_PCI_PF = 0x3 + DEVLINK_PORT_FLAVOUR_PCI_VF = 0x4 + DEVLINK_PORT_FLAVOUR_VIRTUAL = 0x5 + DEVLINK_PORT_FLAVOUR_UNUSED = 0x6 + DEVLINK_PARAM_CMODE_RUNTIME = 0x0 + DEVLINK_PARAM_CMODE_DRIVERINIT = 0x1 + DEVLINK_PARAM_CMODE_PERMANENT = 0x2 + DEVLINK_PARAM_CMODE_MAX = 0x2 + DEVLINK_PARAM_FW_LOAD_POLICY_VALUE_DRIVER = 0x0 + DEVLINK_PARAM_FW_LOAD_POLICY_VALUE_FLASH = 0x1 + DEVLINK_PARAM_FW_LOAD_POLICY_VALUE_DISK = 0x2 + DEVLINK_PARAM_FW_LOAD_POLICY_VALUE_UNKNOWN = 0x3 + DEVLINK_PARAM_RESET_DEV_ON_DRV_PROBE_VALUE_UNKNOWN = 0x0 + DEVLINK_PARAM_RESET_DEV_ON_DRV_PROBE_VALUE_ALWAYS = 0x1 + DEVLINK_PARAM_RESET_DEV_ON_DRV_PROBE_VALUE_NEVER = 0x2 + DEVLINK_PARAM_RESET_DEV_ON_DRV_PROBE_VALUE_DISK = 0x3 + DEVLINK_ATTR_STATS_RX_PACKETS = 0x0 + DEVLINK_ATTR_STATS_RX_BYTES = 0x1 + DEVLINK_ATTR_STATS_RX_DROPPED = 0x2 + DEVLINK_ATTR_STATS_MAX = 0x2 + DEVLINK_FLASH_OVERWRITE_SETTINGS_BIT = 0x0 + DEVLINK_FLASH_OVERWRITE_IDENTIFIERS_BIT = 0x1 + DEVLINK_FLASH_OVERWRITE_MAX_BIT = 0x1 + DEVLINK_TRAP_ACTION_DROP = 0x0 + DEVLINK_TRAP_ACTION_TRAP = 0x1 + DEVLINK_TRAP_ACTION_MIRROR = 0x2 + DEVLINK_TRAP_TYPE_DROP = 0x0 + DEVLINK_TRAP_TYPE_EXCEPTION = 0x1 + DEVLINK_TRAP_TYPE_CONTROL = 0x2 + DEVLINK_ATTR_TRAP_METADATA_TYPE_IN_PORT = 0x0 + DEVLINK_ATTR_TRAP_METADATA_TYPE_FA_COOKIE = 0x1 + DEVLINK_RELOAD_ACTION_UNSPEC = 0x0 + DEVLINK_RELOAD_ACTION_DRIVER_REINIT = 0x1 + DEVLINK_RELOAD_ACTION_FW_ACTIVATE = 0x2 + DEVLINK_RELOAD_ACTION_MAX = 0x2 + DEVLINK_RELOAD_LIMIT_UNSPEC = 0x0 + DEVLINK_RELOAD_LIMIT_NO_RESET = 0x1 + DEVLINK_RELOAD_LIMIT_MAX = 0x1 + DEVLINK_ATTR_UNSPEC = 0x0 + DEVLINK_ATTR_BUS_NAME = 0x1 + DEVLINK_ATTR_DEV_NAME = 0x2 + DEVLINK_ATTR_PORT_INDEX = 0x3 + DEVLINK_ATTR_PORT_TYPE = 0x4 + DEVLINK_ATTR_PORT_DESIRED_TYPE = 0x5 + DEVLINK_ATTR_PORT_NETDEV_IFINDEX = 0x6 + DEVLINK_ATTR_PORT_NETDEV_NAME = 0x7 + DEVLINK_ATTR_PORT_IBDEV_NAME = 0x8 + DEVLINK_ATTR_PORT_SPLIT_COUNT = 0x9 + DEVLINK_ATTR_PORT_SPLIT_GROUP = 0xa + DEVLINK_ATTR_SB_INDEX = 0xb + DEVLINK_ATTR_SB_SIZE = 0xc + DEVLINK_ATTR_SB_INGRESS_POOL_COUNT = 0xd + DEVLINK_ATTR_SB_EGRESS_POOL_COUNT = 0xe + DEVLINK_ATTR_SB_INGRESS_TC_COUNT = 0xf + DEVLINK_ATTR_SB_EGRESS_TC_COUNT = 0x10 + DEVLINK_ATTR_SB_POOL_INDEX = 0x11 + DEVLINK_ATTR_SB_POOL_TYPE = 0x12 + DEVLINK_ATTR_SB_POOL_SIZE = 0x13 + DEVLINK_ATTR_SB_POOL_THRESHOLD_TYPE = 0x14 + DEVLINK_ATTR_SB_THRESHOLD = 0x15 + DEVLINK_ATTR_SB_TC_INDEX = 0x16 + DEVLINK_ATTR_SB_OCC_CUR = 0x17 + DEVLINK_ATTR_SB_OCC_MAX = 0x18 + DEVLINK_ATTR_ESWITCH_MODE = 0x19 + DEVLINK_ATTR_ESWITCH_INLINE_MODE = 0x1a + DEVLINK_ATTR_DPIPE_TABLES = 0x1b + DEVLINK_ATTR_DPIPE_TABLE = 0x1c + DEVLINK_ATTR_DPIPE_TABLE_NAME = 0x1d + DEVLINK_ATTR_DPIPE_TABLE_SIZE = 0x1e + DEVLINK_ATTR_DPIPE_TABLE_MATCHES = 0x1f + DEVLINK_ATTR_DPIPE_TABLE_ACTIONS = 0x20 + DEVLINK_ATTR_DPIPE_TABLE_COUNTERS_ENABLED = 0x21 + DEVLINK_ATTR_DPIPE_ENTRIES = 0x22 + DEVLINK_ATTR_DPIPE_ENTRY = 0x23 + DEVLINK_ATTR_DPIPE_ENTRY_INDEX = 0x24 + DEVLINK_ATTR_DPIPE_ENTRY_MATCH_VALUES = 0x25 + DEVLINK_ATTR_DPIPE_ENTRY_ACTION_VALUES = 0x26 + DEVLINK_ATTR_DPIPE_ENTRY_COUNTER = 0x27 + DEVLINK_ATTR_DPIPE_MATCH = 0x28 + DEVLINK_ATTR_DPIPE_MATCH_VALUE = 0x29 + DEVLINK_ATTR_DPIPE_MATCH_TYPE = 0x2a + DEVLINK_ATTR_DPIPE_ACTION = 0x2b + DEVLINK_ATTR_DPIPE_ACTION_VALUE = 0x2c + DEVLINK_ATTR_DPIPE_ACTION_TYPE = 0x2d + DEVLINK_ATTR_DPIPE_VALUE = 0x2e + DEVLINK_ATTR_DPIPE_VALUE_MASK = 0x2f + DEVLINK_ATTR_DPIPE_VALUE_MAPPING = 0x30 + DEVLINK_ATTR_DPIPE_HEADERS = 0x31 + DEVLINK_ATTR_DPIPE_HEADER = 0x32 + DEVLINK_ATTR_DPIPE_HEADER_NAME = 0x33 + DEVLINK_ATTR_DPIPE_HEADER_ID = 0x34 + DEVLINK_ATTR_DPIPE_HEADER_FIELDS = 0x35 + DEVLINK_ATTR_DPIPE_HEADER_GLOBAL = 0x36 + DEVLINK_ATTR_DPIPE_HEADER_INDEX = 0x37 + DEVLINK_ATTR_DPIPE_FIELD = 0x38 + DEVLINK_ATTR_DPIPE_FIELD_NAME = 0x39 + DEVLINK_ATTR_DPIPE_FIELD_ID = 0x3a + DEVLINK_ATTR_DPIPE_FIELD_BITWIDTH = 0x3b + DEVLINK_ATTR_DPIPE_FIELD_MAPPING_TYPE = 0x3c + DEVLINK_ATTR_PAD = 0x3d + DEVLINK_ATTR_ESWITCH_ENCAP_MODE = 0x3e + DEVLINK_ATTR_RESOURCE_LIST = 0x3f + DEVLINK_ATTR_RESOURCE = 0x40 + DEVLINK_ATTR_RESOURCE_NAME = 0x41 + DEVLINK_ATTR_RESOURCE_ID = 0x42 + DEVLINK_ATTR_RESOURCE_SIZE = 0x43 + DEVLINK_ATTR_RESOURCE_SIZE_NEW = 0x44 + DEVLINK_ATTR_RESOURCE_SIZE_VALID = 0x45 + DEVLINK_ATTR_RESOURCE_SIZE_MIN = 0x46 + DEVLINK_ATTR_RESOURCE_SIZE_MAX = 0x47 + DEVLINK_ATTR_RESOURCE_SIZE_GRAN = 0x48 + DEVLINK_ATTR_RESOURCE_UNIT = 0x49 + DEVLINK_ATTR_RESOURCE_OCC = 0x4a + DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID = 0x4b + DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS = 0x4c + DEVLINK_ATTR_PORT_FLAVOUR = 0x4d + DEVLINK_ATTR_PORT_NUMBER = 0x4e + DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER = 0x4f + DEVLINK_ATTR_PARAM = 0x50 + DEVLINK_ATTR_PARAM_NAME = 0x51 + DEVLINK_ATTR_PARAM_GENERIC = 0x52 + DEVLINK_ATTR_PARAM_TYPE = 0x53 + DEVLINK_ATTR_PARAM_VALUES_LIST = 0x54 + DEVLINK_ATTR_PARAM_VALUE = 0x55 + DEVLINK_ATTR_PARAM_VALUE_DATA = 0x56 + DEVLINK_ATTR_PARAM_VALUE_CMODE = 0x57 + DEVLINK_ATTR_REGION_NAME = 0x58 + DEVLINK_ATTR_REGION_SIZE = 0x59 + DEVLINK_ATTR_REGION_SNAPSHOTS = 0x5a + DEVLINK_ATTR_REGION_SNAPSHOT = 0x5b + DEVLINK_ATTR_REGION_SNAPSHOT_ID = 0x5c + DEVLINK_ATTR_REGION_CHUNKS = 0x5d + DEVLINK_ATTR_REGION_CHUNK = 0x5e + DEVLINK_ATTR_REGION_CHUNK_DATA = 0x5f + DEVLINK_ATTR_REGION_CHUNK_ADDR = 0x60 + DEVLINK_ATTR_REGION_CHUNK_LEN = 0x61 + DEVLINK_ATTR_INFO_DRIVER_NAME = 0x62 + DEVLINK_ATTR_INFO_SERIAL_NUMBER = 0x63 + DEVLINK_ATTR_INFO_VERSION_FIXED = 0x64 + DEVLINK_ATTR_INFO_VERSION_RUNNING = 0x65 + DEVLINK_ATTR_INFO_VERSION_STORED = 0x66 + DEVLINK_ATTR_INFO_VERSION_NAME = 0x67 + DEVLINK_ATTR_INFO_VERSION_VALUE = 0x68 + DEVLINK_ATTR_SB_POOL_CELL_SIZE = 0x69 + DEVLINK_ATTR_FMSG = 0x6a + DEVLINK_ATTR_FMSG_OBJ_NEST_START = 0x6b + DEVLINK_ATTR_FMSG_PAIR_NEST_START = 0x6c + DEVLINK_ATTR_FMSG_ARR_NEST_START = 0x6d + DEVLINK_ATTR_FMSG_NEST_END = 0x6e + DEVLINK_ATTR_FMSG_OBJ_NAME = 0x6f + DEVLINK_ATTR_FMSG_OBJ_VALUE_TYPE = 0x70 + DEVLINK_ATTR_FMSG_OBJ_VALUE_DATA = 0x71 + DEVLINK_ATTR_HEALTH_REPORTER = 0x72 + DEVLINK_ATTR_HEALTH_REPORTER_NAME = 0x73 + DEVLINK_ATTR_HEALTH_REPORTER_STATE = 0x74 + DEVLINK_ATTR_HEALTH_REPORTER_ERR_COUNT = 0x75 + DEVLINK_ATTR_HEALTH_REPORTER_RECOVER_COUNT = 0x76 + DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS = 0x77 + DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD = 0x78 + DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER = 0x79 + DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME = 0x7a + DEVLINK_ATTR_FLASH_UPDATE_COMPONENT = 0x7b + DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG = 0x7c + DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE = 0x7d + DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL = 0x7e + DEVLINK_ATTR_PORT_PCI_PF_NUMBER = 0x7f + DEVLINK_ATTR_PORT_PCI_VF_NUMBER = 0x80 + DEVLINK_ATTR_STATS = 0x81 + DEVLINK_ATTR_TRAP_NAME = 0x82 + DEVLINK_ATTR_TRAP_ACTION = 0x83 + DEVLINK_ATTR_TRAP_TYPE = 0x84 + DEVLINK_ATTR_TRAP_GENERIC = 0x85 + DEVLINK_ATTR_TRAP_METADATA = 0x86 + DEVLINK_ATTR_TRAP_GROUP_NAME = 0x87 + DEVLINK_ATTR_RELOAD_FAILED = 0x88 + DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS = 0x89 + DEVLINK_ATTR_NETNS_FD = 0x8a + DEVLINK_ATTR_NETNS_PID = 0x8b + DEVLINK_ATTR_NETNS_ID = 0x8c + DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP = 0x8d + DEVLINK_ATTR_TRAP_POLICER_ID = 0x8e + DEVLINK_ATTR_TRAP_POLICER_RATE = 0x8f + DEVLINK_ATTR_TRAP_POLICER_BURST = 0x90 + DEVLINK_ATTR_PORT_FUNCTION = 0x91 + DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER = 0x92 + DEVLINK_ATTR_PORT_LANES = 0x93 + DEVLINK_ATTR_PORT_SPLITTABLE = 0x94 + DEVLINK_ATTR_PORT_EXTERNAL = 0x95 + DEVLINK_ATTR_PORT_CONTROLLER_NUMBER = 0x96 + DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT = 0x97 + DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK = 0x98 + DEVLINK_ATTR_RELOAD_ACTION = 0x99 + DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED = 0x9a + DEVLINK_ATTR_RELOAD_LIMITS = 0x9b + DEVLINK_ATTR_DEV_STATS = 0x9c + DEVLINK_ATTR_RELOAD_STATS = 0x9d + DEVLINK_ATTR_RELOAD_STATS_ENTRY = 0x9e + DEVLINK_ATTR_RELOAD_STATS_LIMIT = 0x9f + DEVLINK_ATTR_RELOAD_STATS_VALUE = 0xa0 + DEVLINK_ATTR_REMOTE_RELOAD_STATS = 0xa1 + DEVLINK_ATTR_RELOAD_ACTION_INFO = 0xa2 + DEVLINK_ATTR_RELOAD_ACTION_STATS = 0xa3 + DEVLINK_ATTR_MAX = 0xa3 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_NONE = 0x0 + DEVLINK_DPIPE_FIELD_MAPPING_TYPE_IFINDEX = 0x1 + DEVLINK_DPIPE_MATCH_TYPE_FIELD_EXACT = 0x0 + DEVLINK_DPIPE_ACTION_TYPE_FIELD_MODIFY = 0x0 + DEVLINK_DPIPE_FIELD_ETHERNET_DST_MAC = 0x0 + DEVLINK_DPIPE_FIELD_IPV4_DST_IP = 0x0 + DEVLINK_DPIPE_FIELD_IPV6_DST_IP = 0x0 + DEVLINK_DPIPE_HEADER_ETHERNET = 0x0 + DEVLINK_DPIPE_HEADER_IPV4 = 0x1 + DEVLINK_DPIPE_HEADER_IPV6 = 0x2 + DEVLINK_RESOURCE_UNIT_ENTRY = 0x0 + DEVLINK_PORT_FUNCTION_ATTR_UNSPEC = 0x0 + DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR = 0x1 + DEVLINK_PORT_FUNCTION_ATTR_MAX = 0x1 ) type FsverityDigest struct { @@ -2999,3 +3222,461 @@ const ( MPLS_IPTUNNEL_TTL = 0x2 MPLS_IPTUNNEL_MAX = 0x2 ) + +const ( + ETHTOOL_ID_UNSPEC = 0x0 + ETHTOOL_RX_COPYBREAK = 0x1 + ETHTOOL_TX_COPYBREAK = 0x2 + ETHTOOL_PFC_PREVENTION_TOUT = 0x3 + ETHTOOL_TUNABLE_UNSPEC = 0x0 + ETHTOOL_TUNABLE_U8 = 0x1 + ETHTOOL_TUNABLE_U16 = 0x2 + ETHTOOL_TUNABLE_U32 = 0x3 + ETHTOOL_TUNABLE_U64 = 0x4 + ETHTOOL_TUNABLE_STRING = 0x5 + ETHTOOL_TUNABLE_S8 = 0x6 + ETHTOOL_TUNABLE_S16 = 0x7 + ETHTOOL_TUNABLE_S32 = 0x8 + ETHTOOL_TUNABLE_S64 = 0x9 + ETHTOOL_PHY_ID_UNSPEC = 0x0 + ETHTOOL_PHY_DOWNSHIFT = 0x1 + ETHTOOL_PHY_FAST_LINK_DOWN = 0x2 + ETHTOOL_PHY_EDPD = 0x3 + ETHTOOL_LINK_EXT_STATE_AUTONEG = 0x0 + ETHTOOL_LINK_EXT_STATE_LINK_TRAINING_FAILURE = 0x1 + ETHTOOL_LINK_EXT_STATE_LINK_LOGICAL_MISMATCH = 0x2 + ETHTOOL_LINK_EXT_STATE_BAD_SIGNAL_INTEGRITY = 0x3 + ETHTOOL_LINK_EXT_STATE_NO_CABLE = 0x4 + ETHTOOL_LINK_EXT_STATE_CABLE_ISSUE = 0x5 + ETHTOOL_LINK_EXT_STATE_EEPROM_ISSUE = 0x6 + ETHTOOL_LINK_EXT_STATE_CALIBRATION_FAILURE = 0x7 + ETHTOOL_LINK_EXT_STATE_POWER_BUDGET_EXCEEDED = 0x8 + ETHTOOL_LINK_EXT_STATE_OVERHEAT = 0x9 + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED = 0x1 + ETHTOOL_LINK_EXT_SUBSTATE_AN_ACK_NOT_RECEIVED = 0x2 + ETHTOOL_LINK_EXT_SUBSTATE_AN_NEXT_PAGE_EXCHANGE_FAILED = 0x3 + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_PARTNER_DETECTED_FORCE_MODE = 0x4 + ETHTOOL_LINK_EXT_SUBSTATE_AN_FEC_MISMATCH_DURING_OVERRIDE = 0x5 + ETHTOOL_LINK_EXT_SUBSTATE_AN_NO_HCD = 0x6 + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_FRAME_LOCK_NOT_ACQUIRED = 0x1 + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_INHIBIT_TIMEOUT = 0x2 + ETHTOOL_LINK_EXT_SUBSTATE_LT_KR_LINK_PARTNER_DID_NOT_SET_RECEIVER_READY = 0x3 + ETHTOOL_LINK_EXT_SUBSTATE_LT_REMOTE_FAULT = 0x4 + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_BLOCK_LOCK = 0x1 + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_ACQUIRE_AM_LOCK = 0x2 + ETHTOOL_LINK_EXT_SUBSTATE_LLM_PCS_DID_NOT_GET_ALIGN_STATUS = 0x3 + ETHTOOL_LINK_EXT_SUBSTATE_LLM_FC_FEC_IS_NOT_LOCKED = 0x4 + ETHTOOL_LINK_EXT_SUBSTATE_LLM_RS_FEC_IS_NOT_LOCKED = 0x5 + ETHTOOL_LINK_EXT_SUBSTATE_BSI_LARGE_NUMBER_OF_PHYSICAL_ERRORS = 0x1 + ETHTOOL_LINK_EXT_SUBSTATE_BSI_UNSUPPORTED_RATE = 0x2 + ETHTOOL_LINK_EXT_SUBSTATE_CI_UNSUPPORTED_CABLE = 0x1 + ETHTOOL_LINK_EXT_SUBSTATE_CI_CABLE_TEST_FAILURE = 0x2 + ETHTOOL_FLASH_ALL_REGIONS = 0x0 + ETHTOOL_F_UNSUPPORTED__BIT = 0x0 + ETHTOOL_F_WISH__BIT = 0x1 + ETHTOOL_F_COMPAT__BIT = 0x2 + ETHTOOL_FEC_NONE_BIT = 0x0 + ETHTOOL_FEC_AUTO_BIT = 0x1 + ETHTOOL_FEC_OFF_BIT = 0x2 + ETHTOOL_FEC_RS_BIT = 0x3 + ETHTOOL_FEC_BASER_BIT = 0x4 + ETHTOOL_FEC_LLRS_BIT = 0x5 + ETHTOOL_LINK_MODE_10baseT_Half_BIT = 0x0 + ETHTOOL_LINK_MODE_10baseT_Full_BIT = 0x1 + ETHTOOL_LINK_MODE_100baseT_Half_BIT = 0x2 + ETHTOOL_LINK_MODE_100baseT_Full_BIT = 0x3 + ETHTOOL_LINK_MODE_1000baseT_Half_BIT = 0x4 + ETHTOOL_LINK_MODE_1000baseT_Full_BIT = 0x5 + ETHTOOL_LINK_MODE_Autoneg_BIT = 0x6 + ETHTOOL_LINK_MODE_TP_BIT = 0x7 + ETHTOOL_LINK_MODE_AUI_BIT = 0x8 + ETHTOOL_LINK_MODE_MII_BIT = 0x9 + ETHTOOL_LINK_MODE_FIBRE_BIT = 0xa + ETHTOOL_LINK_MODE_BNC_BIT = 0xb + ETHTOOL_LINK_MODE_10000baseT_Full_BIT = 0xc + ETHTOOL_LINK_MODE_Pause_BIT = 0xd + ETHTOOL_LINK_MODE_Asym_Pause_BIT = 0xe + ETHTOOL_LINK_MODE_2500baseX_Full_BIT = 0xf + ETHTOOL_LINK_MODE_Backplane_BIT = 0x10 + ETHTOOL_LINK_MODE_1000baseKX_Full_BIT = 0x11 + ETHTOOL_LINK_MODE_10000baseKX4_Full_BIT = 0x12 + ETHTOOL_LINK_MODE_10000baseKR_Full_BIT = 0x13 + ETHTOOL_LINK_MODE_10000baseR_FEC_BIT = 0x14 + ETHTOOL_LINK_MODE_20000baseMLD2_Full_BIT = 0x15 + ETHTOOL_LINK_MODE_20000baseKR2_Full_BIT = 0x16 + ETHTOOL_LINK_MODE_40000baseKR4_Full_BIT = 0x17 + ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT = 0x18 + ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT = 0x19 + ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT = 0x1a + ETHTOOL_LINK_MODE_56000baseKR4_Full_BIT = 0x1b + ETHTOOL_LINK_MODE_56000baseCR4_Full_BIT = 0x1c + ETHTOOL_LINK_MODE_56000baseSR4_Full_BIT = 0x1d + ETHTOOL_LINK_MODE_56000baseLR4_Full_BIT = 0x1e + ETHTOOL_LINK_MODE_25000baseCR_Full_BIT = 0x1f + ETHTOOL_LINK_MODE_25000baseKR_Full_BIT = 0x20 + ETHTOOL_LINK_MODE_25000baseSR_Full_BIT = 0x21 + ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT = 0x22 + ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT = 0x23 + ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT = 0x24 + ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT = 0x25 + ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT = 0x26 + ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT = 0x27 + ETHTOOL_LINK_MODE_50000baseSR2_Full_BIT = 0x28 + ETHTOOL_LINK_MODE_1000baseX_Full_BIT = 0x29 + ETHTOOL_LINK_MODE_10000baseCR_Full_BIT = 0x2a + ETHTOOL_LINK_MODE_10000baseSR_Full_BIT = 0x2b + ETHTOOL_LINK_MODE_10000baseLR_Full_BIT = 0x2c + ETHTOOL_LINK_MODE_10000baseLRM_Full_BIT = 0x2d + ETHTOOL_LINK_MODE_10000baseER_Full_BIT = 0x2e + ETHTOOL_LINK_MODE_2500baseT_Full_BIT = 0x2f + ETHTOOL_LINK_MODE_5000baseT_Full_BIT = 0x30 + ETHTOOL_LINK_MODE_FEC_NONE_BIT = 0x31 + ETHTOOL_LINK_MODE_FEC_RS_BIT = 0x32 + ETHTOOL_LINK_MODE_FEC_BASER_BIT = 0x33 + ETHTOOL_LINK_MODE_50000baseKR_Full_BIT = 0x34 + ETHTOOL_LINK_MODE_50000baseSR_Full_BIT = 0x35 + ETHTOOL_LINK_MODE_50000baseCR_Full_BIT = 0x36 + ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT = 0x37 + ETHTOOL_LINK_MODE_50000baseDR_Full_BIT = 0x38 + ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT = 0x39 + ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT = 0x3a + ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT = 0x3b + ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT = 0x3c + ETHTOOL_LINK_MODE_100000baseDR2_Full_BIT = 0x3d + ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT = 0x3e + ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT = 0x3f + ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT = 0x40 + ETHTOOL_LINK_MODE_200000baseDR4_Full_BIT = 0x41 + ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT = 0x42 + ETHTOOL_LINK_MODE_100baseT1_Full_BIT = 0x43 + ETHTOOL_LINK_MODE_1000baseT1_Full_BIT = 0x44 + ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT = 0x45 + ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT = 0x46 + ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT = 0x47 + ETHTOOL_LINK_MODE_400000baseDR8_Full_BIT = 0x48 + ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT = 0x49 + ETHTOOL_LINK_MODE_FEC_LLRS_BIT = 0x4a + ETHTOOL_LINK_MODE_100000baseKR_Full_BIT = 0x4b + ETHTOOL_LINK_MODE_100000baseSR_Full_BIT = 0x4c + ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT = 0x4d + ETHTOOL_LINK_MODE_100000baseCR_Full_BIT = 0x4e + ETHTOOL_LINK_MODE_100000baseDR_Full_BIT = 0x4f + ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT = 0x50 + ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT = 0x51 + ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT = 0x52 + ETHTOOL_LINK_MODE_200000baseDR2_Full_BIT = 0x53 + ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT = 0x54 + ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT = 0x55 + ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT = 0x56 + ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT = 0x57 + ETHTOOL_LINK_MODE_400000baseDR4_Full_BIT = 0x58 + ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT = 0x59 + ETHTOOL_LINK_MODE_100baseFX_Half_BIT = 0x5a + ETHTOOL_LINK_MODE_100baseFX_Full_BIT = 0x5b + + ETHTOOL_MSG_USER_NONE = 0x0 + ETHTOOL_MSG_STRSET_GET = 0x1 + ETHTOOL_MSG_LINKINFO_GET = 0x2 + ETHTOOL_MSG_LINKINFO_SET = 0x3 + ETHTOOL_MSG_LINKMODES_GET = 0x4 + ETHTOOL_MSG_LINKMODES_SET = 0x5 + ETHTOOL_MSG_LINKSTATE_GET = 0x6 + ETHTOOL_MSG_DEBUG_GET = 0x7 + ETHTOOL_MSG_DEBUG_SET = 0x8 + ETHTOOL_MSG_WOL_GET = 0x9 + ETHTOOL_MSG_WOL_SET = 0xa + ETHTOOL_MSG_FEATURES_GET = 0xb + ETHTOOL_MSG_FEATURES_SET = 0xc + ETHTOOL_MSG_PRIVFLAGS_GET = 0xd + ETHTOOL_MSG_PRIVFLAGS_SET = 0xe + ETHTOOL_MSG_RINGS_GET = 0xf + ETHTOOL_MSG_RINGS_SET = 0x10 + ETHTOOL_MSG_CHANNELS_GET = 0x11 + ETHTOOL_MSG_CHANNELS_SET = 0x12 + ETHTOOL_MSG_COALESCE_GET = 0x13 + ETHTOOL_MSG_COALESCE_SET = 0x14 + ETHTOOL_MSG_PAUSE_GET = 0x15 + ETHTOOL_MSG_PAUSE_SET = 0x16 + ETHTOOL_MSG_EEE_GET = 0x17 + ETHTOOL_MSG_EEE_SET = 0x18 + ETHTOOL_MSG_TSINFO_GET = 0x19 + ETHTOOL_MSG_CABLE_TEST_ACT = 0x1a + ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 0x1b + ETHTOOL_MSG_TUNNEL_INFO_GET = 0x1c + ETHTOOL_MSG_USER_MAX = 0x1c + ETHTOOL_MSG_KERNEL_NONE = 0x0 + ETHTOOL_MSG_STRSET_GET_REPLY = 0x1 + ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2 + ETHTOOL_MSG_LINKINFO_NTF = 0x3 + ETHTOOL_MSG_LINKMODES_GET_REPLY = 0x4 + ETHTOOL_MSG_LINKMODES_NTF = 0x5 + ETHTOOL_MSG_LINKSTATE_GET_REPLY = 0x6 + ETHTOOL_MSG_DEBUG_GET_REPLY = 0x7 + ETHTOOL_MSG_DEBUG_NTF = 0x8 + ETHTOOL_MSG_WOL_GET_REPLY = 0x9 + ETHTOOL_MSG_WOL_NTF = 0xa + ETHTOOL_MSG_FEATURES_GET_REPLY = 0xb + ETHTOOL_MSG_FEATURES_SET_REPLY = 0xc + ETHTOOL_MSG_FEATURES_NTF = 0xd + ETHTOOL_MSG_PRIVFLAGS_GET_REPLY = 0xe + ETHTOOL_MSG_PRIVFLAGS_NTF = 0xf + ETHTOOL_MSG_RINGS_GET_REPLY = 0x10 + ETHTOOL_MSG_RINGS_NTF = 0x11 + ETHTOOL_MSG_CHANNELS_GET_REPLY = 0x12 + ETHTOOL_MSG_CHANNELS_NTF = 0x13 + ETHTOOL_MSG_COALESCE_GET_REPLY = 0x14 + ETHTOOL_MSG_COALESCE_NTF = 0x15 + ETHTOOL_MSG_PAUSE_GET_REPLY = 0x16 + ETHTOOL_MSG_PAUSE_NTF = 0x17 + ETHTOOL_MSG_EEE_GET_REPLY = 0x18 + ETHTOOL_MSG_EEE_NTF = 0x19 + ETHTOOL_MSG_TSINFO_GET_REPLY = 0x1a + ETHTOOL_MSG_CABLE_TEST_NTF = 0x1b + ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 0x1c + ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 0x1d + ETHTOOL_MSG_KERNEL_MAX = 0x1d + ETHTOOL_A_HEADER_UNSPEC = 0x0 + ETHTOOL_A_HEADER_DEV_INDEX = 0x1 + ETHTOOL_A_HEADER_DEV_NAME = 0x2 + ETHTOOL_A_HEADER_FLAGS = 0x3 + ETHTOOL_A_HEADER_MAX = 0x3 + ETHTOOL_A_BITSET_BIT_UNSPEC = 0x0 + ETHTOOL_A_BITSET_BIT_INDEX = 0x1 + ETHTOOL_A_BITSET_BIT_NAME = 0x2 + ETHTOOL_A_BITSET_BIT_VALUE = 0x3 + ETHTOOL_A_BITSET_BIT_MAX = 0x3 + ETHTOOL_A_BITSET_BITS_UNSPEC = 0x0 + ETHTOOL_A_BITSET_BITS_BIT = 0x1 + ETHTOOL_A_BITSET_BITS_MAX = 0x1 + ETHTOOL_A_BITSET_UNSPEC = 0x0 + ETHTOOL_A_BITSET_NOMASK = 0x1 + ETHTOOL_A_BITSET_SIZE = 0x2 + ETHTOOL_A_BITSET_BITS = 0x3 + ETHTOOL_A_BITSET_VALUE = 0x4 + ETHTOOL_A_BITSET_MASK = 0x5 + ETHTOOL_A_BITSET_MAX = 0x5 + ETHTOOL_A_STRING_UNSPEC = 0x0 + ETHTOOL_A_STRING_INDEX = 0x1 + ETHTOOL_A_STRING_VALUE = 0x2 + ETHTOOL_A_STRING_MAX = 0x2 + ETHTOOL_A_STRINGS_UNSPEC = 0x0 + ETHTOOL_A_STRINGS_STRING = 0x1 + ETHTOOL_A_STRINGS_MAX = 0x1 + ETHTOOL_A_STRINGSET_UNSPEC = 0x0 + ETHTOOL_A_STRINGSET_ID = 0x1 + ETHTOOL_A_STRINGSET_COUNT = 0x2 + ETHTOOL_A_STRINGSET_STRINGS = 0x3 + ETHTOOL_A_STRINGSET_MAX = 0x3 + ETHTOOL_A_STRINGSETS_UNSPEC = 0x0 + ETHTOOL_A_STRINGSETS_STRINGSET = 0x1 + ETHTOOL_A_STRINGSETS_MAX = 0x1 + ETHTOOL_A_STRSET_UNSPEC = 0x0 + ETHTOOL_A_STRSET_HEADER = 0x1 + ETHTOOL_A_STRSET_STRINGSETS = 0x2 + ETHTOOL_A_STRSET_COUNTS_ONLY = 0x3 + ETHTOOL_A_STRSET_MAX = 0x3 + ETHTOOL_A_LINKINFO_UNSPEC = 0x0 + ETHTOOL_A_LINKINFO_HEADER = 0x1 + ETHTOOL_A_LINKINFO_PORT = 0x2 + ETHTOOL_A_LINKINFO_PHYADDR = 0x3 + ETHTOOL_A_LINKINFO_TP_MDIX = 0x4 + ETHTOOL_A_LINKINFO_TP_MDIX_CTRL = 0x5 + ETHTOOL_A_LINKINFO_TRANSCEIVER = 0x6 + ETHTOOL_A_LINKINFO_MAX = 0x6 + ETHTOOL_A_LINKMODES_UNSPEC = 0x0 + ETHTOOL_A_LINKMODES_HEADER = 0x1 + ETHTOOL_A_LINKMODES_AUTONEG = 0x2 + ETHTOOL_A_LINKMODES_OURS = 0x3 + ETHTOOL_A_LINKMODES_PEER = 0x4 + ETHTOOL_A_LINKMODES_SPEED = 0x5 + ETHTOOL_A_LINKMODES_DUPLEX = 0x6 + ETHTOOL_A_LINKMODES_MASTER_SLAVE_CFG = 0x7 + ETHTOOL_A_LINKMODES_MASTER_SLAVE_STATE = 0x8 + ETHTOOL_A_LINKMODES_MAX = 0x8 + ETHTOOL_A_LINKSTATE_UNSPEC = 0x0 + ETHTOOL_A_LINKSTATE_HEADER = 0x1 + ETHTOOL_A_LINKSTATE_LINK = 0x2 + ETHTOOL_A_LINKSTATE_SQI = 0x3 + ETHTOOL_A_LINKSTATE_SQI_MAX = 0x4 + ETHTOOL_A_LINKSTATE_EXT_STATE = 0x5 + ETHTOOL_A_LINKSTATE_EXT_SUBSTATE = 0x6 + ETHTOOL_A_LINKSTATE_MAX = 0x6 + ETHTOOL_A_DEBUG_UNSPEC = 0x0 + ETHTOOL_A_DEBUG_HEADER = 0x1 + ETHTOOL_A_DEBUG_MSGMASK = 0x2 + ETHTOOL_A_DEBUG_MAX = 0x2 + ETHTOOL_A_WOL_UNSPEC = 0x0 + ETHTOOL_A_WOL_HEADER = 0x1 + ETHTOOL_A_WOL_MODES = 0x2 + ETHTOOL_A_WOL_SOPASS = 0x3 + ETHTOOL_A_WOL_MAX = 0x3 + ETHTOOL_A_FEATURES_UNSPEC = 0x0 + ETHTOOL_A_FEATURES_HEADER = 0x1 + ETHTOOL_A_FEATURES_HW = 0x2 + ETHTOOL_A_FEATURES_WANTED = 0x3 + ETHTOOL_A_FEATURES_ACTIVE = 0x4 + ETHTOOL_A_FEATURES_NOCHANGE = 0x5 + ETHTOOL_A_FEATURES_MAX = 0x5 + ETHTOOL_A_PRIVFLAGS_UNSPEC = 0x0 + ETHTOOL_A_PRIVFLAGS_HEADER = 0x1 + ETHTOOL_A_PRIVFLAGS_FLAGS = 0x2 + ETHTOOL_A_PRIVFLAGS_MAX = 0x2 + ETHTOOL_A_RINGS_UNSPEC = 0x0 + ETHTOOL_A_RINGS_HEADER = 0x1 + ETHTOOL_A_RINGS_RX_MAX = 0x2 + ETHTOOL_A_RINGS_RX_MINI_MAX = 0x3 + ETHTOOL_A_RINGS_RX_JUMBO_MAX = 0x4 + ETHTOOL_A_RINGS_TX_MAX = 0x5 + ETHTOOL_A_RINGS_RX = 0x6 + ETHTOOL_A_RINGS_RX_MINI = 0x7 + ETHTOOL_A_RINGS_RX_JUMBO = 0x8 + ETHTOOL_A_RINGS_TX = 0x9 + ETHTOOL_A_RINGS_MAX = 0x9 + ETHTOOL_A_CHANNELS_UNSPEC = 0x0 + ETHTOOL_A_CHANNELS_HEADER = 0x1 + ETHTOOL_A_CHANNELS_RX_MAX = 0x2 + ETHTOOL_A_CHANNELS_TX_MAX = 0x3 + ETHTOOL_A_CHANNELS_OTHER_MAX = 0x4 + ETHTOOL_A_CHANNELS_COMBINED_MAX = 0x5 + ETHTOOL_A_CHANNELS_RX_COUNT = 0x6 + ETHTOOL_A_CHANNELS_TX_COUNT = 0x7 + ETHTOOL_A_CHANNELS_OTHER_COUNT = 0x8 + ETHTOOL_A_CHANNELS_COMBINED_COUNT = 0x9 + ETHTOOL_A_CHANNELS_MAX = 0x9 + ETHTOOL_A_COALESCE_UNSPEC = 0x0 + ETHTOOL_A_COALESCE_HEADER = 0x1 + ETHTOOL_A_COALESCE_RX_USECS = 0x2 + ETHTOOL_A_COALESCE_RX_MAX_FRAMES = 0x3 + ETHTOOL_A_COALESCE_RX_USECS_IRQ = 0x4 + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ = 0x5 + ETHTOOL_A_COALESCE_TX_USECS = 0x6 + ETHTOOL_A_COALESCE_TX_MAX_FRAMES = 0x7 + ETHTOOL_A_COALESCE_TX_USECS_IRQ = 0x8 + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ = 0x9 + ETHTOOL_A_COALESCE_STATS_BLOCK_USECS = 0xa + ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX = 0xb + ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX = 0xc + ETHTOOL_A_COALESCE_PKT_RATE_LOW = 0xd + ETHTOOL_A_COALESCE_RX_USECS_LOW = 0xe + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW = 0xf + ETHTOOL_A_COALESCE_TX_USECS_LOW = 0x10 + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW = 0x11 + ETHTOOL_A_COALESCE_PKT_RATE_HIGH = 0x12 + ETHTOOL_A_COALESCE_RX_USECS_HIGH = 0x13 + ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH = 0x14 + ETHTOOL_A_COALESCE_TX_USECS_HIGH = 0x15 + ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH = 0x16 + ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 0x17 + ETHTOOL_A_COALESCE_MAX = 0x17 + ETHTOOL_A_PAUSE_UNSPEC = 0x0 + ETHTOOL_A_PAUSE_HEADER = 0x1 + ETHTOOL_A_PAUSE_AUTONEG = 0x2 + ETHTOOL_A_PAUSE_RX = 0x3 + ETHTOOL_A_PAUSE_TX = 0x4 + ETHTOOL_A_PAUSE_STATS = 0x5 + ETHTOOL_A_PAUSE_MAX = 0x5 + ETHTOOL_A_PAUSE_STAT_UNSPEC = 0x0 + ETHTOOL_A_PAUSE_STAT_PAD = 0x1 + ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 0x2 + ETHTOOL_A_PAUSE_STAT_RX_FRAMES = 0x3 + ETHTOOL_A_PAUSE_STAT_MAX = 0x3 + ETHTOOL_A_EEE_UNSPEC = 0x0 + ETHTOOL_A_EEE_HEADER = 0x1 + ETHTOOL_A_EEE_MODES_OURS = 0x2 + ETHTOOL_A_EEE_MODES_PEER = 0x3 + ETHTOOL_A_EEE_ACTIVE = 0x4 + ETHTOOL_A_EEE_ENABLED = 0x5 + ETHTOOL_A_EEE_TX_LPI_ENABLED = 0x6 + ETHTOOL_A_EEE_TX_LPI_TIMER = 0x7 + ETHTOOL_A_EEE_MAX = 0x7 + ETHTOOL_A_TSINFO_UNSPEC = 0x0 + ETHTOOL_A_TSINFO_HEADER = 0x1 + ETHTOOL_A_TSINFO_TIMESTAMPING = 0x2 + ETHTOOL_A_TSINFO_TX_TYPES = 0x3 + ETHTOOL_A_TSINFO_RX_FILTERS = 0x4 + ETHTOOL_A_TSINFO_PHC_INDEX = 0x5 + ETHTOOL_A_TSINFO_MAX = 0x5 + ETHTOOL_A_CABLE_TEST_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_HEADER = 0x1 + ETHTOOL_A_CABLE_TEST_MAX = 0x1 + ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC = 0x0 + ETHTOOL_A_CABLE_RESULT_CODE_OK = 0x1 + ETHTOOL_A_CABLE_RESULT_CODE_OPEN = 0x2 + ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT = 0x3 + ETHTOOL_A_CABLE_RESULT_CODE_CROSS_SHORT = 0x4 + ETHTOOL_A_CABLE_PAIR_A = 0x0 + ETHTOOL_A_CABLE_PAIR_B = 0x1 + ETHTOOL_A_CABLE_PAIR_C = 0x2 + ETHTOOL_A_CABLE_PAIR_D = 0x3 + ETHTOOL_A_CABLE_RESULT_UNSPEC = 0x0 + ETHTOOL_A_CABLE_RESULT_PAIR = 0x1 + ETHTOOL_A_CABLE_RESULT_CODE = 0x2 + ETHTOOL_A_CABLE_RESULT_MAX = 0x2 + ETHTOOL_A_CABLE_FAULT_LENGTH_UNSPEC = 0x0 + ETHTOOL_A_CABLE_FAULT_LENGTH_PAIR = 0x1 + ETHTOOL_A_CABLE_FAULT_LENGTH_CM = 0x2 + ETHTOOL_A_CABLE_FAULT_LENGTH_MAX = 0x2 + ETHTOOL_A_CABLE_TEST_NTF_STATUS_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_NTF_STATUS_STARTED = 0x1 + ETHTOOL_A_CABLE_TEST_NTF_STATUS_COMPLETED = 0x2 + ETHTOOL_A_CABLE_NEST_UNSPEC = 0x0 + ETHTOOL_A_CABLE_NEST_RESULT = 0x1 + ETHTOOL_A_CABLE_NEST_FAULT_LENGTH = 0x2 + ETHTOOL_A_CABLE_NEST_MAX = 0x2 + ETHTOOL_A_CABLE_TEST_NTF_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_NTF_HEADER = 0x1 + ETHTOOL_A_CABLE_TEST_NTF_STATUS = 0x2 + ETHTOOL_A_CABLE_TEST_NTF_NEST = 0x3 + ETHTOOL_A_CABLE_TEST_NTF_MAX = 0x3 + ETHTOOL_A_CABLE_TEST_TDR_CFG_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST = 0x1 + ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST = 0x2 + ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP = 0x3 + ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR = 0x4 + ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX = 0x4 + ETHTOOL_A_CABLE_TEST_TDR_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_TDR_HEADER = 0x1 + ETHTOOL_A_CABLE_TEST_TDR_CFG = 0x2 + ETHTOOL_A_CABLE_TEST_TDR_MAX = 0x2 + ETHTOOL_A_CABLE_AMPLITUDE_UNSPEC = 0x0 + ETHTOOL_A_CABLE_AMPLITUDE_PAIR = 0x1 + ETHTOOL_A_CABLE_AMPLITUDE_mV = 0x2 + ETHTOOL_A_CABLE_AMPLITUDE_MAX = 0x2 + ETHTOOL_A_CABLE_PULSE_UNSPEC = 0x0 + ETHTOOL_A_CABLE_PULSE_mV = 0x1 + ETHTOOL_A_CABLE_PULSE_MAX = 0x1 + ETHTOOL_A_CABLE_STEP_UNSPEC = 0x0 + ETHTOOL_A_CABLE_STEP_FIRST_DISTANCE = 0x1 + ETHTOOL_A_CABLE_STEP_LAST_DISTANCE = 0x2 + ETHTOOL_A_CABLE_STEP_STEP_DISTANCE = 0x3 + ETHTOOL_A_CABLE_STEP_MAX = 0x3 + ETHTOOL_A_CABLE_TDR_NEST_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TDR_NEST_STEP = 0x1 + ETHTOOL_A_CABLE_TDR_NEST_AMPLITUDE = 0x2 + ETHTOOL_A_CABLE_TDR_NEST_PULSE = 0x3 + ETHTOOL_A_CABLE_TDR_NEST_MAX = 0x3 + ETHTOOL_A_CABLE_TEST_TDR_NTF_UNSPEC = 0x0 + ETHTOOL_A_CABLE_TEST_TDR_NTF_HEADER = 0x1 + ETHTOOL_A_CABLE_TEST_TDR_NTF_STATUS = 0x2 + ETHTOOL_A_CABLE_TEST_TDR_NTF_NEST = 0x3 + ETHTOOL_A_CABLE_TEST_TDR_NTF_MAX = 0x3 + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN = 0x0 + ETHTOOL_UDP_TUNNEL_TYPE_GENEVE = 0x1 + ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE = 0x2 + ETHTOOL_A_TUNNEL_UDP_ENTRY_UNSPEC = 0x0 + ETHTOOL_A_TUNNEL_UDP_ENTRY_PORT = 0x1 + ETHTOOL_A_TUNNEL_UDP_ENTRY_TYPE = 0x2 + ETHTOOL_A_TUNNEL_UDP_ENTRY_MAX = 0x2 + ETHTOOL_A_TUNNEL_UDP_TABLE_UNSPEC = 0x0 + ETHTOOL_A_TUNNEL_UDP_TABLE_SIZE = 0x1 + ETHTOOL_A_TUNNEL_UDP_TABLE_TYPES = 0x2 + ETHTOOL_A_TUNNEL_UDP_TABLE_ENTRY = 0x3 + ETHTOOL_A_TUNNEL_UDP_TABLE_MAX = 0x3 + ETHTOOL_A_TUNNEL_UDP_UNSPEC = 0x0 + ETHTOOL_A_TUNNEL_UDP_TABLE = 0x1 + ETHTOOL_A_TUNNEL_UDP_MAX = 0x1 + ETHTOOL_A_TUNNEL_INFO_UNSPEC = 0x0 + ETHTOOL_A_TUNNEL_INFO_HEADER = 0x1 + ETHTOOL_A_TUNNEL_INFO_UDP_PORTS = 0x2 + ETHTOOL_A_TUNNEL_INFO_MAX = 0x2 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index d54618aa61..088bd77e3b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m32 /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build 386,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 741d25be95..078d958ec9 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -m64 /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build amd64,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index e8d982c3df..2d39122f41 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 311cf2155d..304cbd0453 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build arm64,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index 1312bdf77f..7d9d57006a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 2a99348195..a1eb2577b0 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index f964307b29..2e5ce3b6a6 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build mips64le,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index ca0fab2702..bbaa1200b6 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build mipsle,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 257e004247..0e6e8a7748 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 980dd31736..7382f385fa 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build ppc64le,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index d9fdab20b8..28d5522166 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build riscv64,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index c25de8c679..a91a7a44bd 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include -fsigned-char /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build s390x,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 97fca65340..f824b2358d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -1,4 +1,4 @@ -// cgo -godefs -- -Wall -Werror -static -I/tmp/include linux/types.go | go run mkpost.go +// cgo -godefs -- -Wall -Werror -static -I/tmp/include /build/linux/types.go | go run mkpost.go // Code generated by the command above; see README.md. DO NOT EDIT. // +build sparc64,linux diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go index a89100c08a..3f11f88e3c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -248,6 +248,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofLinger = 0x8 + SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go index 289184e0b3..0bed83af57 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -255,6 +255,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go index 428c450e4c..e4e3bf736d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -253,6 +253,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofLinger = 0x8 + SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c diff --git a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go index 6f1f2842cc..efac861bb7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go @@ -255,6 +255,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x14 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go index 61ea0019a2..80fa295f1d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -231,6 +231,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x20 SizeofLinger = 0x8 + SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go index 87a493f68f..560dd6d08a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -235,6 +235,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x20 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go index d80836efab..0c1700fa43 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go @@ -235,6 +235,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x20 SizeofLinger = 0x8 + SizeofIovec = 0x8 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x1c diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go index 4e158746f1..5b3e46633e 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_arm64.go @@ -231,6 +231,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x20 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 diff --git a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go index 992a1f8c01..62bff16709 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_openbsd_mips64.go @@ -231,6 +231,7 @@ const ( SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x20 SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go index db817f3ba8..ca512aff7f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -234,6 +234,7 @@ const ( SizeofSockaddrUnix = 0x6e SizeofSockaddrDatalink = 0xfc SizeofLinger = 0x8 + SizeofIovec = 0x10 SizeofIPMreq = 0x8 SizeofIPv6Mreq = 0x14 SizeofMsghdr = 0x30 diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go index f54ff90aac..b269850d06 100644 --- a/vendor/golang.org/x/sys/windows/service.go +++ b/vendor/golang.org/x/sys/windows/service.go @@ -128,6 +128,10 @@ const ( SERVICE_NOTIFY_CREATED = 0x00000080 SERVICE_NOTIFY_DELETED = 0x00000100 SERVICE_NOTIFY_DELETE_PENDING = 0x00000200 + + SC_EVENT_DATABASE_CHANGE = 0 + SC_EVENT_PROPERTY_CHANGE = 1 + SC_EVENT_STATUS_CHANGE = 2 ) type SERVICE_STATUS struct { @@ -229,3 +233,5 @@ type QUERY_SERVICE_LOCK_STATUS struct { //sys EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW //sys QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceStatusEx //sys NotifyServiceStatusChange(service Handle, notifyMask uint32, notifier *SERVICE_NOTIFY) (ret error) = advapi32.NotifyServiceStatusChangeW +//sys SubscribeServiceChangeNotifications(service Handle, eventType uint32, callback uintptr, callbackCtx uintptr, subscription *uintptr) (ret error) = sechost.SubscribeServiceChangeNotifications? +//sys UnsubscribeServiceChangeNotifications(subscription uintptr) = sechost.UnsubscribeServiceChangeNotifications? diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index c71bad127d..d249919c30 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -18,6 +18,7 @@ import ( ) type Handle uintptr +type HWND uintptr const ( InvalidHandle = ^Handle(0) @@ -214,6 +215,10 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW //sys OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) //sys ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) [failretval<=32] = shell32.ShellExecuteW +//sys GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32) = user32.GetWindowThreadProcessId +//sys GetShellWindow() (shellWindow HWND) = user32.GetShellWindow +//sys MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW +//sys ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx //sys shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath //sys TerminateProcess(handle Handle, exitcode uint32) (err error) //sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) @@ -265,6 +270,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore //sys CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore //sys CertDeleteCertificateFromStore(certContext *CertContext) (err error) = crypt32.CertDeleteCertificateFromStore +//sys CertDuplicateCertificateContext(certContext *CertContext) (dupContext *CertContext) = crypt32.CertDuplicateCertificateContext +//sys PFXImportCertStore(pfx *CryptDataBlob, password *uint16, flags uint32) (store Handle, err error) = crypt32.PFXImportCertStore //sys CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain //sys CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain //sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext @@ -275,6 +282,7 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW //sys RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW //sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW +//sys RegNotifyChangeKeyValue(key Handle, watchSubtree bool, notifyFilter uint32, event Handle, asynchronous bool) (regerrno error) = advapi32.RegNotifyChangeKeyValue //sys GetCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId //sys ProcessIdToSessionId(pid uint32, sessionid *uint32) (err error) = kernel32.ProcessIdToSessionId //sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode @@ -341,8 +349,6 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) [failretval==0] = QueryDosDeviceW //sys SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW //sys SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW -//sys MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW -//sys ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx //sys InitiateSystemShutdownEx(machineName *uint16, message *uint16, timeout uint32, forceAppsClosed bool, rebootAfterShutdown bool, reason uint32) (err error) = advapi32.InitiateSystemShutdownExW //sys SetProcessShutdownParameters(level uint32, flags uint32) (err error) = kernel32.SetProcessShutdownParameters //sys GetProcessShutdownParameters(level *uint32, flags *uint32) (err error) = kernel32.GetProcessShutdownParameters diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index 265d797cac..b3bd0da427 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -249,24 +249,27 @@ const ( const ( // wincrypt.h - PROV_RSA_FULL = 1 - PROV_RSA_SIG = 2 - PROV_DSS = 3 - PROV_FORTEZZA = 4 - PROV_MS_EXCHANGE = 5 - PROV_SSL = 6 - PROV_RSA_SCHANNEL = 12 - PROV_DSS_DH = 13 - PROV_EC_ECDSA_SIG = 14 - PROV_EC_ECNRA_SIG = 15 - PROV_EC_ECDSA_FULL = 16 - PROV_EC_ECNRA_FULL = 17 - PROV_DH_SCHANNEL = 18 - PROV_SPYRUS_LYNKS = 20 - PROV_RNG = 21 - PROV_INTEL_SEC = 22 - PROV_REPLACE_OWF = 23 - PROV_RSA_AES = 24 + /* certenrolld_begin -- PROV_RSA_*/ + PROV_RSA_FULL = 1 + PROV_RSA_SIG = 2 + PROV_DSS = 3 + PROV_FORTEZZA = 4 + PROV_MS_EXCHANGE = 5 + PROV_SSL = 6 + PROV_RSA_SCHANNEL = 12 + PROV_DSS_DH = 13 + PROV_EC_ECDSA_SIG = 14 + PROV_EC_ECNRA_SIG = 15 + PROV_EC_ECDSA_FULL = 16 + PROV_EC_ECNRA_FULL = 17 + PROV_DH_SCHANNEL = 18 + PROV_SPYRUS_LYNKS = 20 + PROV_RNG = 21 + PROV_INTEL_SEC = 22 + PROV_REPLACE_OWF = 23 + PROV_RSA_AES = 24 + + /* dwFlags definitions for CryptAcquireContext */ CRYPT_VERIFYCONTEXT = 0xF0000000 CRYPT_NEWKEYSET = 0x00000008 CRYPT_DELETEKEYSET = 0x00000010 @@ -274,6 +277,17 @@ const ( CRYPT_SILENT = 0x00000040 CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080 + /* Flags for PFXImportCertStore */ + CRYPT_EXPORTABLE = 0x00000001 + CRYPT_USER_PROTECTED = 0x00000002 + CRYPT_USER_KEYSET = 0x00001000 + PKCS12_PREFER_CNG_KSP = 0x00000100 + PKCS12_ALWAYS_CNG_KSP = 0x00000200 + PKCS12_ALLOW_OVERWRITE_KEY = 0x00004000 + PKCS12_NO_PERSIST_KEY = 0x00008000 + PKCS12_INCLUDE_EXTENDED_PROPERTIES = 0x00000010 + + /* Default usage match type is AND with value zero */ USAGE_MATCH_TYPE_AND = 0 USAGE_MATCH_TYPE_OR = 1 @@ -409,6 +423,10 @@ const ( CERT_CHAIN_POLICY_EV = 8 CERT_CHAIN_POLICY_SSL_F12 = 9 + /* Certificate Store close flags */ + CERT_CLOSE_STORE_FORCE_FLAG = 0x00000001 + CERT_CLOSE_STORE_CHECK_FLAG = 0x00000002 + /* AuthType values for SSLExtraCertChainPolicyPara struct */ AUTHTYPE_CLIENT = 1 AUTHTYPE_SERVER = 2 @@ -1139,6 +1157,11 @@ type CertChainPolicyStatus struct { ExtraPolicyStatus Pointer } +type CryptDataBlob struct { + Size uint32 + Data *byte +} + const ( // do not reorder HKEY_CLASSES_ROOT = 0x80000000 + iota @@ -1820,3 +1843,21 @@ const ( LOAD_LIBRARY_SEARCH_SYSTEM32_NO_FORWARDER = 0x00004000 LOAD_LIBRARY_OS_INTEGRITY_CONTINUITY = 0x00008000 ) + +// RegNotifyChangeKeyValue notifyFilter flags. +const ( + // REG_NOTIFY_CHANGE_NAME notifies the caller if a subkey is added or deleted. + REG_NOTIFY_CHANGE_NAME = 0x00000001 + + // REG_NOTIFY_CHANGE_ATTRIBUTES notifies the caller of changes to the attributes of the key, such as the security descriptor information. + REG_NOTIFY_CHANGE_ATTRIBUTES = 0x00000002 + + // REG_NOTIFY_CHANGE_LAST_SET notifies the caller of changes to a value of the key. This can include adding or deleting a value, or changing an existing value. + REG_NOTIFY_CHANGE_LAST_SET = 0x00000004 + + // REG_NOTIFY_CHANGE_SECURITY notifies the caller of changes to the security descriptor of the key. + REG_NOTIFY_CHANGE_SECURITY = 0x00000008 + + // REG_NOTIFY_THREAD_AGNOSTIC indicates that the lifetime of the registration must not be tied to the lifetime of the thread issuing the RegNotifyChangeKeyValue call. Note: This flag value is only supported in Windows 8 and later. + REG_NOTIFY_THREAD_AGNOSTIC = 0x10000000 +) diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index 03e9f182e4..cd5e8528cd 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -46,6 +46,7 @@ var ( modntdll = NewLazySystemDLL("ntdll.dll") modole32 = NewLazySystemDLL("ole32.dll") modpsapi = NewLazySystemDLL("psapi.dll") + modsechost = NewLazySystemDLL("sechost.dll") modsecur32 = NewLazySystemDLL("secur32.dll") modshell32 = NewLazySystemDLL("shell32.dll") moduser32 = NewLazySystemDLL("user32.dll") @@ -116,6 +117,7 @@ var ( procQueryServiceStatusEx = modadvapi32.NewProc("QueryServiceStatusEx") procRegCloseKey = modadvapi32.NewProc("RegCloseKey") procRegEnumKeyExW = modadvapi32.NewProc("RegEnumKeyExW") + procRegNotifyChangeKeyValue = modadvapi32.NewProc("RegNotifyChangeKeyValue") procRegOpenKeyExW = modadvapi32.NewProc("RegOpenKeyExW") procRegQueryInfoKeyW = modadvapi32.NewProc("RegQueryInfoKeyW") procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW") @@ -141,6 +143,7 @@ var ( procCertCloseStore = modcrypt32.NewProc("CertCloseStore") procCertCreateCertificateContext = modcrypt32.NewProc("CertCreateCertificateContext") procCertDeleteCertificateFromStore = modcrypt32.NewProc("CertDeleteCertificateFromStore") + procCertDuplicateCertificateContext = modcrypt32.NewProc("CertDuplicateCertificateContext") procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore") procCertFreeCertificateChain = modcrypt32.NewProc("CertFreeCertificateChain") procCertFreeCertificateContext = modcrypt32.NewProc("CertFreeCertificateContext") @@ -148,6 +151,7 @@ var ( procCertOpenStore = modcrypt32.NewProc("CertOpenStore") procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW") procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy") + procPFXImportCertStore = modcrypt32.NewProc("PFXImportCertStore") procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W") procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W") procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree") @@ -329,12 +333,16 @@ var ( procCoTaskMemFree = modole32.NewProc("CoTaskMemFree") procStringFromGUID2 = modole32.NewProc("StringFromGUID2") procEnumProcesses = modpsapi.NewProc("EnumProcesses") + procSubscribeServiceChangeNotifications = modsechost.NewProc("SubscribeServiceChangeNotifications") + procUnsubscribeServiceChangeNotifications = modsechost.NewProc("UnsubscribeServiceChangeNotifications") procGetUserNameExW = modsecur32.NewProc("GetUserNameExW") procTranslateNameW = modsecur32.NewProc("TranslateNameW") procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW") procSHGetKnownFolderPath = modshell32.NewProc("SHGetKnownFolderPath") procShellExecuteW = modshell32.NewProc("ShellExecuteW") procExitWindowsEx = moduser32.NewProc("ExitWindowsEx") + procGetShellWindow = moduser32.NewProc("GetShellWindow") + procGetWindowThreadProcessId = moduser32.NewProc("GetWindowThreadProcessId") procMessageBoxW = moduser32.NewProc("MessageBoxW") procCreateEnvironmentBlock = moduserenv.NewProc("CreateEnvironmentBlock") procDestroyEnvironmentBlock = moduserenv.NewProc("DestroyEnvironmentBlock") @@ -928,6 +936,22 @@ func RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reser return } +func RegNotifyChangeKeyValue(key Handle, watchSubtree bool, notifyFilter uint32, event Handle, asynchronous bool) (regerrno error) { + var _p0 uint32 + if watchSubtree { + _p0 = 1 + } + var _p1 uint32 + if asynchronous { + _p1 = 1 + } + r0, _, _ := syscall.Syscall6(procRegNotifyChangeKeyValue.Addr(), 5, uintptr(key), uintptr(_p0), uintptr(notifyFilter), uintptr(event), uintptr(_p1), 0) + if r0 != 0 { + regerrno = syscall.Errno(r0) + } + return +} + func RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) { r0, _, _ := syscall.Syscall6(procRegOpenKeyExW.Addr(), 5, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(options), uintptr(desiredAccess), uintptr(unsafe.Pointer(result)), 0) if r0 != 0 { @@ -1160,6 +1184,12 @@ func CertDeleteCertificateFromStore(certContext *CertContext) (err error) { return } +func CertDuplicateCertificateContext(certContext *CertContext) (dupContext *CertContext) { + r0, _, _ := syscall.Syscall(procCertDuplicateCertificateContext.Addr(), 1, uintptr(unsafe.Pointer(certContext)), 0, 0) + dupContext = (*CertContext)(unsafe.Pointer(r0)) + return +} + func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) { r0, _, e1 := syscall.Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0) context = (*CertContext)(unsafe.Pointer(r0)) @@ -1216,6 +1246,15 @@ func CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext return } +func PFXImportCertStore(pfx *CryptDataBlob, password *uint16, flags uint32) (store Handle, err error) { + r0, _, e1 := syscall.Syscall(procPFXImportCertStore.Addr(), 3, uintptr(unsafe.Pointer(pfx)), uintptr(unsafe.Pointer(password)), uintptr(flags)) + store = Handle(r0) + if store == 0 { + err = errnoErr(e1) + } + return +} + func DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) { r0, _, _ := syscall.Syscall(procDnsNameCompare_W.Addr(), 2, uintptr(unsafe.Pointer(name1)), uintptr(unsafe.Pointer(name2)), 0) same = r0 != 0 @@ -2789,6 +2828,27 @@ func EnumProcesses(processIds []uint32, bytesReturned *uint32) (err error) { return } +func SubscribeServiceChangeNotifications(service Handle, eventType uint32, callback uintptr, callbackCtx uintptr, subscription *uintptr) (ret error) { + ret = procSubscribeServiceChangeNotifications.Find() + if ret != nil { + return + } + r0, _, _ := syscall.Syscall6(procSubscribeServiceChangeNotifications.Addr(), 5, uintptr(service), uintptr(eventType), uintptr(callback), uintptr(callbackCtx), uintptr(unsafe.Pointer(subscription)), 0) + if r0 != 0 { + ret = syscall.Errno(r0) + } + return +} + +func UnsubscribeServiceChangeNotifications(subscription uintptr) (err error) { + err = procUnsubscribeServiceChangeNotifications.Find() + if err != nil { + return + } + syscall.Syscall(procUnsubscribeServiceChangeNotifications.Addr(), 1, uintptr(subscription), 0, 0) + return +} + func GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) { r1, _, e1 := syscall.Syscall(procGetUserNameExW.Addr(), 3, uintptr(nameFormat), uintptr(unsafe.Pointer(nameBuffre)), uintptr(unsafe.Pointer(nSize))) if r1&0xff == 0 { @@ -2838,7 +2898,19 @@ func ExitWindowsEx(flags uint32, reason uint32) (err error) { return } -func MessageBox(hwnd Handle, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) { +func GetShellWindow() (shellWindow HWND) { + r0, _, _ := syscall.Syscall(procGetShellWindow.Addr(), 0, 0, 0, 0) + shellWindow = HWND(r0) + return +} + +func GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32) { + r0, _, _ := syscall.Syscall(procGetWindowThreadProcessId.Addr(), 2, uintptr(hwnd), uintptr(unsafe.Pointer(pid)), 0) + tid = uint32(r0) + return +} + +func MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) { r0, _, e1 := syscall.Syscall6(procMessageBoxW.Addr(), 4, uintptr(hwnd), uintptr(unsafe.Pointer(text)), uintptr(unsafe.Pointer(caption)), uintptr(boxtype), 0, 0) ret = int32(r0) if ret == 0 { diff --git a/vendor/modules.txt b/vendor/modules.txt index c491692a72..52d57515b5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -56,6 +56,8 @@ github.com/PuerkitoBio/urlesc github.com/StackExchange/wmi # github.com/VividCortex/ewma v1.1.1 github.com/VividCortex/ewma +# github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d +github.com/acarl005/stripansi # github.com/agnivade/levenshtein v1.0.3 github.com/agnivade/levenshtein # github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 @@ -124,6 +126,9 @@ github.com/emirpasic/gods/lists/arraylist github.com/emirpasic/gods/trees github.com/emirpasic/gods/trees/binaryheap github.com/emirpasic/gods/utils +# github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3 +## explicit +github.com/faiface/mainthread # github.com/fatih/color v1.7.0 ## explicit github.com/fatih/color @@ -133,6 +138,11 @@ github.com/felixge/fgprof # github.com/fsnotify/fsnotify v1.4.7 ## explicit github.com/fsnotify/fsnotify +# github.com/gammazero/deque v0.0.0-20200721202602-07291166fe33 +github.com/gammazero/deque +# github.com/gammazero/workerpool v1.1.1 +## explicit +github.com/gammazero/workerpool # github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 github.com/getlantern/context # github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7 @@ -305,7 +315,7 @@ github.com/mash/go-tempfile-suffix github.com/mattn/go-colorable # github.com/mattn/go-isatty v0.0.12 github.com/mattn/go-isatty -# github.com/mattn/go-runewidth v0.0.4 +# github.com/mattn/go-runewidth v0.0.10 ## explicit github.com/mattn/go-runewidth # github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b @@ -348,6 +358,8 @@ github.com/pmezard/go-difflib/difflib # github.com/posener/wstest v0.0.0-20180216222922-04b166ca0bf1 ## explicit github.com/posener/wstest +# github.com/rivo/uniseg v0.2.0 +github.com/rivo/uniseg # github.com/rollbar/rollbar-go v1.1.0 ## explicit github.com/rollbar/rollbar-go @@ -389,7 +401,7 @@ github.com/stretchr/testify/assert github.com/stretchr/testify/mock github.com/stretchr/testify/require github.com/stretchr/testify/suite -# github.com/thoas/go-funk v0.0.0-20170604141201-14304e8530de +# github.com/thoas/go-funk v0.8.0 ## explicit github.com/thoas/go-funk # github.com/ulikunitz/xz v0.5.4 @@ -402,12 +414,12 @@ github.com/ulikunitz/xz/lzma github.com/valyala/bytebufferpool # github.com/valyala/fasttemplate v1.2.1 github.com/valyala/fasttemplate -# github.com/vbauerster/mpb/v4 v4.10.0 +# github.com/vbauerster/mpb/v6 v6.0.2 ## explicit -github.com/vbauerster/mpb/v4 -github.com/vbauerster/mpb/v4/cwriter -github.com/vbauerster/mpb/v4/decor -github.com/vbauerster/mpb/v4/internal +github.com/vbauerster/mpb/v6 +github.com/vbauerster/mpb/v6/cwriter +github.com/vbauerster/mpb/v6/decor +github.com/vbauerster/mpb/v6/internal # github.com/vektah/gqlparser/v2 v2.1.0 ## explicit github.com/vektah/gqlparser/v2 @@ -480,7 +492,7 @@ golang.org/x/oauth2/google golang.org/x/oauth2/internal golang.org/x/oauth2/jws golang.org/x/oauth2/jwt -# golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3 +# golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78 ## explicit golang.org/x/sys/cpu golang.org/x/sys/internal/unsafeheader