// Code generated by go generate. DO NOT EDIT.

package cue

import (
	"bytes"
	"crypto/md5"
	"crypto/sha1"
	"crypto/sha256"
	"crypto/sha512"
	"cuelang.org/go/cue/parser"
	"cuelang.org/go/cue/token"
	"cuelang.org/go/internal/third_party/yaml"
	"encoding/csv"
	"encoding/hex"
	"encoding/json"
	"fmt"
	goyaml "github.com/ghodss/yaml"
	"html"
	"io"
	"math"
	"math/big"
	"math/bits"
	"path"
	"regexp"
	"strconv"
	"strings"
	"text/tabwriter"
	"text/template"
	"unicode"
)

func init() {
	initBuiltins(builtinPackages)
}

var _ io.Reader

var split = path.Split

var pathClean = path.Clean

var pathExt = path.Ext

var pathBase = path.Base

var pathIsAbs = path.IsAbs

var pathDir = path.Dir

var builtinPackages = map[string][]*builtin{
	"": []*builtin{{}},
	"crypto/md5": []*builtin{{
		Name:  "Size",
		Const: intFromGo("16"),
	}, {
		Name:  "BlockSize",
		Const: intFromGo("64"),
	}, {
		Name:   "Sum",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return md5.Sum(data)
			}()
		},
	}},
	"crypto/sha1": []*builtin{{
		Name:  "Size",
		Const: intFromGo("20"),
	}, {
		Name:  "BlockSize",
		Const: intFromGo("64"),
	}, {
		Name:   "Sum",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha1.Sum(data)
			}()
		},
	}},
	"crypto/sha256": []*builtin{{
		Name:  "Size",
		Const: intFromGo("32"),
	}, {
		Name:  "Size224",
		Const: intFromGo("28"),
	}, {
		Name:  "BlockSize",
		Const: intFromGo("64"),
	}, {
		Name:   "Sum256",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha256.Sum256(data)
			}()
		},
	}, {
		Name:   "Sum224",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha256.Sum224(data)
			}()
		},
	}},
	"crypto/sha512": []*builtin{{
		Name:  "Size",
		Const: intFromGo("64"),
	}, {
		Name:  "Size224",
		Const: intFromGo("28"),
	}, {
		Name:  "Size256",
		Const: intFromGo("32"),
	}, {
		Name:  "Size384",
		Const: intFromGo("48"),
	}, {
		Name:  "BlockSize",
		Const: intFromGo("128"),
	}, {
		Name:   "Sum512",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha512.Sum512(data)
			}()
		},
	}, {
		Name:   "Sum384",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha512.Sum384(data)
			}()
		},
	}, {
		Name:   "Sum512_224",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha512.Sum512_224(data)
			}()
		},
	}, {
		Name:   "Sum512_256",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return sha512.Sum512_256(data)
			}()
		},
	}},
	"encoding/csv": []*builtin{{
		Name:   "Encode",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			x := c.value(0)
			c.ret, c.err = func() (interface{}, error) {
				buf := &bytes.Buffer{}
				w := csv.NewWriter(buf)
				iter, err := x.List()
				if err != nil {
					return "", err
				}
				for iter.Next() {
					row, err := iter.Value().List()
					if err != nil {
						return "", err
					}
					a := []string{}
					for row.Next() {
						col := row.Value()
						if str, err := col.String(); err == nil {
							a = append(a, str)
						} else {
							b, err := col.MarshalJSON()
							if err != nil {
								return "", err
							}
							a = append(a, string(b))
						}
					}
					w.Write(a)
				}
				w.Flush()
				return buf.String(), nil
			}()
		},
	}, {
		Name:   "Decode",
		Params: []kind{stringKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			r := c.reader(0)
			c.ret, c.err = func() (interface{}, error) {
				return csv.NewReader(r).ReadAll()
			}()
		},
	}},
	"encoding/hex": []*builtin{{
		Name:   "EncodedLen",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			n := c.int(0)
			c.ret = func() interface{} {
				return hex.EncodedLen(n)
			}()
		},
	}, {
		Name:   "DecodedLen",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.int(0)
			c.ret = func() interface{} {
				return hex.DecodedLen(x)
			}()
		},
	}, {
		Name:   "Decode",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret, c.err = func() (interface{}, error) {
				return hex.DecodeString(s)
			}()
		},
	}, {
		Name:   "Dump",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return hex.Dump(data)
			}()
		},
	}, {
		Name:   "Encode",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			src := c.bytes(0)
			c.ret = func() interface{} {
				return hex.EncodeToString(src)
			}()
		},
	}},
	"encoding/json": []*builtin{{
		Name:   "Valid",
		Params: []kind{stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret = func() interface{} {
				return json.Valid(data)
			}()
		},
	}, {
		Name:   "Compact",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			src := c.bytes(0)
			c.ret, c.err = func() (interface{}, error) {
				dst := bytes.Buffer{}
				if err := json.Compact(&dst, src); err != nil {
					return "", err
				}
				return dst.String(), nil
			}()
		},
	}, {
		Name:   "Indent",
		Params: []kind{stringKind, stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			src, prefix, indent := c.bytes(0), c.string(1), c.string(2)
			c.ret, c.err = func() (interface{}, error) {
				dst := bytes.Buffer{}
				if err := json.Indent(&dst, src, prefix, indent); err != nil {
					return "", err
				}
				return dst.String(), nil
			}()
		},
	}, {
		Name:   "HTMLEscape",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			src := c.bytes(0)
			c.ret = func() interface{} {
				dst := &bytes.Buffer{}
				json.HTMLEscape(dst, src)
				return dst.String()
			}()
		},
	}, {
		Name:   "Marshal",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			v := c.value(0)
			c.ret, c.err = func() (interface{}, error) {
				b, err := json.Marshal(v)
				return string(b), err
			}()
		},
	}, {
		Name:   "MarshalStream",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			v := c.value(0)
			c.ret, c.err = func() (interface{}, error) {

				iter, err := v.List()
				if err != nil {
					return "", err
				}
				buf := &bytes.Buffer{}
				for iter.Next() {
					b, err := json.Marshal(iter.Value())
					if err != nil {
						return "", err
					}
					buf.Write(b)
					buf.WriteByte('\n')
				}
				return buf.String(), nil
			}()
		},
	}, {
		Name:   "Unmarshal",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			b := c.bytes(0)
			c.ret, c.err = func() (interface{}, error) {
				if !json.Valid(b) {
					return nil, fmt.Errorf("json: invalid JSON")
				}
				fset := token.NewFileSet()
				expr, err := parser.ParseExpr(fset, "json", b)
				if err != nil {

					return nil, fmt.Errorf("json: could not parse JSON: %v", err)
				}
				return FromExpr(fset, expr)
			}()
		},
	}},
	"encoding/yaml": []*builtin{{
		Name:   "Marshal",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			v := c.value(0)
			c.ret, c.err = func() (interface{}, error) {
				b, err := goyaml.Marshal(v)
				return string(b), err
			}()
		},
	}, {
		Name:   "MarshalStream",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			v := c.value(0)
			c.ret, c.err = func() (interface{}, error) {

				iter, err := v.List()
				if err != nil {
					return "", err
				}
				buf := &bytes.Buffer{}
				for i := 0; iter.Next(); i++ {
					if i > 0 {
						buf.WriteString("---\n")
					}
					b, err := goyaml.Marshal(iter.Value())
					if err != nil {
						return "", err
					}
					buf.Write(b)
				}
				return buf.String(), nil
			}()
		},
	}, {
		Name:   "Unmarshal",
		Params: []kind{stringKind},
		Result: topKind,
		Func: func(c *callCtxt) {
			data := c.bytes(0)
			c.ret, c.err = func() (interface{}, error) {
				fset := token.NewFileSet()
				expr, err := yaml.Unmarshal(fset, "", data)
				if err != nil {
					return nil, err
				}
				return FromExpr(fset, expr)
			}()
		},
	}},
	"html": []*builtin{{
		Name:   "Escape",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return html.EscapeString(s)
			}()
		},
	}, {
		Name:   "Unescape",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return html.UnescapeString(s)
			}()
		},
	}},
	"list": []*builtin{{}},
	"math": []*builtin{{
		Name:  "MaxExp",
		Const: intFromGo("2147483647"),
	}, {
		Name:  "MinExp",
		Const: intFromGo("-2147483648"),
	}, {
		Name:  "MaxPrec",
		Const: intFromGo("4294967295"),
	}, {
		Name:  "ToNearestEven",
		Const: intFromGo("0"),
	}, {
		Name:  "ToNearestAway",
		Const: intFromGo("1"),
	}, {
		Name:  "ToZero",
		Const: intFromGo("2"),
	}, {
		Name:  "AwayFromZero",
		Const: intFromGo("3"),
	}, {
		Name:  "ToNegativeInf",
		Const: intFromGo("4"),
	}, {
		Name:  "ToPositiveInf",
		Const: intFromGo("5"),
	}, {
		Name:  "Below",
		Const: intFromGo("-1"),
	}, {
		Name:  "Exact",
		Const: intFromGo("0"),
	}, {
		Name:  "Above",
		Const: intFromGo("1"),
	}, {
		Name:   "Jacobi",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x, y := c.bigInt(0), c.bigInt(1)
			c.ret = func() interface{} {
				return big.Jacobi(x, y)
			}()
		},
	}, {
		Name:  "MaxBase",
		Const: intFromGo("62"),
	}, {
		Name:   "Floor",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Floor(x)
			}()
		},
	}, {
		Name:   "Ceil",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Ceil(x)
			}()
		},
	}, {
		Name:   "Trunc",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Trunc(x)
			}()
		},
	}, {
		Name:   "Round",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Round(x)
			}()
		},
	}, {
		Name:   "RoundToEven",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.RoundToEven(x)
			}()
		},
	}, {
		Name:   "Abs",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Abs(x)
			}()
		},
	}, {
		Name:   "Acosh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Acosh(x)
			}()
		},
	}, {
		Name:   "Asin",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Asin(x)
			}()
		},
	}, {
		Name:   "Acos",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Acos(x)
			}()
		},
	}, {
		Name:   "Asinh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Asinh(x)
			}()
		},
	}, {
		Name:   "Atan",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Atan(x)
			}()
		},
	}, {
		Name:   "Atan2",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			y, x := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Atan2(y, x)
			}()
		},
	}, {
		Name:   "Atanh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Atanh(x)
			}()
		},
	}, {
		Name:   "Cbrt",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Cbrt(x)
			}()
		},
	}, {
		Name:  "E",
		Const: floatFromGo("2.71828182845904523536028747135266249775724709369995957496696763"),
	}, {
		Name:  "Pi",
		Const: floatFromGo("3.14159265358979323846264338327950288419716939937510582097494459"),
	}, {
		Name:  "Phi",
		Const: floatFromGo("1.61803398874989484820458683436563811772030917980576286213544861"),
	}, {
		Name:  "Sqrt2",
		Const: floatFromGo("1.41421356237309504880168872420969807856967187537694807317667974"),
	}, {
		Name:  "SqrtE",
		Const: floatFromGo("1.64872127070012814684865078781416357165377610071014801157507931"),
	}, {
		Name:  "SqrtPi",
		Const: floatFromGo("1.77245385090551602729816748334114518279754945612238712821380779"),
	}, {
		Name:  "SqrtPhi",
		Const: floatFromGo("1.27201964951406896425242246173749149171560804184009624861664038"),
	}, {
		Name:  "Ln2",
		Const: floatFromGo("0.693147180559945309417232121458176568075500134360255254120680009"),
	}, {
		Name:  "Log2E",
		Const: floatFromGo("1.442695040888963407359924681001892137426645954152985934135449408"),
	}, {
		Name:  "Ln10",
		Const: floatFromGo("2.3025850929940456840179914546843642076011014886287729760333278"),
	}, {
		Name:  "Log10E",
		Const: floatFromGo("0.43429448190325182765112891891660508229439700580366656611445378"),
	}, {
		Name:   "Copysign",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x, y := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Copysign(x, y)
			}()
		},
	}, {
		Name:   "Dim",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x, y := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Dim(x, y)
			}()
		},
	}, {
		Name:   "Erf",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Erf(x)
			}()
		},
	}, {
		Name:   "Erfc",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Erfc(x)
			}()
		},
	}, {
		Name:   "Erfinv",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Erfinv(x)
			}()
		},
	}, {
		Name:   "Erfcinv",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Erfcinv(x)
			}()
		},
	}, {
		Name:   "Exp",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Exp(x)
			}()
		},
	}, {
		Name:   "Exp2",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Exp2(x)
			}()
		},
	}, {
		Name:   "Expm1",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Expm1(x)
			}()
		},
	}, {
		Name:   "Gamma",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Gamma(x)
			}()
		},
	}, {
		Name:   "Hypot",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			p, q := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Hypot(p, q)
			}()
		},
	}, {
		Name:   "J0",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.J0(x)
			}()
		},
	}, {
		Name:   "Y0",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Y0(x)
			}()
		},
	}, {
		Name:   "J1",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.J1(x)
			}()
		},
	}, {
		Name:   "Y1",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Y1(x)
			}()
		},
	}, {
		Name:   "Jn",
		Params: []kind{intKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			n, x := c.int(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Jn(n, x)
			}()
		},
	}, {
		Name:   "Yn",
		Params: []kind{intKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			n, x := c.int(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Yn(n, x)
			}()
		},
	}, {
		Name:   "Ldexp",
		Params: []kind{numKind, intKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			frac, exp := c.float64(0), c.int(1)
			c.ret = func() interface{} {
				return math.Ldexp(frac, exp)
			}()
		},
	}, {
		Name:   "Log",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Log(x)
			}()
		},
	}, {
		Name:   "Log10",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Log10(x)
			}()
		},
	}, {
		Name:   "Log2",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Log2(x)
			}()
		},
	}, {
		Name:   "Log1p",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Log1p(x)
			}()
		},
	}, {
		Name:   "Logb",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Logb(x)
			}()
		},
	}, {
		Name:   "Ilogb",
		Params: []kind{numKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Ilogb(x)
			}()
		},
	}, {
		Name:   "Mod",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x, y := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Mod(x, y)
			}()
		},
	}, {
		Name:   "Pow",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x, y := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Pow(x, y)
			}()
		},
	}, {
		Name:   "Pow10",
		Params: []kind{intKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			n := c.int(0)
			c.ret = func() interface{} {
				return math.Pow10(n)
			}()
		},
	}, {
		Name:   "Remainder",
		Params: []kind{numKind, numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x, y := c.float64(0), c.float64(1)
			c.ret = func() interface{} {
				return math.Remainder(x, y)
			}()
		},
	}, {
		Name:   "Signbit",
		Params: []kind{numKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Signbit(x)
			}()
		},
	}, {
		Name:   "Cos",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Cos(x)
			}()
		},
	}, {
		Name:   "Sin",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Sin(x)
			}()
		},
	}, {
		Name:   "Sinh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Sinh(x)
			}()
		},
	}, {
		Name:   "Cosh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Cosh(x)
			}()
		},
	}, {
		Name:   "Sqrt",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Sqrt(x)
			}()
		},
	}, {
		Name:   "Tan",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Tan(x)
			}()
		},
	}, {
		Name:   "Tanh",
		Params: []kind{numKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			x := c.float64(0)
			c.ret = func() interface{} {
				return math.Tanh(x)
			}()
		},
	}},
	"math/bits": []*builtin{{
		Name:   "And",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			a, b := c.bigInt(0), c.bigInt(1)
			c.ret = func() interface{} {
				wa := a.Bits()
				wb := b.Bits()
				n := len(wa)
				if len(wb) < n {
					n = len(wb)
				}
				w := make([]big.Word, n)
				for i := range w {
					w[i] = wa[i] & wb[i]
				}
				i := &big.Int{}
				i.SetBits(w)
				return i
			}()
		},
	}, {
		Name:   "Or",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			a, b := c.bigInt(0), c.bigInt(1)
			c.ret = func() interface{} {
				wa := a.Bits()
				wb := b.Bits()
				var w []big.Word
				n := len(wa)
				if len(wa) > len(wb) {
					w = append(w, wa...)
					n = len(wb)
				} else {
					w = append(w, wb...)
				}
				for i := 0; i < n; i++ {
					w[i] = wa[i] | wb[i]
				}
				i := &big.Int{}
				i.SetBits(w)
				return i
			}()
		},
	}, {
		Name:   "Xor",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			a, b := c.bigInt(0), c.bigInt(1)
			c.ret = func() interface{} {
				wa := a.Bits()
				wb := b.Bits()
				var w []big.Word
				n := len(wa)
				if len(wa) > len(wb) {
					w = append(w, wa...)
					n = len(wb)
				} else {
					w = append(w, wb...)
				}
				for i := 0; i < n; i++ {
					w[i] = wa[i] ^ wb[i]
				}
				i := &big.Int{}
				i.SetBits(w)
				return i
			}()
		},
	}, {
		Name:   "Clear",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			a, b := c.bigInt(0), c.bigInt(1)
			c.ret = func() interface{} {
				wa := a.Bits()
				wb := b.Bits()
				w := append([]big.Word(nil), wa...)
				for i, m := range wb {
					if i >= len(w) {
						break
					}
					w[i] = wa[i] &^ m
				}
				i := &big.Int{}
				i.SetBits(w)
				return i
			}()
		},
	}, {
		Name:   "OnesCount",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.uint64(0)
			c.ret = func() interface{} {
				return bits.OnesCount64(x)
			}()
		},
	}, {
		Name:   "RotateLeft",
		Params: []kind{intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x, k := c.uint64(0), c.int(1)
			c.ret = func() interface{} {
				return bits.RotateLeft64(x, k)
			}()
		},
	}, {
		Name:   "Reverse",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.uint64(0)
			c.ret = func() interface{} {
				return bits.Reverse64(x)
			}()
		},
	}, {
		Name:   "ReverseBytes",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.uint64(0)
			c.ret = func() interface{} {
				return bits.ReverseBytes64(x)
			}()
		},
	}, {
		Name:   "Len",
		Params: []kind{intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			x := c.uint64(0)
			c.ret = func() interface{} {
				return bits.Len64(x)
			}()
		},
	}},
	"path": []*builtin{{
		Name:   "Split",
		Params: []kind{stringKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				file, dir := split(path)
				return []string{file, dir}
			}()
		},
	}, {
		Name:   "Match",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			pattern, name := c.string(0), c.string(1)
			c.ret, c.err = func() (interface{}, error) {
				return path.Match(pattern, name)
			}()
		},
	}, {
		Name:   "Clean",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				return pathClean(path)
			}()
		},
	}, {
		Name:   "Ext",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				return pathExt(path)
			}()
		},
	}, {
		Name:   "Base",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				return pathBase(path)
			}()
		},
	}, {
		Name:   "IsAbs",
		Params: []kind{stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				return pathIsAbs(path)
			}()
		},
	}, {
		Name:   "Dir",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			path := c.string(0)
			c.ret = func() interface{} {
				return pathDir(path)
			}()
		},
	}},
	"regexp": []*builtin{{
		Name:   "Match",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			pattern, s := c.string(0), c.string(1)
			c.ret, c.err = func() (interface{}, error) {
				return regexp.MatchString(pattern, s)
			}()
		},
	}, {
		Name:   "QuoteMeta",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return regexp.QuoteMeta(s)
			}()
		},
	}},
	"runtime": []*builtin{{
		Name:   "Path",
		Params: []kind{},
		Result: stringKind,
		Func: func(c *callCtxt) {
			c.ret = func() interface{} {
				return ""
			}()
		},
	}},
	"strconv": []*builtin{{
		Name:   "Unquote",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret, c.err = func() (interface{}, error) {
				return Unquote(s)
			}()
		},
	}, {
		Name:   "ParseBool",
		Params: []kind{stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			str := c.string(0)
			c.ret, c.err = func() (interface{}, error) {
				return strconv.ParseBool(str)
			}()
		},
	}, {
		Name:   "FormatBool",
		Params: []kind{boolKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			b := c.bool(0)
			c.ret = func() interface{} {
				return strconv.FormatBool(b)
			}()
		},
	}, {
		Name:   "ParseFloat",
		Params: []kind{stringKind, intKind},
		Result: numKind,
		Func: func(c *callCtxt) {
			s, bitSize := c.string(0), c.int(1)
			c.ret, c.err = func() (interface{}, error) {
				return strconv.ParseFloat(s, bitSize)
			}()
		},
	}, {
		Name:  "IntSize",
		Const: intFromGo("64"),
	}, {
		Name:   "ParseUint",
		Params: []kind{stringKind, intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, base, bitSize := c.string(0), c.int(1), c.int(2)
			c.ret, c.err = func() (interface{}, error) {
				return strconv.ParseUint(s, base, bitSize)
			}()
		},
	}, {
		Name:   "ParseInt",
		Params: []kind{stringKind, intKind, intKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, base, bitSize := c.string(0), c.int(1), c.int(2)
			c.ret, c.err = func() (interface{}, error) {
				return strconv.ParseInt(s, base, bitSize)
			}()
		},
	}, {
		Name:   "Atoi",
		Params: []kind{stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret, c.err = func() (interface{}, error) {
				return strconv.Atoi(s)
			}()
		},
	}, {
		Name:   "FormatFloat",
		Params: []kind{numKind, intKind, intKind, intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			f, fmt, prec, bitSize := c.float64(0), c.byte(1), c.int(2), c.int(3)
			c.ret = func() interface{} {
				return strconv.FormatFloat(f, fmt, prec, bitSize)
			}()
		},
	}, {
		Name:   "FormatUint",
		Params: []kind{intKind, intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			i, base := c.uint64(0), c.int(1)
			c.ret = func() interface{} {
				return strconv.FormatUint(i, base)
			}()
		},
	}, {
		Name:   "FormatInt",
		Params: []kind{intKind, intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			i, base := c.int64(0), c.int(1)
			c.ret = func() interface{} {
				return strconv.FormatInt(i, base)
			}()
		},
	}, {
		Name:   "Quote",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strconv.Quote(s)
			}()
		},
	}, {
		Name:   "QuoteToASCII",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strconv.QuoteToASCII(s)
			}()
		},
	}, {
		Name:   "QuoteToGraphic",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strconv.QuoteToGraphic(s)
			}()
		},
	}, {
		Name:   "QuoteRune",
		Params: []kind{intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			r := c.rune(0)
			c.ret = func() interface{} {
				return strconv.QuoteRune(r)
			}()
		},
	}, {
		Name:   "QuoteRuneToASCII",
		Params: []kind{intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			r := c.rune(0)
			c.ret = func() interface{} {
				return strconv.QuoteRuneToASCII(r)
			}()
		},
	}, {
		Name:   "QuoteRuneToGraphic",
		Params: []kind{intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			r := c.rune(0)
			c.ret = func() interface{} {
				return strconv.QuoteRuneToGraphic(r)
			}()
		},
	}, {
		Name:   "CanBackquote",
		Params: []kind{stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strconv.CanBackquote(s)
			}()
		},
	}, {
		Name:   "IsPrint",
		Params: []kind{intKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			r := c.rune(0)
			c.ret = func() interface{} {
				return strconv.IsPrint(r)
			}()
		},
	}, {
		Name:   "IsGraphic",
		Params: []kind{intKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			r := c.rune(0)
			c.ret = func() interface{} {
				return strconv.IsGraphic(r)
			}()
		},
	}},
	"strings": []*builtin{{
		Name:   "ToTitle",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {

				prev := ' '
				return strings.Map(
					func(r rune) rune {
						if unicode.IsSpace(prev) {
							prev = r
							return unicode.ToTitle(r)
						}
						prev = r
						return r
					},
					s)
			}()
		},
	}, {
		Name:   "ToCamel",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {

				prev := ' '
				return strings.Map(
					func(r rune) rune {
						if unicode.IsSpace(prev) {
							prev = r
							return unicode.ToLower(r)
						}
						prev = r
						return r
					},
					s)
			}()
		},
	}, {
		Name:   "Compare",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			a, b := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Compare(a, b)
			}()
		},
	}, {
		Name:   "Count",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, substr := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Count(s, substr)
			}()
		},
	}, {
		Name:   "Contains",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			s, substr := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Contains(s, substr)
			}()
		},
	}, {
		Name:   "ContainsAny",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			s, chars := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.ContainsAny(s, chars)
			}()
		},
	}, {
		Name:   "LastIndex",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, substr := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.LastIndex(s, substr)
			}()
		},
	}, {
		Name:   "IndexAny",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, chars := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.IndexAny(s, chars)
			}()
		},
	}, {
		Name:   "LastIndexAny",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, chars := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.LastIndexAny(s, chars)
			}()
		},
	}, {
		Name:   "SplitN",
		Params: []kind{stringKind, stringKind, intKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			s, sep, n := c.string(0), c.string(1), c.int(2)
			c.ret = func() interface{} {
				return strings.SplitN(s, sep, n)
			}()
		},
	}, {
		Name:   "SplitAfterN",
		Params: []kind{stringKind, stringKind, intKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			s, sep, n := c.string(0), c.string(1), c.int(2)
			c.ret = func() interface{} {
				return strings.SplitAfterN(s, sep, n)
			}()
		},
	}, {
		Name:   "Split",
		Params: []kind{stringKind, stringKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			s, sep := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Split(s, sep)
			}()
		},
	}, {
		Name:   "SplitAfter",
		Params: []kind{stringKind, stringKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			s, sep := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.SplitAfter(s, sep)
			}()
		},
	}, {
		Name:   "Fields",
		Params: []kind{stringKind},
		Result: listKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strings.Fields(s)
			}()
		},
	}, {
		Name:   "Join",
		Params: []kind{listKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			a, sep := c.strList(0), c.string(1)
			if c.do() {
				c.ret = func() interface{} {
					return strings.Join(a, sep)
				}()
			}
		},
	}, {
		Name:   "HasPrefix",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			s, prefix := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.HasPrefix(s, prefix)
			}()
		},
	}, {
		Name:   "HasSuffix",
		Params: []kind{stringKind, stringKind},
		Result: boolKind,
		Func: func(c *callCtxt) {
			s, suffix := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.HasSuffix(s, suffix)
			}()
		},
	}, {
		Name:   "Repeat",
		Params: []kind{stringKind, intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, count := c.string(0), c.int(1)
			c.ret = func() interface{} {
				return strings.Repeat(s, count)
			}()
		},
	}, {
		Name:   "ToUpper",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strings.ToUpper(s)
			}()
		},
	}, {
		Name:   "ToLower",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strings.ToLower(s)
			}()
		},
	}, {
		Name:   "Trim",
		Params: []kind{stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, cutset := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Trim(s, cutset)
			}()
		},
	}, {
		Name:   "TrimLeft",
		Params: []kind{stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, cutset := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.TrimLeft(s, cutset)
			}()
		},
	}, {
		Name:   "TrimRight",
		Params: []kind{stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, cutset := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.TrimRight(s, cutset)
			}()
		},
	}, {
		Name:   "TrimSpace",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return strings.TrimSpace(s)
			}()
		},
	}, {
		Name:   "TrimPrefix",
		Params: []kind{stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, prefix := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.TrimPrefix(s, prefix)
			}()
		},
	}, {
		Name:   "TrimSuffix",
		Params: []kind{stringKind, stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, suffix := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.TrimSuffix(s, suffix)
			}()
		},
	}, {
		Name:   "Replace",
		Params: []kind{stringKind, stringKind, stringKind, intKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s, old, new, n := c.string(0), c.string(1), c.string(2), c.int(3)
			c.ret = func() interface{} {
				return strings.Replace(s, old, new, n)
			}()
		},
	}, {
		Name:   "Index",
		Params: []kind{stringKind, stringKind},
		Result: intKind,
		Func: func(c *callCtxt) {
			s, substr := c.string(0), c.string(1)
			c.ret = func() interface{} {
				return strings.Index(s, substr)
			}()
		},
	}},
	"text/tabwriter": []*builtin{{
		Name:   "Write",
		Params: []kind{topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			data := c.value(0)
			c.ret, c.err = func() (interface{}, error) {
				buf := &bytes.Buffer{}
				tw := tabwriter.NewWriter(buf, 0, 4, 1, ' ', 0)
				b, err := data.Bytes()
				if err != nil {
					return "", err
				}
				_, err = tw.Write(b)
				if err != nil {
					return "", err
				}
				return buf.String(), err
			}()
		},
	}},
	"text/template": []*builtin{{
		Name:   "Execute",
		Params: []kind{stringKind, topKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			templ, data := c.string(0), c.value(1)
			c.ret, c.err = func() (interface{}, error) {
				t, err := template.New("").Parse(templ)
				if err != nil {
					return "", err
				}
				buf := &bytes.Buffer{}
				if err := t.Execute(buf, data); err != nil {
					return "", err
				}
				return buf.String(), nil
			}()
		},
	}, {
		Name:   "HTMLEscape",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return template.HTMLEscapeString(s)
			}()
		},
	}, {
		Name:   "JSEscape",
		Params: []kind{stringKind},
		Result: stringKind,
		Func: func(c *callCtxt) {
			s := c.string(0)
			c.ret = func() interface{} {
				return template.JSEscapeString(s)
			}()
		},
	}},
}
