Problem:
Score: 300 points

Problem Statement

In 2028 and after a continuous growth, AtCoder Inc. finally built an empire with six cities (City 1, 2, 3, 4, 5, 6)!

There are five means of transport in this empire:

Train: travels from City 1 to 2 in one minute. A train can occupy at most A people.

Bus: travels from City 2 to 3 in one minute. A bus can occupy at most B people.

Taxi: travels from City 3 to 4 in one minute. A taxi can occupy at most C people.

Airplane: travels from City 4 to 5 in one minute. An airplane can occupy at most D people.

Ship: travels from City 5 to 6 in one minute. A ship can occupy at most E people.

For each of them, one vehicle leaves the city at each integer time (time 0, 1, 2, ...).

There is a group of N people at City 1, and they all want to go to City 6.

At least how long does it take for all of them to reach there?
You can ignore the time needed to transfer.

Constraints

1 \leq N, A, B, C, D, E \leq 10^{15}

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
A
B
C
D
E

Output

Print the minimum time required for all of the people to reach City 6, in minutes.

Sample Input 1

5
3
2
4
3
5

Sample Output 1

7

One possible way to travel is as follows.
First, there are N = 5 people at City 1, as shown in the following image:

In the first minute, three people travels from City 1 to City 2 by train. Note that a train can only occupy at most three people.

In the second minute, the remaining two people travels from City 1 to City 2 by train, and two of the three people who were already at City 2 travels to City 3 by bus. Note that a bus can only occupy at most two people.

In the third minute, two people travels from City 2 to City 3 by train, and another two people travels from City 3 to City 4 by taxi.

From then on, if they continue traveling without stopping until they reach City 6, all of them can reach there in seven minutes.

There is no way for them to reach City 6 in 6 minutes or less.

Sample Input 2

10
123
123
123
123
123

Sample Output 2

5

All kinds of vehicles can occupy N = 10 people at a time.
Thus, if they continue traveling without stopping until they reach City 6, all of them can reach there in five minutes.

Sample Input 3

10000000007
2
3
5
7
11

Sample Output 3

5000000008

Note that the input or output may not fit into a 32-bit integer type.

Solution in Go (1.6) (judge verdict: Accepted)

// Code generated by golang.org/x/tools/cmd/bundle. DO NOT EDIT.
//   $ bundle -pkg main -prefix   -dst github.com/mpppk/atcoder/abc123/c github.com/mpppk/atcoder/abc123/c

package main

import (
	"bufio"
	"errors"
	"fmt"
	"io"
	"math"
	"math/big"
	"os"
	"strconv"
	"strings"
)

func solve(input *lib_Input) int64 {
	inputs := input.MustGetColInt64Line(0)
	N := inputs[0]
	transportations := inputs[1:]

	minTime := transportations[0]

	for _, transportation := range transportations {
		if minTime > transportation {
			minTime = transportation
		}
	}

	ret := int64(math.Ceil(float64(N) / float64(minTime)))
	return ret + 4
}

func main() {
	input := lib_MustNewInputFromReader(bufio.NewReader(io.Reader(os.Stdin)))
	fmt.Println(solve(input))
}

func (i *lib_Input) GetIntLines() (newLines [][]int, err error) {
	return i.GetIntLinesFrom(0)
}

func (i *lib_Input) GetIntLinesFrom(fromIndex int) (newLines [][]int, err error) {
	for index := range i.lines {
		if index < fromIndex {
			continue
		}
		newLine, err := i.GetIntLine(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
	}
	return
}

func (i *lib_Input) GetIntLineRange(fromRowIndex, rangeNum int) (newLines [][]int, err error) {
	cnt := 0
	for index := range i.lines {
		if index < fromRowIndex {
			continue
		}
		newLine, err := i.GetIntLine(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
		cnt++
		if cnt >= rangeNum {
			return newLines, nil
		}
	}
	return
}

func (i *lib_Input) GetIntLine(index int) ([]int, error) {
	if err := i.validateRowIndex(index); err != nil {
		return nil, err
	}

	newLine, err := lib_StringSliceToIntSlice(i.lines[index])
	if err != nil {
		return nil, fmt.Errorf("%dth index: %v", index, err)
	}
	return newLine, nil
}

func (i *lib_Input) GetIntValue(rowIndex, colIndex int) (int, error) {
	line, err := i.GetLine(rowIndex)
	if err != nil {
		return 0, err
	}
	if colIndex < 0 || colIndex >= len(line) {
		return 0, fmt.Errorf("Invalid col index: %v ", colIndex)
	}

	v, err := strconv.ParseInt(line[colIndex], 10, 64)
	if err != nil {
		return 0, fmt.Errorf("failed to convert string to int: %v, %v", line[colIndex], err)
	}

	return int(v), nil
}

func (i *lib_Input) GetFirstIntValue(rowIndex int) (int, error) {
	return i.GetIntValue(rowIndex, 0)
}

func (i *lib_Input) GetColIntLine(colIndex int) (newLine []int, err error) {
	strLine, err := i.GetColLine(colIndex)
	if err != nil {
		return nil, err
	}
	newLine, err = lib_StringSliceToIntSlice(strLine)
	if err != nil {
		return nil, fmt.Errorf("%dth col index: %v", colIndex, err)
	}
	return
}

func (i *lib_Input) GetInt8Lines() (newLines [][]int8, err error) {
	return i.GetInt8LinesFrom(0)
}

func (i *lib_Input) GetInt8LinesFrom(fromIndex int) (newLines [][]int8, err error) {
	for index := range i.lines {
		if index < fromIndex {
			continue
		}
		newLine, err := i.GetInt8Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
	}
	return
}

func (i *lib_Input) GetInt8LineRange(fromRowIndex, rangeNum int) (newLines [][]int8, err error) {
	cnt := 0
	for index := range i.lines {
		if index < fromRowIndex {
			continue
		}
		newLine, err := i.GetInt8Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
		cnt++
		if cnt >= rangeNum {
			return newLines, nil
		}
	}
	return
}

func (i *lib_Input) GetInt8Line(index int) ([]int8, error) {
	if err := i.validateRowIndex(index); err != nil {
		return nil, err
	}

	newLine, err := lib_StringSliceToInt8Slice(i.lines[index])
	if err != nil {
		return nil, fmt.Errorf("%dth index: %v", index, err)
	}
	return newLine, nil
}

func (i *lib_Input) GetInt8Value(rowIndex, colIndex int) (int8, error) {
	line, err := i.GetLine(rowIndex)
	if err != nil {
		return 0, err
	}
	if colIndex < 0 || colIndex >= len(line) {
		return 0, fmt.Errorf("Invalid col index: %v ", colIndex)
	}

	v, err := strconv.ParseInt(line[colIndex], 10, 64)
	if err != nil {
		return 0, fmt.Errorf("failed to convert string to int: %v, %v", line[colIndex], err)
	}

	return int8(v), nil
}

func (i *lib_Input) GetFirstInt8Value(rowIndex int) (int8, error) {
	return i.GetInt8Value(rowIndex, 0)
}

func (i *lib_Input) GetColInt8Line(colIndex int) (newLine []int8, err error) {
	strLine, err := i.GetColLine(colIndex)
	if err != nil {
		return nil, err
	}
	newLine, err = lib_StringSliceToInt8Slice(strLine)
	if err != nil {
		return nil, fmt.Errorf("%dth col index: %v", colIndex, err)
	}
	return
}

func (i *lib_Input) GetInt16Lines() (newLines [][]int16, err error) {
	return i.GetInt16LinesFrom(0)
}

func (i *lib_Input) GetInt16LinesFrom(fromIndex int) (newLines [][]int16, err error) {
	for index := range i.lines {
		if index < fromIndex {
			continue
		}
		newLine, err := i.GetInt16Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
	}
	return
}

func (i *lib_Input) GetInt16LineRange(fromRowIndex, rangeNum int) (newLines [][]int16, err error) {
	cnt := 0
	for index := range i.lines {
		if index < fromRowIndex {
			continue
		}
		newLine, err := i.GetInt16Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
		cnt++
		if cnt >= rangeNum {
			return newLines, nil
		}
	}
	return
}

func (i *lib_Input) GetInt16Line(index int) ([]int16, error) {
	if err := i.validateRowIndex(index); err != nil {
		return nil, err
	}

	newLine, err := lib_StringSliceToInt16Slice(i.lines[index])
	if err != nil {
		return nil, fmt.Errorf("%dth index: %v", index, err)
	}
	return newLine, nil
}

func (i *lib_Input) GetInt16Value(rowIndex, colIndex int) (int16, error) {
	line, err := i.GetLine(rowIndex)
	if err != nil {
		return 0, err
	}
	if colIndex < 0 || colIndex >= len(line) {
		return 0, fmt.Errorf("Invalid col index: %v ", colIndex)
	}

	v, err := strconv.ParseInt(line[colIndex], 10, 64)
	if err != nil {
		return 0, fmt.Errorf("failed to convert string to int: %v, %v", line[colIndex], err)
	}

	return int16(v), nil
}

func (i *lib_Input) GetFirstInt16Value(rowIndex int) (int16, error) {
	return i.GetInt16Value(rowIndex, 0)
}

func (i *lib_Input) GetColInt16Line(colIndex int) (newLine []int16, err error) {
	strLine, err := i.GetColLine(colIndex)
	if err != nil {
		return nil, err
	}
	newLine, err = lib_StringSliceToInt16Slice(strLine)
	if err != nil {
		return nil, fmt.Errorf("%dth col index: %v", colIndex, err)
	}
	return
}

func (i *lib_Input) GetInt32Lines() (newLines [][]int32, err error) {
	return i.GetInt32LinesFrom(0)
}

func (i *lib_Input) GetInt32LinesFrom(fromIndex int) (newLines [][]int32, err error) {
	for index := range i.lines {
		if index < fromIndex {
			continue
		}
		newLine, err := i.GetInt32Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
	}
	return
}

func (i *lib_Input) GetInt32LineRange(fromRowIndex, rangeNum int) (newLines [][]int32, err error) {
	cnt := 0
	for index := range i.lines {
		if index < fromRowIndex {
			continue
		}
		newLine, err := i.GetInt32Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
		cnt++
		if cnt >= rangeNum {
			return newLines, nil
		}
	}
	return
}

func (i *lib_Input) GetInt32Line(index int) ([]int32, error) {
	if err := i.validateRowIndex(index); err != nil {
		return nil, err
	}

	newLine, err := lib_StringSliceToInt32Slice(i.lines[index])
	if err != nil {
		return nil, fmt.Errorf("%dth index: %v", index, err)
	}
	return newLine, nil
}

func (i *lib_Input) GetInt32Value(rowIndex, colIndex int) (int32, error) {
	line, err := i.GetLine(rowIndex)
	if err != nil {
		return 0, err
	}
	if colIndex < 0 || colIndex >= len(line) {
		return 0, fmt.Errorf("Invalid col index: %v ", colIndex)
	}

	v, err := strconv.ParseInt(line[colIndex], 10, 64)
	if err != nil {
		return 0, fmt.Errorf("failed to convert string to int: %v, %v", line[colIndex], err)
	}

	return int32(v), nil
}

func (i *lib_Input) GetFirstInt32Value(rowIndex int) (int32, error) {
	return i.GetInt32Value(rowIndex, 0)
}

func (i *lib_Input) GetColInt32Line(colIndex int) (newLine []int32, err error) {
	strLine, err := i.GetColLine(colIndex)
	if err != nil {
		return nil, err
	}
	newLine, err = lib_StringSliceToInt32Slice(strLine)
	if err != nil {
		return nil, fmt.Errorf("%dth col index: %v", colIndex, err)
	}
	return
}

func (i *lib_Input) GetInt64Lines() (newLines [][]int64, err error) {
	return i.GetInt64LinesFrom(0)
}

func (i *lib_Input) GetInt64LinesFrom(fromIndex int) (newLines [][]int64, err error) {
	for index := range i.lines {
		if index < fromIndex {
			continue
		}
		newLine, err := i.GetInt64Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
	}
	return
}

func (i *lib_Input) GetInt64LineRange(fromRowIndex, rangeNum int) (newLines [][]int64, err error) {
	cnt := 0
	for index := range i.lines {
		if index < fromRowIndex {
			continue
		}
		newLine, err := i.GetInt64Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
		cnt++
		if cnt >= rangeNum {
			return newLines, nil
		}
	}
	return
}

func (i *lib_Input) GetInt64Line(index int) ([]int64, error) {
	if err := i.validateRowIndex(index); err != nil {
		return nil, err
	}

	newLine, err := lib_StringSliceToInt64Slice(i.lines[index])
	if err != nil {
		return nil, fmt.Errorf("%dth index: %v", index, err)
	}
	return newLine, nil
}

func (i *lib_Input) GetInt64Value(rowIndex, colIndex int) (int64, error) {
	line, err := i.GetLine(rowIndex)
	if err != nil {
		return 0, err
	}
	if colIndex < 0 || colIndex >= len(line) {
		return 0, fmt.Errorf("Invalid col index: %v ", colIndex)
	}

	v, err := strconv.ParseInt(line[colIndex], 10, 64)
	if err != nil {
		return 0, fmt.Errorf("failed to convert string to int: %v, %v", line[colIndex], err)
	}

	return int64(v), nil
}

func (i *lib_Input) GetFirstInt64Value(rowIndex int) (int64, error) {
	return i.GetInt64Value(rowIndex, 0)
}

func (i *lib_Input) GetColInt64Line(colIndex int) (newLine []int64, err error) {
	strLine, err := i.GetColLine(colIndex)
	if err != nil {
		return nil, err
	}
	newLine, err = lib_StringSliceToInt64Slice(strLine)
	if err != nil {
		return nil, fmt.Errorf("%dth col index: %v", colIndex, err)
	}
	return
}

func (i *lib_Input) GetFloat32Lines() (newLines [][]float32, err error) {
	return i.GetFloat32LinesFrom(0)
}

func (i *lib_Input) GetFloat32LinesFrom(fromIndex int) (newLines [][]float32, err error) {
	for index := range i.lines {
		if index < fromIndex {
			continue
		}
		newLine, err := i.GetFloat32Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
	}
	return
}

func (i *lib_Input) GetFloat32LineRange(fromRowIndex, rangeNum int) (newLines [][]float32, err error) {
	cnt := 0
	for index := range i.lines {
		if index < fromRowIndex {
			continue
		}
		newLine, err := i.GetFloat32Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
		cnt++
		if cnt >= rangeNum {
			return newLines, nil
		}
	}
	return
}

func (i *lib_Input) GetFloat32Line(index int) ([]float32, error) {
	if err := i.validateRowIndex(index); err != nil {
		return nil, err
	}

	newLine, err := lib_StringSliceToFloat32Slice(i.lines[index])
	if err != nil {
		return nil, fmt.Errorf("%dth index: %v", index, err)
	}
	return newLine, nil
}

func (i *lib_Input) GetFloat32Value(rowIndex, colIndex int) (float32, error) {
	line, err := i.GetLine(rowIndex)
	if err != nil {
		return 0, err
	}
	if colIndex < 0 || colIndex >= len(line) {
		return 0, fmt.Errorf("Invalid col index: %v ", colIndex)
	}

	v, err := strconv.ParseInt(line[colIndex], 10, 64)
	if err != nil {
		return 0, fmt.Errorf("failed to convert string to int: %v, %v", line[colIndex], err)
	}

	return float32(v), nil
}

func (i *lib_Input) GetFirstFloat32Value(rowIndex int) (float32, error) {
	return i.GetFloat32Value(rowIndex, 0)
}

func (i *lib_Input) GetColFloat32Line(colIndex int) (newLine []float32, err error) {
	strLine, err := i.GetColLine(colIndex)
	if err != nil {
		return nil, err
	}
	newLine, err = lib_StringSliceToFloat32Slice(strLine)
	if err != nil {
		return nil, fmt.Errorf("%dth col index: %v", colIndex, err)
	}
	return
}

func (i *lib_Input) GetFloat64Lines() (newLines [][]float64, err error) {
	return i.GetFloat64LinesFrom(0)
}

func (i *lib_Input) GetFloat64LinesFrom(fromIndex int) (newLines [][]float64, err error) {
	for index := range i.lines {
		if index < fromIndex {
			continue
		}
		newLine, err := i.GetFloat64Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
	}
	return
}

func (i *lib_Input) GetFloat64LineRange(fromRowIndex, rangeNum int) (newLines [][]float64, err error) {
	cnt := 0
	for index := range i.lines {
		if index < fromRowIndex {
			continue
		}
		newLine, err := i.GetFloat64Line(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
		cnt++
		if cnt >= rangeNum {
			return newLines, nil
		}
	}
	return
}

func (i *lib_Input) GetFloat64Line(index int) ([]float64, error) {
	if err := i.validateRowIndex(index); err != nil {
		return nil, err
	}

	newLine, err := lib_StringSliceToFloat64Slice(i.lines[index])
	if err != nil {
		return nil, fmt.Errorf("%dth index: %v", index, err)
	}
	return newLine, nil
}

func (i *lib_Input) GetFloat64Value(rowIndex, colIndex int) (float64, error) {
	line, err := i.GetLine(rowIndex)
	if err != nil {
		return 0, err
	}
	if colIndex < 0 || colIndex >= len(line) {
		return 0, fmt.Errorf("Invalid col index: %v ", colIndex)
	}

	v, err := strconv.ParseInt(line[colIndex], 10, 64)
	if err != nil {
		return 0, fmt.Errorf("failed to convert string to int: %v, %v", line[colIndex], err)
	}

	return float64(v), nil
}

func (i *lib_Input) GetFirstFloat64Value(rowIndex int) (float64, error) {
	return i.GetFloat64Value(rowIndex, 0)
}

func (i *lib_Input) GetColFloat64Line(colIndex int) (newLine []float64, err error) {
	strLine, err := i.GetColLine(colIndex)
	if err != nil {
		return nil, err
	}
	newLine, err = lib_StringSliceToFloat64Slice(strLine)
	if err != nil {
		return nil, fmt.Errorf("%dth col index: %v", colIndex, err)
	}
	return
}

func lib_IntToBits(value int, minDigits int) (bits []bool) {
	bin := fmt.Sprintf("%b", int(value))
	digits := 0
	for _, b := range bin {
		digits++
		if b == '0' {
			bits = append(bits, false)
		} else if b == '1' {
			bits = append(bits, true)
		} else {
			panic("invalid bit:" + string(b) + ", " + string('0'))
		}
	}

	for minDigits > digits {
		bits = append([]bool{false}, bits...)
		digits++
	}

	return
}

func lib_Int8ToBits(value int8, minDigits int) (bits []bool) {
	bin := fmt.Sprintf("%b", int(value))
	digits := 0
	for _, b := range bin {
		digits++
		if b == '0' {
			bits = append(bits, false)
		} else if b == '1' {
			bits = append(bits, true)
		} else {
			panic("invalid bit:" + string(b) + ", " + string('0'))
		}
	}

	for minDigits > digits {
		bits = append([]bool{false}, bits...)
		digits++
	}

	return
}

func lib_Int16ToBits(value int16, minDigits int) (bits []bool) {
	bin := fmt.Sprintf("%b", int(value))
	digits := 0
	for _, b := range bin {
		digits++
		if b == '0' {
			bits = append(bits, false)
		} else if b == '1' {
			bits = append(bits, true)
		} else {
			panic("invalid bit:" + string(b) + ", " + string('0'))
		}
	}

	for minDigits > digits {
		bits = append([]bool{false}, bits...)
		digits++
	}

	return
}

func lib_Int32ToBits(value int32, minDigits int) (bits []bool) {
	bin := fmt.Sprintf("%b", int(value))
	digits := 0
	for _, b := range bin {
		digits++
		if b == '0' {
			bits = append(bits, false)
		} else if b == '1' {
			bits = append(bits, true)
		} else {
			panic("invalid bit:" + string(b) + ", " + string('0'))
		}
	}

	for minDigits > digits {
		bits = append([]bool{false}, bits...)
		digits++
	}

	return
}

func lib_Int64ToBits(value int64, minDigits int) (bits []bool) {
	bin := fmt.Sprintf("%b", int(value))
	digits := 0
	for _, b := range bin {
		digits++
		if b == '0' {
			bits = append(bits, false)
		} else if b == '1' {
			bits = append(bits, true)
		} else {
			panic("invalid bit:" + string(b) + ", " + string('0'))
		}
	}

	for minDigits > digits {
		bits = append([]bool{false}, bits...)
		digits++
	}

	return
}

func lib_GetEachDigitSumInt(n int) (sum int) {
	for _, digit := range lib_ToDigitSliceInt(n) {
		sum += int(digit)
	}
	return
}

func lib_ToDigitSliceInt(n int) (digits []int8) {
	nn := int64(n)
	for {
		if nn <= 0 {
			return lib_ReverseInt8(digits)
		}
		digit := int8(nn % 10) // FIXME
		digits = append(digits, digit)
		nn /= 10
	}
}

func lib_DigitsToInt(digits []int8) int {
	v := int(0)
	for i, digit := range digits {
		v += int(float64(digit) * math.Pow(10, float64(len(digits)-i-1)))
	}
	return v
}

func lib_GetEachDigitSumInt8(n int8) (sum int8) {
	for _, digit := range lib_ToDigitSliceInt8(n) {
		sum += int8(digit)
	}
	return
}

func lib_ToDigitSliceInt8(n int8) (digits []int8) {
	nn := int64(n)
	for {
		if nn <= 0 {
			return lib_ReverseInt8(digits)
		}
		digit := int8(nn % 10) // FIXME
		digits = append(digits, digit)
		nn /= 10
	}
}

func lib_DigitsToInt8(digits []int8) int8 {
	v := int8(0)
	for i, digit := range digits {
		v += int8(float64(digit) * math.Pow(10, float64(len(digits)-i-1)))
	}
	return v
}

func lib_GetEachDigitSumInt16(n int16) (sum int16) {
	for _, digit := range lib_ToDigitSliceInt16(n) {
		sum += int16(digit)
	}
	return
}

func lib_ToDigitSliceInt16(n int16) (digits []int8) {
	nn := int64(n)
	for {
		if nn <= 0 {
			return lib_ReverseInt8(digits)
		}
		digit := int8(nn % 10) // FIXME
		digits = append(digits, digit)
		nn /= 10
	}
}

func lib_DigitsToInt16(digits []int8) int16 {
	v := int16(0)
	for i, digit := range digits {
		v += int16(float64(digit) * math.Pow(10, float64(len(digits)-i-1)))
	}
	return v
}

func lib_GetEachDigitSumInt32(n int32) (sum int32) {
	for _, digit := range lib_ToDigitSliceInt32(n) {
		sum += int32(digit)
	}
	return
}

func lib_ToDigitSliceInt32(n int32) (digits []int8) {
	nn := int64(n)
	for {
		if nn <= 0 {
			return lib_ReverseInt8(digits)
		}
		digit := int8(nn % 10) // FIXME
		digits = append(digits, digit)
		nn /= 10
	}
}

func lib_DigitsToInt32(digits []int8) int32 {
	v := int32(0)
	for i, digit := range digits {
		v += int32(float64(digit) * math.Pow(10, float64(len(digits)-i-1)))
	}
	return v
}

func lib_GetEachDigitSumInt64(n int64) (sum int64) {
	for _, digit := range lib_ToDigitSliceInt64(n) {
		sum += int64(digit)
	}
	return
}

func lib_ToDigitSliceInt64(n int64) (digits []int8) {
	nn := int64(n)
	for {
		if nn <= 0 {
			return lib_ReverseInt8(digits)
		}
		digit := int8(nn % 10) // FIXME
		digits = append(digits, digit)
		nn /= 10
	}
}

func lib_DigitsToInt64(digits []int8) int64 {
	v := int64(0)
	for i, digit := range digits {
		v += int64(float64(digit) * math.Pow(10, float64(len(digits)-i-1)))
	}
	return v
}

func lib_GetEachDigitSumFloat32(n float32) (sum float32) {
	for _, digit := range lib_ToDigitSliceFloat32(n) {
		sum += float32(digit)
	}
	return
}

func lib_ToDigitSliceFloat32(n float32) (digits []int8) {
	nn := int64(n)
	for {
		if nn <= 0 {
			return lib_ReverseInt8(digits)
		}
		digit := int8(nn % 10) // FIXME
		digits = append(digits, digit)
		nn /= 10
	}
}

func lib_DigitsToFloat32(digits []int8) float32 {
	v := float32(0)
	for i, digit := range digits {
		v += float32(float64(digit) * math.Pow(10, float64(len(digits)-i-1)))
	}
	return v
}

func lib_GetEachDigitSumFloat64(n float64) (sum float64) {
	for _, digit := range lib_ToDigitSliceFloat64(n) {
		sum += float64(digit)
	}
	return
}

func lib_ToDigitSliceFloat64(n float64) (digits []int8) {
	nn := int64(n)
	for {
		if nn <= 0 {
			return lib_ReverseInt8(digits)
		}
		digit := int8(nn % 10) // FIXME
		digits = append(digits, digit)
		nn /= 10
	}
}

func lib_DigitsToFloat64(digits []int8) float64 {
	v := float64(0)
	for i, digit := range digits {
		v += float64(float64(digit) * math.Pow(10, float64(len(digits)-i-1)))
	}
	return v
}

func lib_SumInt(values []int) int {
	var sum int = 0
	for _, value := range values {
		sum += value
	}
	return sum
}

func lib_FilterInt(values []int, f func(v int) bool) (newValues []int) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_FilterIntSlice(values [][]int, f func(v []int) bool) (newValues [][]int) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_UniqInt(values []int) (newValues []int) {
	m := map[int]bool{}
	for _, value := range values {
		m[value] = true
	}

	for key := range m {
		newValues = append(newValues, key)
	}
	return
}

func lib_SubtractIntBy(values1 []int, values2 []int, f func(v int) int) (newValues []int, err error) {
	if len(values1) != len(values2) {
		return nil, errors.New("two values lengths are different")
	}

	for i := 0; i < len(values1); i++ {
		fValue1 := f(values1[i])
		fValue2 := f(values2[i])
		newValues = append(newValues, fValue1-fValue2)
	}
	return newValues, nil
}

func lib_SubtractInt(values1 []int, values2 []int) (newValues []int, err error) {
	return lib_SubtractIntBy(values1, values2, func(v int) int {
		return v
	})
}

func lib_RDiffIntBy(values []int, f func(v int) int) (newValues []int, err error) {
	diffValues := append([]int{0}, values...)
	newValues, err = lib_SubtractIntBy(values, diffValues[:len(diffValues)-1], f)
	if err != nil {
		return nil, fmt.Errorf("failed to RDiff: %v", err)
	}
	return newValues[1:], nil
}

func lib_RDiffInt(values []int) (newValues []int, err error) {
	return lib_RDiffIntBy(values, func(v int) int {
		return v
	})
}

func lib_StringToIntSlice(s string) (ValueLine []int, err error) {
	for _, r := range s {
		v, err := strconv.ParseInt(string(r), 10, 64)
		if err != nil {
			return nil, err
		}
		ValueLine = append(ValueLine, int(v))
	}
	return
}

func lib_StringSliceToIntSlice(line []string) (ValueLine []int, err error) {
	newLine, err := lib_toSpecificBitIntLine(line, 64)
	if err != nil {
		return nil, err
	}
	for _, v := range newLine {
		ValueLine = append(ValueLine, int(v))
	}
	return
}

func lib_MaxInt(values []int) (max int, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MaxIntVA(values ...int) (max int, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MinInt(values []int) (min int, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	min = values[0]
	for _, value := range values {
		if min > value {
			min = value
		}
	}
	return
}

func lib_NewIntGridMap(grid [][]string, defaultValue int) (m [][]int) {
	for _, line := range grid {
		var newLine []int
		for range line {
			newLine = append(newLine, defaultValue)
		}
		m = append(m, newLine)
	}
	return
}

func lib_IntRange(start, end, step int) []int {
	if end < start {
		return []int{}
	}
	s := make([]int, 0, int(1+(end-start)/step))
	for start < end {
		s = append(s, start)
		start += step
	}
	return s
}

func lib_SumInt8(values []int8) int8 {
	var sum int8 = 0
	for _, value := range values {
		sum += value
	}
	return sum
}

func lib_FilterInt8(values []int8, f func(v int8) bool) (newValues []int8) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_FilterInt8Slice(values [][]int8, f func(v []int8) bool) (newValues [][]int8) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_UniqInt8(values []int8) (newValues []int8) {
	m := map[int8]bool{}
	for _, value := range values {
		m[value] = true
	}

	for key := range m {
		newValues = append(newValues, key)
	}
	return
}

func lib_SubtractInt8By(values1 []int8, values2 []int8, f func(v int8) int8) (newValues []int8, err error) {
	if len(values1) != len(values2) {
		return nil, errors.New("two values lengths are different")
	}

	for i := 0; i < len(values1); i++ {
		fValue1 := f(values1[i])
		fValue2 := f(values2[i])
		newValues = append(newValues, fValue1-fValue2)
	}
	return newValues, nil
}

func lib_SubtractInt8(values1 []int8, values2 []int8) (newValues []int8, err error) {
	return lib_SubtractInt8By(values1, values2, func(v int8) int8 {
		return v
	})
}

func lib_RDiffInt8By(values []int8, f func(v int8) int8) (newValues []int8, err error) {
	diffValues := append([]int8{0}, values...)
	newValues, err = lib_SubtractInt8By(values, diffValues[:len(diffValues)-1], f)
	if err != nil {
		return nil, fmt.Errorf("failed to RDiff: %v", err)
	}
	return newValues[1:], nil
}

func lib_RDiffInt8(values []int8) (newValues []int8, err error) {
	return lib_RDiffInt8By(values, func(v int8) int8 {
		return v
	})
}

func lib_StringToInt8Slice(s string) (ValueLine []int8, err error) {
	for _, r := range s {
		v, err := strconv.ParseInt(string(r), 10, 64)
		if err != nil {
			return nil, err
		}
		ValueLine = append(ValueLine, int8(v))
	}
	return
}

func lib_StringSliceToInt8Slice(line []string) (ValueLine []int8, err error) {
	newLine, err := lib_toSpecificBitIntLine(line, 64)
	if err != nil {
		return nil, err
	}
	for _, v := range newLine {
		ValueLine = append(ValueLine, int8(v))
	}
	return
}

func lib_MaxInt8(values []int8) (max int8, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MaxInt8VA(values ...int8) (max int8, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MinInt8(values []int8) (min int8, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	min = values[0]
	for _, value := range values {
		if min > value {
			min = value
		}
	}
	return
}

func lib_NewInt8GridMap(grid [][]string, defaultValue int8) (m [][]int8) {
	for _, line := range grid {
		var newLine []int8
		for range line {
			newLine = append(newLine, defaultValue)
		}
		m = append(m, newLine)
	}
	return
}

func lib_Int8Range(start, end, step int8) []int8 {
	if end < start {
		return []int8{}
	}
	s := make([]int8, 0, int(1+(end-start)/step))
	for start < end {
		s = append(s, start)
		start += step
	}
	return s
}

func lib_SumInt16(values []int16) int16 {
	var sum int16 = 0
	for _, value := range values {
		sum += value
	}
	return sum
}

func lib_FilterInt16(values []int16, f func(v int16) bool) (newValues []int16) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_FilterInt16Slice(values [][]int16, f func(v []int16) bool) (newValues [][]int16) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_UniqInt16(values []int16) (newValues []int16) {
	m := map[int16]bool{}
	for _, value := range values {
		m[value] = true
	}

	for key := range m {
		newValues = append(newValues, key)
	}
	return
}

func lib_SubtractInt16By(values1 []int16, values2 []int16, f func(v int16) int16) (newValues []int16, err error) {
	if len(values1) != len(values2) {
		return nil, errors.New("two values lengths are different")
	}

	for i := 0; i < len(values1); i++ {
		fValue1 := f(values1[i])
		fValue2 := f(values2[i])
		newValues = append(newValues, fValue1-fValue2)
	}
	return newValues, nil
}

func lib_SubtractInt16(values1 []int16, values2 []int16) (newValues []int16, err error) {
	return lib_SubtractInt16By(values1, values2, func(v int16) int16 {
		return v
	})
}

func lib_RDiffInt16By(values []int16, f func(v int16) int16) (newValues []int16, err error) {
	diffValues := append([]int16{0}, values...)
	newValues, err = lib_SubtractInt16By(values, diffValues[:len(diffValues)-1], f)
	if err != nil {
		return nil, fmt.Errorf("failed to RDiff: %v", err)
	}
	return newValues[1:], nil
}

func lib_RDiffInt16(values []int16) (newValues []int16, err error) {
	return lib_RDiffInt16By(values, func(v int16) int16 {
		return v
	})
}

func lib_StringToInt16Slice(s string) (ValueLine []int16, err error) {
	for _, r := range s {
		v, err := strconv.ParseInt(string(r), 10, 64)
		if err != nil {
			return nil, err
		}
		ValueLine = append(ValueLine, int16(v))
	}
	return
}

func lib_StringSliceToInt16Slice(line []string) (ValueLine []int16, err error) {
	newLine, err := lib_toSpecificBitIntLine(line, 64)
	if err != nil {
		return nil, err
	}
	for _, v := range newLine {
		ValueLine = append(ValueLine, int16(v))
	}
	return
}

func lib_MaxInt16(values []int16) (max int16, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MaxInt16VA(values ...int16) (max int16, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MinInt16(values []int16) (min int16, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	min = values[0]
	for _, value := range values {
		if min > value {
			min = value
		}
	}
	return
}

func lib_NewInt16GridMap(grid [][]string, defaultValue int16) (m [][]int16) {
	for _, line := range grid {
		var newLine []int16
		for range line {
			newLine = append(newLine, defaultValue)
		}
		m = append(m, newLine)
	}
	return
}

func lib_Int16Range(start, end, step int16) []int16 {
	if end < start {
		return []int16{}
	}
	s := make([]int16, 0, int(1+(end-start)/step))
	for start < end {
		s = append(s, start)
		start += step
	}
	return s
}

func lib_SumInt32(values []int32) int32 {
	var sum int32 = 0
	for _, value := range values {
		sum += value
	}
	return sum
}

func lib_FilterInt32(values []int32, f func(v int32) bool) (newValues []int32) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_FilterInt32Slice(values [][]int32, f func(v []int32) bool) (newValues [][]int32) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_UniqInt32(values []int32) (newValues []int32) {
	m := map[int32]bool{}
	for _, value := range values {
		m[value] = true
	}

	for key := range m {
		newValues = append(newValues, key)
	}
	return
}

func lib_SubtractInt32By(values1 []int32, values2 []int32, f func(v int32) int32) (newValues []int32, err error) {
	if len(values1) != len(values2) {
		return nil, errors.New("two values lengths are different")
	}

	for i := 0; i < len(values1); i++ {
		fValue1 := f(values1[i])
		fValue2 := f(values2[i])
		newValues = append(newValues, fValue1-fValue2)
	}
	return newValues, nil
}

func lib_SubtractInt32(values1 []int32, values2 []int32) (newValues []int32, err error) {
	return lib_SubtractInt32By(values1, values2, func(v int32) int32 {
		return v
	})
}

func lib_RDiffInt32By(values []int32, f func(v int32) int32) (newValues []int32, err error) {
	diffValues := append([]int32{0}, values...)
	newValues, err = lib_SubtractInt32By(values, diffValues[:len(diffValues)-1], f)
	if err != nil {
		return nil, fmt.Errorf("failed to RDiff: %v", err)
	}
	return newValues[1:], nil
}

func lib_RDiffInt32(values []int32) (newValues []int32, err error) {
	return lib_RDiffInt32By(values, func(v int32) int32 {
		return v
	})
}

func lib_StringToInt32Slice(s string) (ValueLine []int32, err error) {
	for _, r := range s {
		v, err := strconv.ParseInt(string(r), 10, 64)
		if err != nil {
			return nil, err
		}
		ValueLine = append(ValueLine, int32(v))
	}
	return
}

func lib_StringSliceToInt32Slice(line []string) (ValueLine []int32, err error) {
	newLine, err := lib_toSpecificBitIntLine(line, 64)
	if err != nil {
		return nil, err
	}
	for _, v := range newLine {
		ValueLine = append(ValueLine, int32(v))
	}
	return
}

func lib_MaxInt32(values []int32) (max int32, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MaxInt32VA(values ...int32) (max int32, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MinInt32(values []int32) (min int32, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	min = values[0]
	for _, value := range values {
		if min > value {
			min = value
		}
	}
	return
}

func lib_NewInt32GridMap(grid [][]string, defaultValue int32) (m [][]int32) {
	for _, line := range grid {
		var newLine []int32
		for range line {
			newLine = append(newLine, defaultValue)
		}
		m = append(m, newLine)
	}
	return
}

func lib_Int32Range(start, end, step int32) []int32 {
	if end < start {
		return []int32{}
	}
	s := make([]int32, 0, int(1+(end-start)/step))
	for start < end {
		s = append(s, start)
		start += step
	}
	return s
}

func lib_SumInt64(values []int64) int64 {
	var sum int64 = 0
	for _, value := range values {
		sum += value
	}
	return sum
}

func lib_FilterInt64(values []int64, f func(v int64) bool) (newValues []int64) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_FilterInt64Slice(values [][]int64, f func(v []int64) bool) (newValues [][]int64) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_UniqInt64(values []int64) (newValues []int64) {
	m := map[int64]bool{}
	for _, value := range values {
		m[value] = true
	}

	for key := range m {
		newValues = append(newValues, key)
	}
	return
}

func lib_SubtractInt64By(values1 []int64, values2 []int64, f func(v int64) int64) (newValues []int64, err error) {
	if len(values1) != len(values2) {
		return nil, errors.New("two values lengths are different")
	}

	for i := 0; i < len(values1); i++ {
		fValue1 := f(values1[i])
		fValue2 := f(values2[i])
		newValues = append(newValues, fValue1-fValue2)
	}
	return newValues, nil
}

func lib_SubtractInt64(values1 []int64, values2 []int64) (newValues []int64, err error) {
	return lib_SubtractInt64By(values1, values2, func(v int64) int64 {
		return v
	})
}

func lib_RDiffInt64By(values []int64, f func(v int64) int64) (newValues []int64, err error) {
	diffValues := append([]int64{0}, values...)
	newValues, err = lib_SubtractInt64By(values, diffValues[:len(diffValues)-1], f)
	if err != nil {
		return nil, fmt.Errorf("failed to RDiff: %v", err)
	}
	return newValues[1:], nil
}

func lib_RDiffInt64(values []int64) (newValues []int64, err error) {
	return lib_RDiffInt64By(values, func(v int64) int64 {
		return v
	})
}

func lib_StringToInt64Slice(s string) (ValueLine []int64, err error) {
	for _, r := range s {
		v, err := strconv.ParseInt(string(r), 10, 64)
		if err != nil {
			return nil, err
		}
		ValueLine = append(ValueLine, int64(v))
	}
	return
}

func lib_StringSliceToInt64Slice(line []string) (ValueLine []int64, err error) {
	newLine, err := lib_toSpecificBitIntLine(line, 64)
	if err != nil {
		return nil, err
	}
	for _, v := range newLine {
		ValueLine = append(ValueLine, int64(v))
	}
	return
}

func lib_MaxInt64(values []int64) (max int64, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MaxInt64VA(values ...int64) (max int64, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MinInt64(values []int64) (min int64, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	min = values[0]
	for _, value := range values {
		if min > value {
			min = value
		}
	}
	return
}

func lib_NewInt64GridMap(grid [][]string, defaultValue int64) (m [][]int64) {
	for _, line := range grid {
		var newLine []int64
		for range line {
			newLine = append(newLine, defaultValue)
		}
		m = append(m, newLine)
	}
	return
}

func lib_Int64Range(start, end, step int64) []int64 {
	if end < start {
		return []int64{}
	}
	s := make([]int64, 0, int(1+(end-start)/step))
	for start < end {
		s = append(s, start)
		start += step
	}
	return s
}

func lib_SumFloat32(values []float32) float32 {
	var sum float32 = 0
	for _, value := range values {
		sum += value
	}
	return sum
}

func lib_FilterFloat32(values []float32, f func(v float32) bool) (newValues []float32) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_FilterFloat32Slice(values [][]float32, f func(v []float32) bool) (newValues [][]float32) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_UniqFloat32(values []float32) (newValues []float32) {
	m := map[float32]bool{}
	for _, value := range values {
		m[value] = true
	}

	for key := range m {
		newValues = append(newValues, key)
	}
	return
}

func lib_SubtractFloat32By(values1 []float32, values2 []float32, f func(v float32) float32) (newValues []float32, err error) {
	if len(values1) != len(values2) {
		return nil, errors.New("two values lengths are different")
	}

	for i := 0; i < len(values1); i++ {
		fValue1 := f(values1[i])
		fValue2 := f(values2[i])
		newValues = append(newValues, fValue1-fValue2)
	}
	return newValues, nil
}

func lib_SubtractFloat32(values1 []float32, values2 []float32) (newValues []float32, err error) {
	return lib_SubtractFloat32By(values1, values2, func(v float32) float32 {
		return v
	})
}

func lib_RDiffFloat32By(values []float32, f func(v float32) float32) (newValues []float32, err error) {
	diffValues := append([]float32{0}, values...)
	newValues, err = lib_SubtractFloat32By(values, diffValues[:len(diffValues)-1], f)
	if err != nil {
		return nil, fmt.Errorf("failed to RDiff: %v", err)
	}
	return newValues[1:], nil
}

func lib_RDiffFloat32(values []float32) (newValues []float32, err error) {
	return lib_RDiffFloat32By(values, func(v float32) float32 {
		return v
	})
}

func lib_StringToFloat32Slice(s string) (ValueLine []float32, err error) {
	for _, r := range s {
		v, err := strconv.ParseInt(string(r), 10, 64)
		if err != nil {
			return nil, err
		}
		ValueLine = append(ValueLine, float32(v))
	}
	return
}

func lib_StringSliceToFloat32Slice(line []string) (ValueLine []float32, err error) {
	newLine, err := lib_toSpecificBitIntLine(line, 64)
	if err != nil {
		return nil, err
	}
	for _, v := range newLine {
		ValueLine = append(ValueLine, float32(v))
	}
	return
}

func lib_MaxFloat32(values []float32) (max float32, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MaxFloat32VA(values ...float32) (max float32, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MinFloat32(values []float32) (min float32, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	min = values[0]
	for _, value := range values {
		if min > value {
			min = value
		}
	}
	return
}

func lib_NewFloat32GridMap(grid [][]string, defaultValue float32) (m [][]float32) {
	for _, line := range grid {
		var newLine []float32
		for range line {
			newLine = append(newLine, defaultValue)
		}
		m = append(m, newLine)
	}
	return
}

func lib_Float32Range(start, end, step float32) []float32 {
	if end < start {
		return []float32{}
	}
	s := make([]float32, 0, int(1+(end-start)/step))
	for start < end {
		s = append(s, start)
		start += step
	}
	return s
}

func lib_SumFloat64(values []float64) float64 {
	var sum float64 = 0
	for _, value := range values {
		sum += value
	}
	return sum
}

func lib_FilterFloat64(values []float64, f func(v float64) bool) (newValues []float64) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_FilterFloat64Slice(values [][]float64, f func(v []float64) bool) (newValues [][]float64) {
	for _, value := range values {
		if f(value) {
			newValues = append(newValues, value)
		}
	}
	return
}

func lib_UniqFloat64(values []float64) (newValues []float64) {
	m := map[float64]bool{}
	for _, value := range values {
		m[value] = true
	}

	for key := range m {
		newValues = append(newValues, key)
	}
	return
}

func lib_SubtractFloat64By(values1 []float64, values2 []float64, f func(v float64) float64) (newValues []float64, err error) {
	if len(values1) != len(values2) {
		return nil, errors.New("two values lengths are different")
	}

	for i := 0; i < len(values1); i++ {
		fValue1 := f(values1[i])
		fValue2 := f(values2[i])
		newValues = append(newValues, fValue1-fValue2)
	}
	return newValues, nil
}

func lib_SubtractFloat64(values1 []float64, values2 []float64) (newValues []float64, err error) {
	return lib_SubtractFloat64By(values1, values2, func(v float64) float64 {
		return v
	})
}

func lib_RDiffFloat64By(values []float64, f func(v float64) float64) (newValues []float64, err error) {
	diffValues := append([]float64{0}, values...)
	newValues, err = lib_SubtractFloat64By(values, diffValues[:len(diffValues)-1], f)
	if err != nil {
		return nil, fmt.Errorf("failed to RDiff: %v", err)
	}
	return newValues[1:], nil
}

func lib_RDiffFloat64(values []float64) (newValues []float64, err error) {
	return lib_RDiffFloat64By(values, func(v float64) float64 {
		return v
	})
}

func lib_StringToFloat64Slice(s string) (ValueLine []float64, err error) {
	for _, r := range s {
		v, err := strconv.ParseInt(string(r), 10, 64)
		if err != nil {
			return nil, err
		}
		ValueLine = append(ValueLine, float64(v))
	}
	return
}

func lib_StringSliceToFloat64Slice(line []string) (ValueLine []float64, err error) {
	newLine, err := lib_toSpecificBitIntLine(line, 64)
	if err != nil {
		return nil, err
	}
	for _, v := range newLine {
		ValueLine = append(ValueLine, float64(v))
	}
	return
}

func lib_MaxFloat64(values []float64) (max float64, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MaxFloat64VA(values ...float64) (max float64, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	max = values[0]
	for _, value := range values {
		if max < value {
			max = value
		}
	}
	return
}

func lib_MinFloat64(values []float64) (min float64, err error) {
	if len(values) == 0 {
		return 0, errors.New("empty slice is given")
	}

	min = values[0]
	for _, value := range values {
		if min > value {
			min = value
		}
	}
	return
}

func lib_NewFloat64GridMap(grid [][]string, defaultValue float64) (m [][]float64) {
	for _, line := range grid {
		var newLine []float64
		for range line {
			newLine = append(newLine, defaultValue)
		}
		m = append(m, newLine)
	}
	return
}

func lib_Float64Range(start, end, step float64) []float64 {
	if end < start {
		return []float64{}
	}
	s := make([]float64, 0, int(1+(end-start)/step))
	for start < end {
		s = append(s, start)
		start += step
	}
	return s
}

type lib_Int3ToIntCache map[int]map[int]map[int]int

func (c lib_Int3ToIntCache) Has(k1, k2, k3 int) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int3ToIntCache) Get(k1, k2, k3 int) (int, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int3ToIntCache) Set(k1, k2, k3 int, v int) int {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int]map[int]int{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int]int{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumIntByInt(values []int, f func(v int) int) int {
	var sum int = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_IntSliceToIntSlice(values []int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, int(value))
	}
	return
}

func lib_MapIntSliceToInt(values [][]int, f func(v []int) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapIntSlice2ToInt(values [][][]int, f func(v [][]int) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxIntByIntSlice(values [][]int, f func(vs []int) int) (max int, err error) {
	return lib_MaxInt(lib_MapIntSliceToInt(values, f))
}

func lib_MaxIntByIntSlice2(values [][][]int, f func(vs [][]int) int) (max int, err error) {
	return lib_MaxInt(lib_MapIntSlice2ToInt(values, f))
}

type lib_Int83ToIntCache map[int8]map[int8]map[int8]int

func (c lib_Int83ToIntCache) Has(k1, k2, k3 int8) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int83ToIntCache) Get(k1, k2, k3 int8) (int, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int83ToIntCache) Set(k1, k2, k3 int8, v int) int {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int8]map[int8]int{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int8]int{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumIntByInt8(values []int, f func(v int) int8) int8 {
	var sum int8 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_IntSliceToInt8Slice(values []int) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, int8(value))
	}
	return
}

func lib_MapInt8SliceToInt(values [][]int8, f func(v []int8) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt8Slice2ToInt(values [][][]int8, f func(v [][]int8) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxIntByInt8Slice(values [][]int8, f func(vs []int8) int) (max int, err error) {
	return lib_MaxInt(lib_MapInt8SliceToInt(values, f))
}

func lib_MaxIntByInt8Slice2(values [][][]int8, f func(vs [][]int8) int) (max int, err error) {
	return lib_MaxInt(lib_MapInt8Slice2ToInt(values, f))
}

type lib_Int163ToIntCache map[int16]map[int16]map[int16]int

func (c lib_Int163ToIntCache) Has(k1, k2, k3 int16) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int163ToIntCache) Get(k1, k2, k3 int16) (int, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int163ToIntCache) Set(k1, k2, k3 int16, v int) int {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int16]map[int16]int{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int16]int{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumIntByInt16(values []int, f func(v int) int16) int16 {
	var sum int16 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_IntSliceToInt16Slice(values []int) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, int16(value))
	}
	return
}

func lib_MapInt16SliceToInt(values [][]int16, f func(v []int16) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt16Slice2ToInt(values [][][]int16, f func(v [][]int16) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxIntByInt16Slice(values [][]int16, f func(vs []int16) int) (max int, err error) {
	return lib_MaxInt(lib_MapInt16SliceToInt(values, f))
}

func lib_MaxIntByInt16Slice2(values [][][]int16, f func(vs [][]int16) int) (max int, err error) {
	return lib_MaxInt(lib_MapInt16Slice2ToInt(values, f))
}

type lib_Int323ToIntCache map[int32]map[int32]map[int32]int

func (c lib_Int323ToIntCache) Has(k1, k2, k3 int32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int323ToIntCache) Get(k1, k2, k3 int32) (int, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int323ToIntCache) Set(k1, k2, k3 int32, v int) int {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int32]map[int32]int{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int32]int{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumIntByInt32(values []int, f func(v int) int32) int32 {
	var sum int32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_IntSliceToInt32Slice(values []int) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, int32(value))
	}
	return
}

func lib_MapInt32SliceToInt(values [][]int32, f func(v []int32) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt32Slice2ToInt(values [][][]int32, f func(v [][]int32) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxIntByInt32Slice(values [][]int32, f func(vs []int32) int) (max int, err error) {
	return lib_MaxInt(lib_MapInt32SliceToInt(values, f))
}

func lib_MaxIntByInt32Slice2(values [][][]int32, f func(vs [][]int32) int) (max int, err error) {
	return lib_MaxInt(lib_MapInt32Slice2ToInt(values, f))
}

type lib_Int643ToIntCache map[int64]map[int64]map[int64]int

func (c lib_Int643ToIntCache) Has(k1, k2, k3 int64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int643ToIntCache) Get(k1, k2, k3 int64) (int, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int643ToIntCache) Set(k1, k2, k3 int64, v int) int {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int64]map[int64]int{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int64]int{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumIntByInt64(values []int, f func(v int) int64) int64 {
	var sum int64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_IntSliceToInt64Slice(values []int) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, int64(value))
	}
	return
}

func lib_MapInt64SliceToInt(values [][]int64, f func(v []int64) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt64Slice2ToInt(values [][][]int64, f func(v [][]int64) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxIntByInt64Slice(values [][]int64, f func(vs []int64) int) (max int, err error) {
	return lib_MaxInt(lib_MapInt64SliceToInt(values, f))
}

func lib_MaxIntByInt64Slice2(values [][][]int64, f func(vs [][]int64) int) (max int, err error) {
	return lib_MaxInt(lib_MapInt64Slice2ToInt(values, f))
}

type lib_Float323ToIntCache map[float32]map[float32]map[float32]int

func (c lib_Float323ToIntCache) Has(k1, k2, k3 float32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float323ToIntCache) Get(k1, k2, k3 float32) (int, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float323ToIntCache) Set(k1, k2, k3 float32, v int) int {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float32]map[float32]int{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float32]int{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumIntByFloat32(values []int, f func(v int) float32) float32 {
	var sum float32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_IntSliceToFloat32Slice(values []int) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, float32(value))
	}
	return
}

func lib_MapFloat32SliceToInt(values [][]float32, f func(v []float32) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat32Slice2ToInt(values [][][]float32, f func(v [][]float32) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxIntByFloat32Slice(values [][]float32, f func(vs []float32) int) (max int, err error) {
	return lib_MaxInt(lib_MapFloat32SliceToInt(values, f))
}

func lib_MaxIntByFloat32Slice2(values [][][]float32, f func(vs [][]float32) int) (max int, err error) {
	return lib_MaxInt(lib_MapFloat32Slice2ToInt(values, f))
}

type lib_Float643ToIntCache map[float64]map[float64]map[float64]int

func (c lib_Float643ToIntCache) Has(k1, k2, k3 float64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float643ToIntCache) Get(k1, k2, k3 float64) (int, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float643ToIntCache) Set(k1, k2, k3 float64, v int) int {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float64]map[float64]int{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float64]int{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumIntByFloat64(values []int, f func(v int) float64) float64 {
	var sum float64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_IntSliceToFloat64Slice(values []int) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, float64(value))
	}
	return
}

func lib_MapFloat64SliceToInt(values [][]float64, f func(v []float64) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat64Slice2ToInt(values [][][]float64, f func(v [][]float64) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxIntByFloat64Slice(values [][]float64, f func(vs []float64) int) (max int, err error) {
	return lib_MaxInt(lib_MapFloat64SliceToInt(values, f))
}

func lib_MaxIntByFloat64Slice2(values [][][]float64, f func(vs [][]float64) int) (max int, err error) {
	return lib_MaxInt(lib_MapFloat64Slice2ToInt(values, f))
}

type lib_Int3ToInt8Cache map[int]map[int]map[int]int8

func (c lib_Int3ToInt8Cache) Has(k1, k2, k3 int) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int3ToInt8Cache) Get(k1, k2, k3 int) (int8, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int3ToInt8Cache) Set(k1, k2, k3 int, v int8) int8 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int]map[int]int8{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int]int8{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt8ByInt(values []int8, f func(v int8) int) int {
	var sum int = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int8SliceToIntSlice(values []int8) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, int(value))
	}
	return
}

func lib_MapIntSliceToInt8(values [][]int, f func(v []int) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapIntSlice2ToInt8(values [][][]int, f func(v [][]int) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt8ByIntSlice(values [][]int, f func(vs []int) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapIntSliceToInt8(values, f))
}

func lib_MaxInt8ByIntSlice2(values [][][]int, f func(vs [][]int) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapIntSlice2ToInt8(values, f))
}

type lib_Int83ToInt8Cache map[int8]map[int8]map[int8]int8

func (c lib_Int83ToInt8Cache) Has(k1, k2, k3 int8) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int83ToInt8Cache) Get(k1, k2, k3 int8) (int8, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int83ToInt8Cache) Set(k1, k2, k3 int8, v int8) int8 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int8]map[int8]int8{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int8]int8{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt8ByInt8(values []int8, f func(v int8) int8) int8 {
	var sum int8 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int8SliceToInt8Slice(values []int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, int8(value))
	}
	return
}

func lib_MapInt8SliceToInt8(values [][]int8, f func(v []int8) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt8Slice2ToInt8(values [][][]int8, f func(v [][]int8) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt8ByInt8Slice(values [][]int8, f func(vs []int8) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapInt8SliceToInt8(values, f))
}

func lib_MaxInt8ByInt8Slice2(values [][][]int8, f func(vs [][]int8) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapInt8Slice2ToInt8(values, f))
}

type lib_Int163ToInt8Cache map[int16]map[int16]map[int16]int8

func (c lib_Int163ToInt8Cache) Has(k1, k2, k3 int16) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int163ToInt8Cache) Get(k1, k2, k3 int16) (int8, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int163ToInt8Cache) Set(k1, k2, k3 int16, v int8) int8 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int16]map[int16]int8{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int16]int8{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt8ByInt16(values []int8, f func(v int8) int16) int16 {
	var sum int16 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int8SliceToInt16Slice(values []int8) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, int16(value))
	}
	return
}

func lib_MapInt16SliceToInt8(values [][]int16, f func(v []int16) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt16Slice2ToInt8(values [][][]int16, f func(v [][]int16) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt8ByInt16Slice(values [][]int16, f func(vs []int16) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapInt16SliceToInt8(values, f))
}

func lib_MaxInt8ByInt16Slice2(values [][][]int16, f func(vs [][]int16) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapInt16Slice2ToInt8(values, f))
}

type lib_Int323ToInt8Cache map[int32]map[int32]map[int32]int8

func (c lib_Int323ToInt8Cache) Has(k1, k2, k3 int32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int323ToInt8Cache) Get(k1, k2, k3 int32) (int8, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int323ToInt8Cache) Set(k1, k2, k3 int32, v int8) int8 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int32]map[int32]int8{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int32]int8{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt8ByInt32(values []int8, f func(v int8) int32) int32 {
	var sum int32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int8SliceToInt32Slice(values []int8) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, int32(value))
	}
	return
}

func lib_MapInt32SliceToInt8(values [][]int32, f func(v []int32) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt32Slice2ToInt8(values [][][]int32, f func(v [][]int32) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt8ByInt32Slice(values [][]int32, f func(vs []int32) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapInt32SliceToInt8(values, f))
}

func lib_MaxInt8ByInt32Slice2(values [][][]int32, f func(vs [][]int32) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapInt32Slice2ToInt8(values, f))
}

type lib_Int643ToInt8Cache map[int64]map[int64]map[int64]int8

func (c lib_Int643ToInt8Cache) Has(k1, k2, k3 int64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int643ToInt8Cache) Get(k1, k2, k3 int64) (int8, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int643ToInt8Cache) Set(k1, k2, k3 int64, v int8) int8 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int64]map[int64]int8{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int64]int8{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt8ByInt64(values []int8, f func(v int8) int64) int64 {
	var sum int64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int8SliceToInt64Slice(values []int8) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, int64(value))
	}
	return
}

func lib_MapInt64SliceToInt8(values [][]int64, f func(v []int64) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt64Slice2ToInt8(values [][][]int64, f func(v [][]int64) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt8ByInt64Slice(values [][]int64, f func(vs []int64) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapInt64SliceToInt8(values, f))
}

func lib_MaxInt8ByInt64Slice2(values [][][]int64, f func(vs [][]int64) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapInt64Slice2ToInt8(values, f))
}

type lib_Float323ToInt8Cache map[float32]map[float32]map[float32]int8

func (c lib_Float323ToInt8Cache) Has(k1, k2, k3 float32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float323ToInt8Cache) Get(k1, k2, k3 float32) (int8, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float323ToInt8Cache) Set(k1, k2, k3 float32, v int8) int8 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float32]map[float32]int8{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float32]int8{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt8ByFloat32(values []int8, f func(v int8) float32) float32 {
	var sum float32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int8SliceToFloat32Slice(values []int8) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, float32(value))
	}
	return
}

func lib_MapFloat32SliceToInt8(values [][]float32, f func(v []float32) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat32Slice2ToInt8(values [][][]float32, f func(v [][]float32) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt8ByFloat32Slice(values [][]float32, f func(vs []float32) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapFloat32SliceToInt8(values, f))
}

func lib_MaxInt8ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapFloat32Slice2ToInt8(values, f))
}

type lib_Float643ToInt8Cache map[float64]map[float64]map[float64]int8

func (c lib_Float643ToInt8Cache) Has(k1, k2, k3 float64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float643ToInt8Cache) Get(k1, k2, k3 float64) (int8, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float643ToInt8Cache) Set(k1, k2, k3 float64, v int8) int8 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float64]map[float64]int8{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float64]int8{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt8ByFloat64(values []int8, f func(v int8) float64) float64 {
	var sum float64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int8SliceToFloat64Slice(values []int8) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, float64(value))
	}
	return
}

func lib_MapFloat64SliceToInt8(values [][]float64, f func(v []float64) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat64Slice2ToInt8(values [][][]float64, f func(v [][]float64) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt8ByFloat64Slice(values [][]float64, f func(vs []float64) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapFloat64SliceToInt8(values, f))
}

func lib_MaxInt8ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) int8) (max int8, err error) {
	return lib_MaxInt8(lib_MapFloat64Slice2ToInt8(values, f))
}

type lib_Int3ToInt16Cache map[int]map[int]map[int]int16

func (c lib_Int3ToInt16Cache) Has(k1, k2, k3 int) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int3ToInt16Cache) Get(k1, k2, k3 int) (int16, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int3ToInt16Cache) Set(k1, k2, k3 int, v int16) int16 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int]map[int]int16{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int]int16{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt16ByInt(values []int16, f func(v int16) int) int {
	var sum int = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int16SliceToIntSlice(values []int16) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, int(value))
	}
	return
}

func lib_MapIntSliceToInt16(values [][]int, f func(v []int) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapIntSlice2ToInt16(values [][][]int, f func(v [][]int) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt16ByIntSlice(values [][]int, f func(vs []int) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapIntSliceToInt16(values, f))
}

func lib_MaxInt16ByIntSlice2(values [][][]int, f func(vs [][]int) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapIntSlice2ToInt16(values, f))
}

type lib_Int83ToInt16Cache map[int8]map[int8]map[int8]int16

func (c lib_Int83ToInt16Cache) Has(k1, k2, k3 int8) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int83ToInt16Cache) Get(k1, k2, k3 int8) (int16, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int83ToInt16Cache) Set(k1, k2, k3 int8, v int16) int16 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int8]map[int8]int16{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int8]int16{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt16ByInt8(values []int16, f func(v int16) int8) int8 {
	var sum int8 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int16SliceToInt8Slice(values []int16) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, int8(value))
	}
	return
}

func lib_MapInt8SliceToInt16(values [][]int8, f func(v []int8) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt8Slice2ToInt16(values [][][]int8, f func(v [][]int8) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt16ByInt8Slice(values [][]int8, f func(vs []int8) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapInt8SliceToInt16(values, f))
}

func lib_MaxInt16ByInt8Slice2(values [][][]int8, f func(vs [][]int8) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapInt8Slice2ToInt16(values, f))
}

type lib_Int163ToInt16Cache map[int16]map[int16]map[int16]int16

func (c lib_Int163ToInt16Cache) Has(k1, k2, k3 int16) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int163ToInt16Cache) Get(k1, k2, k3 int16) (int16, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int163ToInt16Cache) Set(k1, k2, k3 int16, v int16) int16 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int16]map[int16]int16{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int16]int16{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt16ByInt16(values []int16, f func(v int16) int16) int16 {
	var sum int16 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int16SliceToInt16Slice(values []int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, int16(value))
	}
	return
}

func lib_MapInt16SliceToInt16(values [][]int16, f func(v []int16) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt16Slice2ToInt16(values [][][]int16, f func(v [][]int16) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt16ByInt16Slice(values [][]int16, f func(vs []int16) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapInt16SliceToInt16(values, f))
}

func lib_MaxInt16ByInt16Slice2(values [][][]int16, f func(vs [][]int16) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapInt16Slice2ToInt16(values, f))
}

type lib_Int323ToInt16Cache map[int32]map[int32]map[int32]int16

func (c lib_Int323ToInt16Cache) Has(k1, k2, k3 int32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int323ToInt16Cache) Get(k1, k2, k3 int32) (int16, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int323ToInt16Cache) Set(k1, k2, k3 int32, v int16) int16 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int32]map[int32]int16{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int32]int16{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt16ByInt32(values []int16, f func(v int16) int32) int32 {
	var sum int32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int16SliceToInt32Slice(values []int16) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, int32(value))
	}
	return
}

func lib_MapInt32SliceToInt16(values [][]int32, f func(v []int32) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt32Slice2ToInt16(values [][][]int32, f func(v [][]int32) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt16ByInt32Slice(values [][]int32, f func(vs []int32) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapInt32SliceToInt16(values, f))
}

func lib_MaxInt16ByInt32Slice2(values [][][]int32, f func(vs [][]int32) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapInt32Slice2ToInt16(values, f))
}

type lib_Int643ToInt16Cache map[int64]map[int64]map[int64]int16

func (c lib_Int643ToInt16Cache) Has(k1, k2, k3 int64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int643ToInt16Cache) Get(k1, k2, k3 int64) (int16, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int643ToInt16Cache) Set(k1, k2, k3 int64, v int16) int16 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int64]map[int64]int16{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int64]int16{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt16ByInt64(values []int16, f func(v int16) int64) int64 {
	var sum int64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int16SliceToInt64Slice(values []int16) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, int64(value))
	}
	return
}

func lib_MapInt64SliceToInt16(values [][]int64, f func(v []int64) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt64Slice2ToInt16(values [][][]int64, f func(v [][]int64) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt16ByInt64Slice(values [][]int64, f func(vs []int64) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapInt64SliceToInt16(values, f))
}

func lib_MaxInt16ByInt64Slice2(values [][][]int64, f func(vs [][]int64) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapInt64Slice2ToInt16(values, f))
}

type lib_Float323ToInt16Cache map[float32]map[float32]map[float32]int16

func (c lib_Float323ToInt16Cache) Has(k1, k2, k3 float32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float323ToInt16Cache) Get(k1, k2, k3 float32) (int16, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float323ToInt16Cache) Set(k1, k2, k3 float32, v int16) int16 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float32]map[float32]int16{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float32]int16{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt16ByFloat32(values []int16, f func(v int16) float32) float32 {
	var sum float32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int16SliceToFloat32Slice(values []int16) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, float32(value))
	}
	return
}

func lib_MapFloat32SliceToInt16(values [][]float32, f func(v []float32) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat32Slice2ToInt16(values [][][]float32, f func(v [][]float32) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt16ByFloat32Slice(values [][]float32, f func(vs []float32) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapFloat32SliceToInt16(values, f))
}

func lib_MaxInt16ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapFloat32Slice2ToInt16(values, f))
}

type lib_Float643ToInt16Cache map[float64]map[float64]map[float64]int16

func (c lib_Float643ToInt16Cache) Has(k1, k2, k3 float64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float643ToInt16Cache) Get(k1, k2, k3 float64) (int16, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float643ToInt16Cache) Set(k1, k2, k3 float64, v int16) int16 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float64]map[float64]int16{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float64]int16{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt16ByFloat64(values []int16, f func(v int16) float64) float64 {
	var sum float64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int16SliceToFloat64Slice(values []int16) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, float64(value))
	}
	return
}

func lib_MapFloat64SliceToInt16(values [][]float64, f func(v []float64) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat64Slice2ToInt16(values [][][]float64, f func(v [][]float64) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt16ByFloat64Slice(values [][]float64, f func(vs []float64) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapFloat64SliceToInt16(values, f))
}

func lib_MaxInt16ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) int16) (max int16, err error) {
	return lib_MaxInt16(lib_MapFloat64Slice2ToInt16(values, f))
}

type lib_Int3ToInt32Cache map[int]map[int]map[int]int32

func (c lib_Int3ToInt32Cache) Has(k1, k2, k3 int) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int3ToInt32Cache) Get(k1, k2, k3 int) (int32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int3ToInt32Cache) Set(k1, k2, k3 int, v int32) int32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int]map[int]int32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int]int32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt32ByInt(values []int32, f func(v int32) int) int {
	var sum int = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int32SliceToIntSlice(values []int32) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, int(value))
	}
	return
}

func lib_MapIntSliceToInt32(values [][]int, f func(v []int) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapIntSlice2ToInt32(values [][][]int, f func(v [][]int) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt32ByIntSlice(values [][]int, f func(vs []int) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapIntSliceToInt32(values, f))
}

func lib_MaxInt32ByIntSlice2(values [][][]int, f func(vs [][]int) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapIntSlice2ToInt32(values, f))
}

type lib_Int83ToInt32Cache map[int8]map[int8]map[int8]int32

func (c lib_Int83ToInt32Cache) Has(k1, k2, k3 int8) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int83ToInt32Cache) Get(k1, k2, k3 int8) (int32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int83ToInt32Cache) Set(k1, k2, k3 int8, v int32) int32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int8]map[int8]int32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int8]int32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt32ByInt8(values []int32, f func(v int32) int8) int8 {
	var sum int8 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int32SliceToInt8Slice(values []int32) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, int8(value))
	}
	return
}

func lib_MapInt8SliceToInt32(values [][]int8, f func(v []int8) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt8Slice2ToInt32(values [][][]int8, f func(v [][]int8) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt32ByInt8Slice(values [][]int8, f func(vs []int8) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapInt8SliceToInt32(values, f))
}

func lib_MaxInt32ByInt8Slice2(values [][][]int8, f func(vs [][]int8) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapInt8Slice2ToInt32(values, f))
}

type lib_Int163ToInt32Cache map[int16]map[int16]map[int16]int32

func (c lib_Int163ToInt32Cache) Has(k1, k2, k3 int16) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int163ToInt32Cache) Get(k1, k2, k3 int16) (int32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int163ToInt32Cache) Set(k1, k2, k3 int16, v int32) int32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int16]map[int16]int32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int16]int32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt32ByInt16(values []int32, f func(v int32) int16) int16 {
	var sum int16 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int32SliceToInt16Slice(values []int32) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, int16(value))
	}
	return
}

func lib_MapInt16SliceToInt32(values [][]int16, f func(v []int16) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt16Slice2ToInt32(values [][][]int16, f func(v [][]int16) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt32ByInt16Slice(values [][]int16, f func(vs []int16) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapInt16SliceToInt32(values, f))
}

func lib_MaxInt32ByInt16Slice2(values [][][]int16, f func(vs [][]int16) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapInt16Slice2ToInt32(values, f))
}

type lib_Int323ToInt32Cache map[int32]map[int32]map[int32]int32

func (c lib_Int323ToInt32Cache) Has(k1, k2, k3 int32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int323ToInt32Cache) Get(k1, k2, k3 int32) (int32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int323ToInt32Cache) Set(k1, k2, k3 int32, v int32) int32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int32]map[int32]int32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int32]int32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt32ByInt32(values []int32, f func(v int32) int32) int32 {
	var sum int32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int32SliceToInt32Slice(values []int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, int32(value))
	}
	return
}

func lib_MapInt32SliceToInt32(values [][]int32, f func(v []int32) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt32Slice2ToInt32(values [][][]int32, f func(v [][]int32) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt32ByInt32Slice(values [][]int32, f func(vs []int32) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapInt32SliceToInt32(values, f))
}

func lib_MaxInt32ByInt32Slice2(values [][][]int32, f func(vs [][]int32) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapInt32Slice2ToInt32(values, f))
}

type lib_Int643ToInt32Cache map[int64]map[int64]map[int64]int32

func (c lib_Int643ToInt32Cache) Has(k1, k2, k3 int64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int643ToInt32Cache) Get(k1, k2, k3 int64) (int32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int643ToInt32Cache) Set(k1, k2, k3 int64, v int32) int32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int64]map[int64]int32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int64]int32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt32ByInt64(values []int32, f func(v int32) int64) int64 {
	var sum int64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int32SliceToInt64Slice(values []int32) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, int64(value))
	}
	return
}

func lib_MapInt64SliceToInt32(values [][]int64, f func(v []int64) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt64Slice2ToInt32(values [][][]int64, f func(v [][]int64) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt32ByInt64Slice(values [][]int64, f func(vs []int64) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapInt64SliceToInt32(values, f))
}

func lib_MaxInt32ByInt64Slice2(values [][][]int64, f func(vs [][]int64) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapInt64Slice2ToInt32(values, f))
}

type lib_Float323ToInt32Cache map[float32]map[float32]map[float32]int32

func (c lib_Float323ToInt32Cache) Has(k1, k2, k3 float32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float323ToInt32Cache) Get(k1, k2, k3 float32) (int32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float323ToInt32Cache) Set(k1, k2, k3 float32, v int32) int32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float32]map[float32]int32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float32]int32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt32ByFloat32(values []int32, f func(v int32) float32) float32 {
	var sum float32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int32SliceToFloat32Slice(values []int32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, float32(value))
	}
	return
}

func lib_MapFloat32SliceToInt32(values [][]float32, f func(v []float32) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat32Slice2ToInt32(values [][][]float32, f func(v [][]float32) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt32ByFloat32Slice(values [][]float32, f func(vs []float32) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapFloat32SliceToInt32(values, f))
}

func lib_MaxInt32ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapFloat32Slice2ToInt32(values, f))
}

type lib_Float643ToInt32Cache map[float64]map[float64]map[float64]int32

func (c lib_Float643ToInt32Cache) Has(k1, k2, k3 float64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float643ToInt32Cache) Get(k1, k2, k3 float64) (int32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float643ToInt32Cache) Set(k1, k2, k3 float64, v int32) int32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float64]map[float64]int32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float64]int32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt32ByFloat64(values []int32, f func(v int32) float64) float64 {
	var sum float64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int32SliceToFloat64Slice(values []int32) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, float64(value))
	}
	return
}

func lib_MapFloat64SliceToInt32(values [][]float64, f func(v []float64) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat64Slice2ToInt32(values [][][]float64, f func(v [][]float64) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt32ByFloat64Slice(values [][]float64, f func(vs []float64) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapFloat64SliceToInt32(values, f))
}

func lib_MaxInt32ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) int32) (max int32, err error) {
	return lib_MaxInt32(lib_MapFloat64Slice2ToInt32(values, f))
}

type lib_Int3ToInt64Cache map[int]map[int]map[int]int64

func (c lib_Int3ToInt64Cache) Has(k1, k2, k3 int) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int3ToInt64Cache) Get(k1, k2, k3 int) (int64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int3ToInt64Cache) Set(k1, k2, k3 int, v int64) int64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int]map[int]int64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int]int64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt64ByInt(values []int64, f func(v int64) int) int {
	var sum int = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int64SliceToIntSlice(values []int64) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, int(value))
	}
	return
}

func lib_MapIntSliceToInt64(values [][]int, f func(v []int) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapIntSlice2ToInt64(values [][][]int, f func(v [][]int) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt64ByIntSlice(values [][]int, f func(vs []int) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapIntSliceToInt64(values, f))
}

func lib_MaxInt64ByIntSlice2(values [][][]int, f func(vs [][]int) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapIntSlice2ToInt64(values, f))
}

type lib_Int83ToInt64Cache map[int8]map[int8]map[int8]int64

func (c lib_Int83ToInt64Cache) Has(k1, k2, k3 int8) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int83ToInt64Cache) Get(k1, k2, k3 int8) (int64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int83ToInt64Cache) Set(k1, k2, k3 int8, v int64) int64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int8]map[int8]int64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int8]int64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt64ByInt8(values []int64, f func(v int64) int8) int8 {
	var sum int8 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int64SliceToInt8Slice(values []int64) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, int8(value))
	}
	return
}

func lib_MapInt8SliceToInt64(values [][]int8, f func(v []int8) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt8Slice2ToInt64(values [][][]int8, f func(v [][]int8) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt64ByInt8Slice(values [][]int8, f func(vs []int8) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapInt8SliceToInt64(values, f))
}

func lib_MaxInt64ByInt8Slice2(values [][][]int8, f func(vs [][]int8) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapInt8Slice2ToInt64(values, f))
}

type lib_Int163ToInt64Cache map[int16]map[int16]map[int16]int64

func (c lib_Int163ToInt64Cache) Has(k1, k2, k3 int16) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int163ToInt64Cache) Get(k1, k2, k3 int16) (int64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int163ToInt64Cache) Set(k1, k2, k3 int16, v int64) int64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int16]map[int16]int64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int16]int64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt64ByInt16(values []int64, f func(v int64) int16) int16 {
	var sum int16 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int64SliceToInt16Slice(values []int64) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, int16(value))
	}
	return
}

func lib_MapInt16SliceToInt64(values [][]int16, f func(v []int16) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt16Slice2ToInt64(values [][][]int16, f func(v [][]int16) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt64ByInt16Slice(values [][]int16, f func(vs []int16) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapInt16SliceToInt64(values, f))
}

func lib_MaxInt64ByInt16Slice2(values [][][]int16, f func(vs [][]int16) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapInt16Slice2ToInt64(values, f))
}

type lib_Int323ToInt64Cache map[int32]map[int32]map[int32]int64

func (c lib_Int323ToInt64Cache) Has(k1, k2, k3 int32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int323ToInt64Cache) Get(k1, k2, k3 int32) (int64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int323ToInt64Cache) Set(k1, k2, k3 int32, v int64) int64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int32]map[int32]int64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int32]int64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt64ByInt32(values []int64, f func(v int64) int32) int32 {
	var sum int32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int64SliceToInt32Slice(values []int64) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, int32(value))
	}
	return
}

func lib_MapInt32SliceToInt64(values [][]int32, f func(v []int32) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt32Slice2ToInt64(values [][][]int32, f func(v [][]int32) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt64ByInt32Slice(values [][]int32, f func(vs []int32) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapInt32SliceToInt64(values, f))
}

func lib_MaxInt64ByInt32Slice2(values [][][]int32, f func(vs [][]int32) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapInt32Slice2ToInt64(values, f))
}

type lib_Int643ToInt64Cache map[int64]map[int64]map[int64]int64

func (c lib_Int643ToInt64Cache) Has(k1, k2, k3 int64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int643ToInt64Cache) Get(k1, k2, k3 int64) (int64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int643ToInt64Cache) Set(k1, k2, k3 int64, v int64) int64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int64]map[int64]int64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int64]int64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt64ByInt64(values []int64, f func(v int64) int64) int64 {
	var sum int64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int64SliceToInt64Slice(values []int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, int64(value))
	}
	return
}

func lib_MapInt64SliceToInt64(values [][]int64, f func(v []int64) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt64Slice2ToInt64(values [][][]int64, f func(v [][]int64) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt64ByInt64Slice(values [][]int64, f func(vs []int64) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapInt64SliceToInt64(values, f))
}

func lib_MaxInt64ByInt64Slice2(values [][][]int64, f func(vs [][]int64) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapInt64Slice2ToInt64(values, f))
}

type lib_Float323ToInt64Cache map[float32]map[float32]map[float32]int64

func (c lib_Float323ToInt64Cache) Has(k1, k2, k3 float32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float323ToInt64Cache) Get(k1, k2, k3 float32) (int64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float323ToInt64Cache) Set(k1, k2, k3 float32, v int64) int64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float32]map[float32]int64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float32]int64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt64ByFloat32(values []int64, f func(v int64) float32) float32 {
	var sum float32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int64SliceToFloat32Slice(values []int64) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, float32(value))
	}
	return
}

func lib_MapFloat32SliceToInt64(values [][]float32, f func(v []float32) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat32Slice2ToInt64(values [][][]float32, f func(v [][]float32) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt64ByFloat32Slice(values [][]float32, f func(vs []float32) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapFloat32SliceToInt64(values, f))
}

func lib_MaxInt64ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapFloat32Slice2ToInt64(values, f))
}

type lib_Float643ToInt64Cache map[float64]map[float64]map[float64]int64

func (c lib_Float643ToInt64Cache) Has(k1, k2, k3 float64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float643ToInt64Cache) Get(k1, k2, k3 float64) (int64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float643ToInt64Cache) Set(k1, k2, k3 float64, v int64) int64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float64]map[float64]int64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float64]int64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumInt64ByFloat64(values []int64, f func(v int64) float64) float64 {
	var sum float64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Int64SliceToFloat64Slice(values []int64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, float64(value))
	}
	return
}

func lib_MapFloat64SliceToInt64(values [][]float64, f func(v []float64) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat64Slice2ToInt64(values [][][]float64, f func(v [][]float64) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxInt64ByFloat64Slice(values [][]float64, f func(vs []float64) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapFloat64SliceToInt64(values, f))
}

func lib_MaxInt64ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) int64) (max int64, err error) {
	return lib_MaxInt64(lib_MapFloat64Slice2ToInt64(values, f))
}

type lib_Int3ToFloat32Cache map[int]map[int]map[int]float32

func (c lib_Int3ToFloat32Cache) Has(k1, k2, k3 int) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int3ToFloat32Cache) Get(k1, k2, k3 int) (float32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int3ToFloat32Cache) Set(k1, k2, k3 int, v float32) float32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int]map[int]float32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int]float32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat32ByInt(values []float32, f func(v float32) int) int {
	var sum int = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float32SliceToIntSlice(values []float32) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, int(value))
	}
	return
}

func lib_MapIntSliceToFloat32(values [][]int, f func(v []int) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapIntSlice2ToFloat32(values [][][]int, f func(v [][]int) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat32ByIntSlice(values [][]int, f func(vs []int) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapIntSliceToFloat32(values, f))
}

func lib_MaxFloat32ByIntSlice2(values [][][]int, f func(vs [][]int) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapIntSlice2ToFloat32(values, f))
}

type lib_Int83ToFloat32Cache map[int8]map[int8]map[int8]float32

func (c lib_Int83ToFloat32Cache) Has(k1, k2, k3 int8) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int83ToFloat32Cache) Get(k1, k2, k3 int8) (float32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int83ToFloat32Cache) Set(k1, k2, k3 int8, v float32) float32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int8]map[int8]float32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int8]float32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat32ByInt8(values []float32, f func(v float32) int8) int8 {
	var sum int8 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float32SliceToInt8Slice(values []float32) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, int8(value))
	}
	return
}

func lib_MapInt8SliceToFloat32(values [][]int8, f func(v []int8) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt8Slice2ToFloat32(values [][][]int8, f func(v [][]int8) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat32ByInt8Slice(values [][]int8, f func(vs []int8) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapInt8SliceToFloat32(values, f))
}

func lib_MaxFloat32ByInt8Slice2(values [][][]int8, f func(vs [][]int8) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapInt8Slice2ToFloat32(values, f))
}

type lib_Int163ToFloat32Cache map[int16]map[int16]map[int16]float32

func (c lib_Int163ToFloat32Cache) Has(k1, k2, k3 int16) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int163ToFloat32Cache) Get(k1, k2, k3 int16) (float32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int163ToFloat32Cache) Set(k1, k2, k3 int16, v float32) float32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int16]map[int16]float32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int16]float32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat32ByInt16(values []float32, f func(v float32) int16) int16 {
	var sum int16 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float32SliceToInt16Slice(values []float32) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, int16(value))
	}
	return
}

func lib_MapInt16SliceToFloat32(values [][]int16, f func(v []int16) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt16Slice2ToFloat32(values [][][]int16, f func(v [][]int16) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat32ByInt16Slice(values [][]int16, f func(vs []int16) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapInt16SliceToFloat32(values, f))
}

func lib_MaxFloat32ByInt16Slice2(values [][][]int16, f func(vs [][]int16) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapInt16Slice2ToFloat32(values, f))
}

type lib_Int323ToFloat32Cache map[int32]map[int32]map[int32]float32

func (c lib_Int323ToFloat32Cache) Has(k1, k2, k3 int32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int323ToFloat32Cache) Get(k1, k2, k3 int32) (float32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int323ToFloat32Cache) Set(k1, k2, k3 int32, v float32) float32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int32]map[int32]float32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int32]float32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat32ByInt32(values []float32, f func(v float32) int32) int32 {
	var sum int32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float32SliceToInt32Slice(values []float32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, int32(value))
	}
	return
}

func lib_MapInt32SliceToFloat32(values [][]int32, f func(v []int32) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt32Slice2ToFloat32(values [][][]int32, f func(v [][]int32) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat32ByInt32Slice(values [][]int32, f func(vs []int32) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapInt32SliceToFloat32(values, f))
}

func lib_MaxFloat32ByInt32Slice2(values [][][]int32, f func(vs [][]int32) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapInt32Slice2ToFloat32(values, f))
}

type lib_Int643ToFloat32Cache map[int64]map[int64]map[int64]float32

func (c lib_Int643ToFloat32Cache) Has(k1, k2, k3 int64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int643ToFloat32Cache) Get(k1, k2, k3 int64) (float32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int643ToFloat32Cache) Set(k1, k2, k3 int64, v float32) float32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int64]map[int64]float32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int64]float32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat32ByInt64(values []float32, f func(v float32) int64) int64 {
	var sum int64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float32SliceToInt64Slice(values []float32) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, int64(value))
	}
	return
}

func lib_MapInt64SliceToFloat32(values [][]int64, f func(v []int64) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt64Slice2ToFloat32(values [][][]int64, f func(v [][]int64) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat32ByInt64Slice(values [][]int64, f func(vs []int64) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapInt64SliceToFloat32(values, f))
}

func lib_MaxFloat32ByInt64Slice2(values [][][]int64, f func(vs [][]int64) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapInt64Slice2ToFloat32(values, f))
}

type lib_Float323ToFloat32Cache map[float32]map[float32]map[float32]float32

func (c lib_Float323ToFloat32Cache) Has(k1, k2, k3 float32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float323ToFloat32Cache) Get(k1, k2, k3 float32) (float32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float323ToFloat32Cache) Set(k1, k2, k3 float32, v float32) float32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float32]map[float32]float32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float32]float32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat32ByFloat32(values []float32, f func(v float32) float32) float32 {
	var sum float32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float32SliceToFloat32Slice(values []float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, float32(value))
	}
	return
}

func lib_MapFloat32SliceToFloat32(values [][]float32, f func(v []float32) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat32Slice2ToFloat32(values [][][]float32, f func(v [][]float32) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat32ByFloat32Slice(values [][]float32, f func(vs []float32) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapFloat32SliceToFloat32(values, f))
}

func lib_MaxFloat32ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapFloat32Slice2ToFloat32(values, f))
}

type lib_Float643ToFloat32Cache map[float64]map[float64]map[float64]float32

func (c lib_Float643ToFloat32Cache) Has(k1, k2, k3 float64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float643ToFloat32Cache) Get(k1, k2, k3 float64) (float32, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float643ToFloat32Cache) Set(k1, k2, k3 float64, v float32) float32 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float64]map[float64]float32{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float64]float32{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat32ByFloat64(values []float32, f func(v float32) float64) float64 {
	var sum float64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float32SliceToFloat64Slice(values []float32) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, float64(value))
	}
	return
}

func lib_MapFloat64SliceToFloat32(values [][]float64, f func(v []float64) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat64Slice2ToFloat32(values [][][]float64, f func(v [][]float64) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat32ByFloat64Slice(values [][]float64, f func(vs []float64) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapFloat64SliceToFloat32(values, f))
}

func lib_MaxFloat32ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) float32) (max float32, err error) {
	return lib_MaxFloat32(lib_MapFloat64Slice2ToFloat32(values, f))
}

type lib_Int3ToFloat64Cache map[int]map[int]map[int]float64

func (c lib_Int3ToFloat64Cache) Has(k1, k2, k3 int) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int3ToFloat64Cache) Get(k1, k2, k3 int) (float64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int3ToFloat64Cache) Set(k1, k2, k3 int, v float64) float64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int]map[int]float64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int]float64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat64ByInt(values []float64, f func(v float64) int) int {
	var sum int = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float64SliceToIntSlice(values []float64) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, int(value))
	}
	return
}

func lib_MapIntSliceToFloat64(values [][]int, f func(v []int) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapIntSlice2ToFloat64(values [][][]int, f func(v [][]int) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat64ByIntSlice(values [][]int, f func(vs []int) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapIntSliceToFloat64(values, f))
}

func lib_MaxFloat64ByIntSlice2(values [][][]int, f func(vs [][]int) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapIntSlice2ToFloat64(values, f))
}

type lib_Int83ToFloat64Cache map[int8]map[int8]map[int8]float64

func (c lib_Int83ToFloat64Cache) Has(k1, k2, k3 int8) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int83ToFloat64Cache) Get(k1, k2, k3 int8) (float64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int83ToFloat64Cache) Set(k1, k2, k3 int8, v float64) float64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int8]map[int8]float64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int8]float64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat64ByInt8(values []float64, f func(v float64) int8) int8 {
	var sum int8 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float64SliceToInt8Slice(values []float64) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, int8(value))
	}
	return
}

func lib_MapInt8SliceToFloat64(values [][]int8, f func(v []int8) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt8Slice2ToFloat64(values [][][]int8, f func(v [][]int8) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat64ByInt8Slice(values [][]int8, f func(vs []int8) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapInt8SliceToFloat64(values, f))
}

func lib_MaxFloat64ByInt8Slice2(values [][][]int8, f func(vs [][]int8) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapInt8Slice2ToFloat64(values, f))
}

type lib_Int163ToFloat64Cache map[int16]map[int16]map[int16]float64

func (c lib_Int163ToFloat64Cache) Has(k1, k2, k3 int16) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int163ToFloat64Cache) Get(k1, k2, k3 int16) (float64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int163ToFloat64Cache) Set(k1, k2, k3 int16, v float64) float64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int16]map[int16]float64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int16]float64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat64ByInt16(values []float64, f func(v float64) int16) int16 {
	var sum int16 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float64SliceToInt16Slice(values []float64) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, int16(value))
	}
	return
}

func lib_MapInt16SliceToFloat64(values [][]int16, f func(v []int16) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt16Slice2ToFloat64(values [][][]int16, f func(v [][]int16) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat64ByInt16Slice(values [][]int16, f func(vs []int16) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapInt16SliceToFloat64(values, f))
}

func lib_MaxFloat64ByInt16Slice2(values [][][]int16, f func(vs [][]int16) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapInt16Slice2ToFloat64(values, f))
}

type lib_Int323ToFloat64Cache map[int32]map[int32]map[int32]float64

func (c lib_Int323ToFloat64Cache) Has(k1, k2, k3 int32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int323ToFloat64Cache) Get(k1, k2, k3 int32) (float64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int323ToFloat64Cache) Set(k1, k2, k3 int32, v float64) float64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int32]map[int32]float64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int32]float64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat64ByInt32(values []float64, f func(v float64) int32) int32 {
	var sum int32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float64SliceToInt32Slice(values []float64) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, int32(value))
	}
	return
}

func lib_MapInt32SliceToFloat64(values [][]int32, f func(v []int32) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt32Slice2ToFloat64(values [][][]int32, f func(v [][]int32) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat64ByInt32Slice(values [][]int32, f func(vs []int32) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapInt32SliceToFloat64(values, f))
}

func lib_MaxFloat64ByInt32Slice2(values [][][]int32, f func(vs [][]int32) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapInt32Slice2ToFloat64(values, f))
}

type lib_Int643ToFloat64Cache map[int64]map[int64]map[int64]float64

func (c lib_Int643ToFloat64Cache) Has(k1, k2, k3 int64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Int643ToFloat64Cache) Get(k1, k2, k3 int64) (float64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Int643ToFloat64Cache) Set(k1, k2, k3 int64, v float64) float64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[int64]map[int64]float64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[int64]float64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat64ByInt64(values []float64, f func(v float64) int64) int64 {
	var sum int64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float64SliceToInt64Slice(values []float64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, int64(value))
	}
	return
}

func lib_MapInt64SliceToFloat64(values [][]int64, f func(v []int64) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt64Slice2ToFloat64(values [][][]int64, f func(v [][]int64) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat64ByInt64Slice(values [][]int64, f func(vs []int64) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapInt64SliceToFloat64(values, f))
}

func lib_MaxFloat64ByInt64Slice2(values [][][]int64, f func(vs [][]int64) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapInt64Slice2ToFloat64(values, f))
}

type lib_Float323ToFloat64Cache map[float32]map[float32]map[float32]float64

func (c lib_Float323ToFloat64Cache) Has(k1, k2, k3 float32) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float323ToFloat64Cache) Get(k1, k2, k3 float32) (float64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float323ToFloat64Cache) Set(k1, k2, k3 float32, v float64) float64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float32]map[float32]float64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float32]float64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat64ByFloat32(values []float64, f func(v float64) float32) float32 {
	var sum float32 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float64SliceToFloat32Slice(values []float64) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, float32(value))
	}
	return
}

func lib_MapFloat32SliceToFloat64(values [][]float32, f func(v []float32) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat32Slice2ToFloat64(values [][][]float32, f func(v [][]float32) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat64ByFloat32Slice(values [][]float32, f func(vs []float32) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapFloat32SliceToFloat64(values, f))
}

func lib_MaxFloat64ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapFloat32Slice2ToFloat64(values, f))
}

type lib_Float643ToFloat64Cache map[float64]map[float64]map[float64]float64

func (c lib_Float643ToFloat64Cache) Has(k1, k2, k3 float64) bool {
	if _, ok := c[k1]; !ok {
		return false
	}

	if _, ok := c[k1][k2]; !ok {
		return false
	}

	_, ok := c[k1][k2][k3]
	return ok
}

func (c lib_Float643ToFloat64Cache) Get(k1, k2, k3 float64) (float64, bool) {
	if _, ok := c[k1]; !ok {
		return 0, false
	}

	if _, ok := c[k1][k2]; !ok {
		return 0, false
	}

	v, ok := c[k1][k2][k3]
	return v, ok
}

func (c lib_Float643ToFloat64Cache) Set(k1, k2, k3 float64, v float64) float64 {
	if _, ok := c[k1]; !ok {
		c[k1] = map[float64]map[float64]float64{}
	}
	if _, ok := c[k1][k2]; !ok {
		c[k1][k2] = map[float64]float64{}
	}
	c[k1][k2][k3] = v
	return v
}

func lib_SumFloat64ByFloat64(values []float64, f func(v float64) float64) float64 {
	var sum float64 = 0
	for _, value := range values {
		sum += f(value)
	}
	return sum
}

func lib_Float64SliceToFloat64Slice(values []float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, float64(value))
	}
	return
}

func lib_MapFloat64SliceToFloat64(values [][]float64, f func(v []float64) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat64Slice2ToFloat64(values [][][]float64, f func(v [][]float64) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MaxFloat64ByFloat64Slice(values [][]float64, f func(vs []float64) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapFloat64SliceToFloat64(values, f))
}

func lib_MaxFloat64ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) float64) (max float64, err error) {
	return lib_MaxFloat64(lib_MapFloat64Slice2ToFloat64(values, f))
}

func lib_ReduceRune(values []rune, f func(acc, cur rune) rune, initial rune) (newValue rune) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_ReduceRuneSlice(values [][]rune, f func(acc rune, cur []rune) rune, initial rune) (newValue rune) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_CopyRune(values []rune) []rune {
	dst := make([]rune, len(values))
	copy(dst, values)
	return dst
}

func lib_CopyRuneSlice(values [][]rune) [][]rune {
	dst := make([][]rune, len(values))
	for i, value := range values {
		dst[i] = lib_CopyRune(value)
	}
	return dst
}

func lib_ReverseRune(values []rune) []rune {
	newValues := lib_CopyRune(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_ReverseRuneSlice(values [][]rune) [][]rune {
	newValues := lib_CopyRuneSlice(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_MapRune(values []rune, f func(v rune) rune) (newValues []rune) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapRuneSlice(values [][]rune, f func(v []rune) []rune) (newValues [][]rune) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapTypeRune(values [][]rune, f func(v []rune) rune) (newValues []rune) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_ZipRune(valuesList ...[]rune) (newValuesList [][]rune, err error) {
	if len(valuesList) == 0 {
		return nil, errors.New("empty values list are given to ZipRune")
	}
	valuesLen := len(valuesList[0])
	for _, values := range valuesList {
		if (len(values)) != valuesLen {
			return nil, errors.New("different lengths values are given to ZipRune")
		}
	}

	for i := 0; i < valuesLen; i++ {
		var newValues []rune
		for _, values := range valuesList {
			newValues = append(newValues, values[i])
		}
		newValuesList = append(newValuesList, newValues)
	}
	return
}

func lib_SomeRune(values []rune, f func(v rune) bool) bool {
	for _, value := range values {
		if f(value) {
			return true
		}
	}
	return false
}

func lib_SomeRuneSlice(valuesList [][]rune, f func(v []rune) bool) bool {
	for _, values := range valuesList {
		if f(values) {
			return true
		}
	}
	return false
}

func lib_EveryRune(values []rune, f func(v rune) bool) bool {
	for _, value := range values {
		if !f(value) {
			return false
		}
	}
	return true
}

func lib_EveryRuneSlice(valuesList [][]rune, f func(v []rune) bool) bool {
	for _, values := range valuesList {
		if !f(values) {
			return false
		}
	}
	return true
}

func lib_ChunkRuneByBits(values []rune, bits []bool) (newValues [][]rune, err error) {
	if len(values) != len(bits)+1 {
		return nil, errors.New(fmt.Sprintf("there are different length between values(%d) and bits(%d)", len(values), len(bits)))
	}

	var chunk []rune
	for i, bit := range bits {
		chunk = append(chunk, values[i])
		if bit {
			newValues = append(newValues, chunk)
			chunk = []rune{}
		}
	}
	chunk = append(chunk, values[len(values)-1])
	newValues = append(newValues, chunk)
	return
}

func lib_UnsetRune(values []rune, i int) ([]rune, error) {
	if i < 0 {
		return nil, fmt.Errorf("negative number index is given: %d", i)
	}

	if i >= len(values) {
		return nil, fmt.Errorf("index(%d) is larger than slice length(%d)", i, len(values))
	}

	if len(values) == 1 {
		return []rune{}, nil
	}

	if i == len(values)-1 {
		return values[:len(values)-1], nil
	}

	newValues := make([]rune, len(values))
	copy(newValues, values)
	return append(newValues[:i], newValues[i+1:]...), nil
}

func lib_RuneCombination(values []rune, r int) (combinations [][]rune, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, []rune{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
		}
		partialCombinations, err := lib_RuneCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_RunePermutation(values []rune, r int) (permutations [][]rune) {
	if r == 1 {
		for _, value := range values {
			permutations = append(permutations, []rune{value})
		}
		return
	}
	for i := range values {
		newValues := lib_RuneRemoveFromSlice(values, i)
		for _, pc := range lib_RunePermutation(newValues, r-1) {
			newC := append(pc, values[i])
			permutations = append(permutations, newC)
		}
	}
	return
}

func lib_RuneSliceCombination(values [][]rune, r int) (combinations [][][]rune, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, [][]rune{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
			if err != nil {
				return nil, err
			}
		}
		partialCombinations, err := lib_RuneSliceCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_RuneRemoveFromSlice(slice []rune, i int) []rune {
	n := make([]rune, len(slice))
	copy(n, slice)
	return append(n[:i], n[i+1:]...)
}

func lib_TernaryOPRune(ok bool, v1, v2 rune) rune {
	if ok {
		return v1
	}
	return v2
}

type lib_UnionFindRune struct {
	nodes map[rune]rune
}

func lib_NewUnionFindRune(values []rune) *lib_UnionFindRune {
	m := map[rune]rune{}
	for _, v := range values {
		m[v] = v
	}
	return &lib_UnionFindRune{nodes: m}
}

func (u *lib_UnionFindRune) GetRoot(value rune) (rune, int) {
	v := value
	newV := u.nodes[v]
	cnt := 0
	for newV != v {
		cnt++
		oldV := v
		v = newV
		newV = u.nodes[newV]
		u.nodes[oldV] = newV
	}
	return newV, cnt
}

func (u *lib_UnionFindRune) Unite(v1, v2 rune) (rune, bool) {
	v1Root, v1HopNum := u.GetRoot(v1)
	v2Root, v2HopNum := u.GetRoot(v2)
	if v1Root == v2Root {
		return v1Root, false
	}
	if v1HopNum >= v2HopNum {
		u.nodes[v2Root] = v1Root
		return v1Root, true
	}
	u.nodes[v1Root] = v2Root
	return v2Root, true
}

func (u *lib_UnionFindRune) IsSameGroup(v1, v2 rune) bool {
	v1Root, _ := u.GetRoot(v1)
	v2Root, _ := u.GetRoot(v2)
	return v1Root == v2Root
}

func lib_MemoizeRune(f func(v rune) rune) func(v rune) rune {
	cache := map[rune]rune{}
	return func(v rune) rune {
		if cachedResult, ok := cache[v]; ok {
			return cachedResult
		}
		result := f(v)
		cache[v] = result
		return result
	}
}

func lib_ReduceString(values []string, f func(acc, cur string) string, initial string) (newValue string) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_ReduceStringSlice(values [][]string, f func(acc string, cur []string) string, initial string) (newValue string) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_CopyString(values []string) []string {
	dst := make([]string, len(values))
	copy(dst, values)
	return dst
}

func lib_CopyStringSlice(values [][]string) [][]string {
	dst := make([][]string, len(values))
	for i, value := range values {
		dst[i] = lib_CopyString(value)
	}
	return dst
}

func lib_ReverseString(values []string) []string {
	newValues := lib_CopyString(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_ReverseStringSlice(values [][]string) [][]string {
	newValues := lib_CopyStringSlice(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_MapString(values []string, f func(v string) string) (newValues []string) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapStringSlice(values [][]string, f func(v []string) []string) (newValues [][]string) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapTypeString(values [][]string, f func(v []string) string) (newValues []string) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_ZipString(valuesList ...[]string) (newValuesList [][]string, err error) {
	if len(valuesList) == 0 {
		return nil, errors.New("empty values list are given to ZipString")
	}
	valuesLen := len(valuesList[0])
	for _, values := range valuesList {
		if (len(values)) != valuesLen {
			return nil, errors.New("different lengths values are given to ZipString")
		}
	}

	for i := 0; i < valuesLen; i++ {
		var newValues []string
		for _, values := range valuesList {
			newValues = append(newValues, values[i])
		}
		newValuesList = append(newValuesList, newValues)
	}
	return
}

func lib_SomeString(values []string, f func(v string) bool) bool {
	for _, value := range values {
		if f(value) {
			return true
		}
	}
	return false
}

func lib_SomeStringSlice(valuesList [][]string, f func(v []string) bool) bool {
	for _, values := range valuesList {
		if f(values) {
			return true
		}
	}
	return false
}

func lib_EveryString(values []string, f func(v string) bool) bool {
	for _, value := range values {
		if !f(value) {
			return false
		}
	}
	return true
}

func lib_EveryStringSlice(valuesList [][]string, f func(v []string) bool) bool {
	for _, values := range valuesList {
		if !f(values) {
			return false
		}
	}
	return true
}

func lib_ChunkStringByBits(values []string, bits []bool) (newValues [][]string, err error) {
	if len(values) != len(bits)+1 {
		return nil, errors.New(fmt.Sprintf("there are different length between values(%d) and bits(%d)", len(values), len(bits)))
	}

	var chunk []string
	for i, bit := range bits {
		chunk = append(chunk, values[i])
		if bit {
			newValues = append(newValues, chunk)
			chunk = []string{}
		}
	}
	chunk = append(chunk, values[len(values)-1])
	newValues = append(newValues, chunk)
	return
}

func lib_UnsetString(values []string, i int) ([]string, error) {
	if i < 0 {
		return nil, fmt.Errorf("negative number index is given: %d", i)
	}

	if i >= len(values) {
		return nil, fmt.Errorf("index(%d) is larger than slice length(%d)", i, len(values))
	}

	if len(values) == 1 {
		return []string{}, nil
	}

	if i == len(values)-1 {
		return values[:len(values)-1], nil
	}

	newValues := make([]string, len(values))
	copy(newValues, values)
	return append(newValues[:i], newValues[i+1:]...), nil
}

func lib_StringCombination(values []string, r int) (combinations [][]string, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, []string{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
		}
		partialCombinations, err := lib_StringCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_StringPermutation(values []string, r int) (permutations [][]string) {
	if r == 1 {
		for _, value := range values {
			permutations = append(permutations, []string{value})
		}
		return
	}
	for i := range values {
		newValues := lib_StringRemoveFromSlice(values, i)
		for _, pc := range lib_StringPermutation(newValues, r-1) {
			newC := append(pc, values[i])
			permutations = append(permutations, newC)
		}
	}
	return
}

func lib_StringSliceCombination(values [][]string, r int) (combinations [][][]string, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, [][]string{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
			if err != nil {
				return nil, err
			}
		}
		partialCombinations, err := lib_StringSliceCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_StringRemoveFromSlice(slice []string, i int) []string {
	n := make([]string, len(slice))
	copy(n, slice)
	return append(n[:i], n[i+1:]...)
}

func lib_TernaryOPString(ok bool, v1, v2 string) string {
	if ok {
		return v1
	}
	return v2
}

type lib_UnionFindString struct {
	nodes map[string]string
}

func lib_NewUnionFindString(values []string) *lib_UnionFindString {
	m := map[string]string{}
	for _, v := range values {
		m[v] = v
	}
	return &lib_UnionFindString{nodes: m}
}

func (u *lib_UnionFindString) GetRoot(value string) (string, int) {
	v := value
	newV := u.nodes[v]
	cnt := 0
	for newV != v {
		cnt++
		oldV := v
		v = newV
		newV = u.nodes[newV]
		u.nodes[oldV] = newV
	}
	return newV, cnt
}

func (u *lib_UnionFindString) Unite(v1, v2 string) (string, bool) {
	v1Root, v1HopNum := u.GetRoot(v1)
	v2Root, v2HopNum := u.GetRoot(v2)
	if v1Root == v2Root {
		return v1Root, false
	}
	if v1HopNum >= v2HopNum {
		u.nodes[v2Root] = v1Root
		return v1Root, true
	}
	u.nodes[v1Root] = v2Root
	return v2Root, true
}

func (u *lib_UnionFindString) IsSameGroup(v1, v2 string) bool {
	v1Root, _ := u.GetRoot(v1)
	v2Root, _ := u.GetRoot(v2)
	return v1Root == v2Root
}

func lib_MemoizeString(f func(v string) string) func(v string) string {
	cache := map[string]string{}
	return func(v string) string {
		if cachedResult, ok := cache[v]; ok {
			return cachedResult
		}
		result := f(v)
		cache[v] = result
		return result
	}
}

func lib_ReduceInt(values []int, f func(acc, cur int) int, initial int) (newValue int) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_ReduceIntSlice(values [][]int, f func(acc int, cur []int) int, initial int) (newValue int) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_CopyInt(values []int) []int {
	dst := make([]int, len(values))
	copy(dst, values)
	return dst
}

func lib_CopyIntSlice(values [][]int) [][]int {
	dst := make([][]int, len(values))
	for i, value := range values {
		dst[i] = lib_CopyInt(value)
	}
	return dst
}

func lib_ReverseInt(values []int) []int {
	newValues := lib_CopyInt(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_ReverseIntSlice(values [][]int) [][]int {
	newValues := lib_CopyIntSlice(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_MapInt(values []int, f func(v int) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapIntSlice(values [][]int, f func(v []int) []int) (newValues [][]int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapTypeInt(values [][]int, f func(v []int) int) (newValues []int) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_ZipInt(valuesList ...[]int) (newValuesList [][]int, err error) {
	if len(valuesList) == 0 {
		return nil, errors.New("empty values list are given to ZipInt")
	}
	valuesLen := len(valuesList[0])
	for _, values := range valuesList {
		if (len(values)) != valuesLen {
			return nil, errors.New("different lengths values are given to ZipInt")
		}
	}

	for i := 0; i < valuesLen; i++ {
		var newValues []int
		for _, values := range valuesList {
			newValues = append(newValues, values[i])
		}
		newValuesList = append(newValuesList, newValues)
	}
	return
}

func lib_SomeInt(values []int, f func(v int) bool) bool {
	for _, value := range values {
		if f(value) {
			return true
		}
	}
	return false
}

func lib_SomeIntSlice(valuesList [][]int, f func(v []int) bool) bool {
	for _, values := range valuesList {
		if f(values) {
			return true
		}
	}
	return false
}

func lib_EveryInt(values []int, f func(v int) bool) bool {
	for _, value := range values {
		if !f(value) {
			return false
		}
	}
	return true
}

func lib_EveryIntSlice(valuesList [][]int, f func(v []int) bool) bool {
	for _, values := range valuesList {
		if !f(values) {
			return false
		}
	}
	return true
}

func lib_ChunkIntByBits(values []int, bits []bool) (newValues [][]int, err error) {
	if len(values) != len(bits)+1 {
		return nil, errors.New(fmt.Sprintf("there are different length between values(%d) and bits(%d)", len(values), len(bits)))
	}

	var chunk []int
	for i, bit := range bits {
		chunk = append(chunk, values[i])
		if bit {
			newValues = append(newValues, chunk)
			chunk = []int{}
		}
	}
	chunk = append(chunk, values[len(values)-1])
	newValues = append(newValues, chunk)
	return
}

func lib_UnsetInt(values []int, i int) ([]int, error) {
	if i < 0 {
		return nil, fmt.Errorf("negative number index is given: %d", i)
	}

	if i >= len(values) {
		return nil, fmt.Errorf("index(%d) is larger than slice length(%d)", i, len(values))
	}

	if len(values) == 1 {
		return []int{}, nil
	}

	if i == len(values)-1 {
		return values[:len(values)-1], nil
	}

	newValues := make([]int, len(values))
	copy(newValues, values)
	return append(newValues[:i], newValues[i+1:]...), nil
}

func lib_IntCombination(values []int, r int) (combinations [][]int, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, []int{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
		}
		partialCombinations, err := lib_IntCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_IntPermutation(values []int, r int) (permutations [][]int) {
	if r == 1 {
		for _, value := range values {
			permutations = append(permutations, []int{value})
		}
		return
	}
	for i := range values {
		newValues := lib_IntRemoveFromSlice(values, i)
		for _, pc := range lib_IntPermutation(newValues, r-1) {
			newC := append(pc, values[i])
			permutations = append(permutations, newC)
		}
	}
	return
}

func lib_IntSliceCombination(values [][]int, r int) (combinations [][][]int, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, [][]int{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
			if err != nil {
				return nil, err
			}
		}
		partialCombinations, err := lib_IntSliceCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_IntRemoveFromSlice(slice []int, i int) []int {
	n := make([]int, len(slice))
	copy(n, slice)
	return append(n[:i], n[i+1:]...)
}

func lib_TernaryOPInt(ok bool, v1, v2 int) int {
	if ok {
		return v1
	}
	return v2
}

type lib_UnionFindInt struct {
	nodes map[int]int
}

func lib_NewUnionFindInt(values []int) *lib_UnionFindInt {
	m := map[int]int{}
	for _, v := range values {
		m[v] = v
	}
	return &lib_UnionFindInt{nodes: m}
}

func (u *lib_UnionFindInt) GetRoot(value int) (int, int) {
	v := value
	newV := u.nodes[v]
	cnt := 0
	for newV != v {
		cnt++
		oldV := v
		v = newV
		newV = u.nodes[newV]
		u.nodes[oldV] = newV
	}
	return newV, cnt
}

func (u *lib_UnionFindInt) Unite(v1, v2 int) (int, bool) {
	v1Root, v1HopNum := u.GetRoot(v1)
	v2Root, v2HopNum := u.GetRoot(v2)
	if v1Root == v2Root {
		return v1Root, false
	}
	if v1HopNum >= v2HopNum {
		u.nodes[v2Root] = v1Root
		return v1Root, true
	}
	u.nodes[v1Root] = v2Root
	return v2Root, true
}

func (u *lib_UnionFindInt) IsSameGroup(v1, v2 int) bool {
	v1Root, _ := u.GetRoot(v1)
	v2Root, _ := u.GetRoot(v2)
	return v1Root == v2Root
}

func lib_MemoizeInt(f func(v int) int) func(v int) int {
	cache := map[int]int{}
	return func(v int) int {
		if cachedResult, ok := cache[v]; ok {
			return cachedResult
		}
		result := f(v)
		cache[v] = result
		return result
	}
}

func lib_ReduceInt8(values []int8, f func(acc, cur int8) int8, initial int8) (newValue int8) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_ReduceInt8Slice(values [][]int8, f func(acc int8, cur []int8) int8, initial int8) (newValue int8) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_CopyInt8(values []int8) []int8 {
	dst := make([]int8, len(values))
	copy(dst, values)
	return dst
}

func lib_CopyInt8Slice(values [][]int8) [][]int8 {
	dst := make([][]int8, len(values))
	for i, value := range values {
		dst[i] = lib_CopyInt8(value)
	}
	return dst
}

func lib_ReverseInt8(values []int8) []int8 {
	newValues := lib_CopyInt8(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_ReverseInt8Slice(values [][]int8) [][]int8 {
	newValues := lib_CopyInt8Slice(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_MapInt8(values []int8, f func(v int8) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt8Slice(values [][]int8, f func(v []int8) []int8) (newValues [][]int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapTypeInt8(values [][]int8, f func(v []int8) int8) (newValues []int8) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_ZipInt8(valuesList ...[]int8) (newValuesList [][]int8, err error) {
	if len(valuesList) == 0 {
		return nil, errors.New("empty values list are given to ZipInt8")
	}
	valuesLen := len(valuesList[0])
	for _, values := range valuesList {
		if (len(values)) != valuesLen {
			return nil, errors.New("different lengths values are given to ZipInt8")
		}
	}

	for i := 0; i < valuesLen; i++ {
		var newValues []int8
		for _, values := range valuesList {
			newValues = append(newValues, values[i])
		}
		newValuesList = append(newValuesList, newValues)
	}
	return
}

func lib_SomeInt8(values []int8, f func(v int8) bool) bool {
	for _, value := range values {
		if f(value) {
			return true
		}
	}
	return false
}

func lib_SomeInt8Slice(valuesList [][]int8, f func(v []int8) bool) bool {
	for _, values := range valuesList {
		if f(values) {
			return true
		}
	}
	return false
}

func lib_EveryInt8(values []int8, f func(v int8) bool) bool {
	for _, value := range values {
		if !f(value) {
			return false
		}
	}
	return true
}

func lib_EveryInt8Slice(valuesList [][]int8, f func(v []int8) bool) bool {
	for _, values := range valuesList {
		if !f(values) {
			return false
		}
	}
	return true
}

func lib_ChunkInt8ByBits(values []int8, bits []bool) (newValues [][]int8, err error) {
	if len(values) != len(bits)+1 {
		return nil, errors.New(fmt.Sprintf("there are different length between values(%d) and bits(%d)", len(values), len(bits)))
	}

	var chunk []int8
	for i, bit := range bits {
		chunk = append(chunk, values[i])
		if bit {
			newValues = append(newValues, chunk)
			chunk = []int8{}
		}
	}
	chunk = append(chunk, values[len(values)-1])
	newValues = append(newValues, chunk)
	return
}

func lib_UnsetInt8(values []int8, i int) ([]int8, error) {
	if i < 0 {
		return nil, fmt.Errorf("negative number index is given: %d", i)
	}

	if i >= len(values) {
		return nil, fmt.Errorf("index(%d) is larger than slice length(%d)", i, len(values))
	}

	if len(values) == 1 {
		return []int8{}, nil
	}

	if i == len(values)-1 {
		return values[:len(values)-1], nil
	}

	newValues := make([]int8, len(values))
	copy(newValues, values)
	return append(newValues[:i], newValues[i+1:]...), nil
}

func lib_Int8Combination(values []int8, r int) (combinations [][]int8, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, []int8{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
		}
		partialCombinations, err := lib_Int8Combination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Int8Permutation(values []int8, r int) (permutations [][]int8) {
	if r == 1 {
		for _, value := range values {
			permutations = append(permutations, []int8{value})
		}
		return
	}
	for i := range values {
		newValues := lib_Int8RemoveFromSlice(values, i)
		for _, pc := range lib_Int8Permutation(newValues, r-1) {
			newC := append(pc, values[i])
			permutations = append(permutations, newC)
		}
	}
	return
}

func lib_Int8SliceCombination(values [][]int8, r int) (combinations [][][]int8, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, [][]int8{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
			if err != nil {
				return nil, err
			}
		}
		partialCombinations, err := lib_Int8SliceCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Int8RemoveFromSlice(slice []int8, i int) []int8 {
	n := make([]int8, len(slice))
	copy(n, slice)
	return append(n[:i], n[i+1:]...)
}

func lib_TernaryOPInt8(ok bool, v1, v2 int8) int8 {
	if ok {
		return v1
	}
	return v2
}

type lib_UnionFindInt8 struct {
	nodes map[int8]int8
}

func lib_NewUnionFindInt8(values []int8) *lib_UnionFindInt8 {
	m := map[int8]int8{}
	for _, v := range values {
		m[v] = v
	}
	return &lib_UnionFindInt8{nodes: m}
}

func (u *lib_UnionFindInt8) GetRoot(value int8) (int8, int) {
	v := value
	newV := u.nodes[v]
	cnt := 0
	for newV != v {
		cnt++
		oldV := v
		v = newV
		newV = u.nodes[newV]
		u.nodes[oldV] = newV
	}
	return newV, cnt
}

func (u *lib_UnionFindInt8) Unite(v1, v2 int8) (int8, bool) {
	v1Root, v1HopNum := u.GetRoot(v1)
	v2Root, v2HopNum := u.GetRoot(v2)
	if v1Root == v2Root {
		return v1Root, false
	}
	if v1HopNum >= v2HopNum {
		u.nodes[v2Root] = v1Root
		return v1Root, true
	}
	u.nodes[v1Root] = v2Root
	return v2Root, true
}

func (u *lib_UnionFindInt8) IsSameGroup(v1, v2 int8) bool {
	v1Root, _ := u.GetRoot(v1)
	v2Root, _ := u.GetRoot(v2)
	return v1Root == v2Root
}

func lib_MemoizeInt8(f func(v int8) int8) func(v int8) int8 {
	cache := map[int8]int8{}
	return func(v int8) int8 {
		if cachedResult, ok := cache[v]; ok {
			return cachedResult
		}
		result := f(v)
		cache[v] = result
		return result
	}
}

func lib_ReduceInt16(values []int16, f func(acc, cur int16) int16, initial int16) (newValue int16) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_ReduceInt16Slice(values [][]int16, f func(acc int16, cur []int16) int16, initial int16) (newValue int16) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_CopyInt16(values []int16) []int16 {
	dst := make([]int16, len(values))
	copy(dst, values)
	return dst
}

func lib_CopyInt16Slice(values [][]int16) [][]int16 {
	dst := make([][]int16, len(values))
	for i, value := range values {
		dst[i] = lib_CopyInt16(value)
	}
	return dst
}

func lib_ReverseInt16(values []int16) []int16 {
	newValues := lib_CopyInt16(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_ReverseInt16Slice(values [][]int16) [][]int16 {
	newValues := lib_CopyInt16Slice(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_MapInt16(values []int16, f func(v int16) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt16Slice(values [][]int16, f func(v []int16) []int16) (newValues [][]int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapTypeInt16(values [][]int16, f func(v []int16) int16) (newValues []int16) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_ZipInt16(valuesList ...[]int16) (newValuesList [][]int16, err error) {
	if len(valuesList) == 0 {
		return nil, errors.New("empty values list are given to ZipInt16")
	}
	valuesLen := len(valuesList[0])
	for _, values := range valuesList {
		if (len(values)) != valuesLen {
			return nil, errors.New("different lengths values are given to ZipInt16")
		}
	}

	for i := 0; i < valuesLen; i++ {
		var newValues []int16
		for _, values := range valuesList {
			newValues = append(newValues, values[i])
		}
		newValuesList = append(newValuesList, newValues)
	}
	return
}

func lib_SomeInt16(values []int16, f func(v int16) bool) bool {
	for _, value := range values {
		if f(value) {
			return true
		}
	}
	return false
}

func lib_SomeInt16Slice(valuesList [][]int16, f func(v []int16) bool) bool {
	for _, values := range valuesList {
		if f(values) {
			return true
		}
	}
	return false
}

func lib_EveryInt16(values []int16, f func(v int16) bool) bool {
	for _, value := range values {
		if !f(value) {
			return false
		}
	}
	return true
}

func lib_EveryInt16Slice(valuesList [][]int16, f func(v []int16) bool) bool {
	for _, values := range valuesList {
		if !f(values) {
			return false
		}
	}
	return true
}

func lib_ChunkInt16ByBits(values []int16, bits []bool) (newValues [][]int16, err error) {
	if len(values) != len(bits)+1 {
		return nil, errors.New(fmt.Sprintf("there are different length between values(%d) and bits(%d)", len(values), len(bits)))
	}

	var chunk []int16
	for i, bit := range bits {
		chunk = append(chunk, values[i])
		if bit {
			newValues = append(newValues, chunk)
			chunk = []int16{}
		}
	}
	chunk = append(chunk, values[len(values)-1])
	newValues = append(newValues, chunk)
	return
}

func lib_UnsetInt16(values []int16, i int) ([]int16, error) {
	if i < 0 {
		return nil, fmt.Errorf("negative number index is given: %d", i)
	}

	if i >= len(values) {
		return nil, fmt.Errorf("index(%d) is larger than slice length(%d)", i, len(values))
	}

	if len(values) == 1 {
		return []int16{}, nil
	}

	if i == len(values)-1 {
		return values[:len(values)-1], nil
	}

	newValues := make([]int16, len(values))
	copy(newValues, values)
	return append(newValues[:i], newValues[i+1:]...), nil
}

func lib_Int16Combination(values []int16, r int) (combinations [][]int16, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, []int16{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
		}
		partialCombinations, err := lib_Int16Combination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Int16Permutation(values []int16, r int) (permutations [][]int16) {
	if r == 1 {
		for _, value := range values {
			permutations = append(permutations, []int16{value})
		}
		return
	}
	for i := range values {
		newValues := lib_Int16RemoveFromSlice(values, i)
		for _, pc := range lib_Int16Permutation(newValues, r-1) {
			newC := append(pc, values[i])
			permutations = append(permutations, newC)
		}
	}
	return
}

func lib_Int16SliceCombination(values [][]int16, r int) (combinations [][][]int16, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, [][]int16{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
			if err != nil {
				return nil, err
			}
		}
		partialCombinations, err := lib_Int16SliceCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Int16RemoveFromSlice(slice []int16, i int) []int16 {
	n := make([]int16, len(slice))
	copy(n, slice)
	return append(n[:i], n[i+1:]...)
}

func lib_TernaryOPInt16(ok bool, v1, v2 int16) int16 {
	if ok {
		return v1
	}
	return v2
}

type lib_UnionFindInt16 struct {
	nodes map[int16]int16
}

func lib_NewUnionFindInt16(values []int16) *lib_UnionFindInt16 {
	m := map[int16]int16{}
	for _, v := range values {
		m[v] = v
	}
	return &lib_UnionFindInt16{nodes: m}
}

func (u *lib_UnionFindInt16) GetRoot(value int16) (int16, int) {
	v := value
	newV := u.nodes[v]
	cnt := 0
	for newV != v {
		cnt++
		oldV := v
		v = newV
		newV = u.nodes[newV]
		u.nodes[oldV] = newV
	}
	return newV, cnt
}

func (u *lib_UnionFindInt16) Unite(v1, v2 int16) (int16, bool) {
	v1Root, v1HopNum := u.GetRoot(v1)
	v2Root, v2HopNum := u.GetRoot(v2)
	if v1Root == v2Root {
		return v1Root, false
	}
	if v1HopNum >= v2HopNum {
		u.nodes[v2Root] = v1Root
		return v1Root, true
	}
	u.nodes[v1Root] = v2Root
	return v2Root, true
}

func (u *lib_UnionFindInt16) IsSameGroup(v1, v2 int16) bool {
	v1Root, _ := u.GetRoot(v1)
	v2Root, _ := u.GetRoot(v2)
	return v1Root == v2Root
}

func lib_MemoizeInt16(f func(v int16) int16) func(v int16) int16 {
	cache := map[int16]int16{}
	return func(v int16) int16 {
		if cachedResult, ok := cache[v]; ok {
			return cachedResult
		}
		result := f(v)
		cache[v] = result
		return result
	}
}

func lib_ReduceInt32(values []int32, f func(acc, cur int32) int32, initial int32) (newValue int32) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_ReduceInt32Slice(values [][]int32, f func(acc int32, cur []int32) int32, initial int32) (newValue int32) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_CopyInt32(values []int32) []int32 {
	dst := make([]int32, len(values))
	copy(dst, values)
	return dst
}

func lib_CopyInt32Slice(values [][]int32) [][]int32 {
	dst := make([][]int32, len(values))
	for i, value := range values {
		dst[i] = lib_CopyInt32(value)
	}
	return dst
}

func lib_ReverseInt32(values []int32) []int32 {
	newValues := lib_CopyInt32(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_ReverseInt32Slice(values [][]int32) [][]int32 {
	newValues := lib_CopyInt32Slice(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_MapInt32(values []int32, f func(v int32) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt32Slice(values [][]int32, f func(v []int32) []int32) (newValues [][]int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapTypeInt32(values [][]int32, f func(v []int32) int32) (newValues []int32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_ZipInt32(valuesList ...[]int32) (newValuesList [][]int32, err error) {
	if len(valuesList) == 0 {
		return nil, errors.New("empty values list are given to ZipInt32")
	}
	valuesLen := len(valuesList[0])
	for _, values := range valuesList {
		if (len(values)) != valuesLen {
			return nil, errors.New("different lengths values are given to ZipInt32")
		}
	}

	for i := 0; i < valuesLen; i++ {
		var newValues []int32
		for _, values := range valuesList {
			newValues = append(newValues, values[i])
		}
		newValuesList = append(newValuesList, newValues)
	}
	return
}

func lib_SomeInt32(values []int32, f func(v int32) bool) bool {
	for _, value := range values {
		if f(value) {
			return true
		}
	}
	return false
}

func lib_SomeInt32Slice(valuesList [][]int32, f func(v []int32) bool) bool {
	for _, values := range valuesList {
		if f(values) {
			return true
		}
	}
	return false
}

func lib_EveryInt32(values []int32, f func(v int32) bool) bool {
	for _, value := range values {
		if !f(value) {
			return false
		}
	}
	return true
}

func lib_EveryInt32Slice(valuesList [][]int32, f func(v []int32) bool) bool {
	for _, values := range valuesList {
		if !f(values) {
			return false
		}
	}
	return true
}

func lib_ChunkInt32ByBits(values []int32, bits []bool) (newValues [][]int32, err error) {
	if len(values) != len(bits)+1 {
		return nil, errors.New(fmt.Sprintf("there are different length between values(%d) and bits(%d)", len(values), len(bits)))
	}

	var chunk []int32
	for i, bit := range bits {
		chunk = append(chunk, values[i])
		if bit {
			newValues = append(newValues, chunk)
			chunk = []int32{}
		}
	}
	chunk = append(chunk, values[len(values)-1])
	newValues = append(newValues, chunk)
	return
}

func lib_UnsetInt32(values []int32, i int) ([]int32, error) {
	if i < 0 {
		return nil, fmt.Errorf("negative number index is given: %d", i)
	}

	if i >= len(values) {
		return nil, fmt.Errorf("index(%d) is larger than slice length(%d)", i, len(values))
	}

	if len(values) == 1 {
		return []int32{}, nil
	}

	if i == len(values)-1 {
		return values[:len(values)-1], nil
	}

	newValues := make([]int32, len(values))
	copy(newValues, values)
	return append(newValues[:i], newValues[i+1:]...), nil
}

func lib_Int32Combination(values []int32, r int) (combinations [][]int32, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, []int32{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
		}
		partialCombinations, err := lib_Int32Combination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Int32Permutation(values []int32, r int) (permutations [][]int32) {
	if r == 1 {
		for _, value := range values {
			permutations = append(permutations, []int32{value})
		}
		return
	}
	for i := range values {
		newValues := lib_Int32RemoveFromSlice(values, i)
		for _, pc := range lib_Int32Permutation(newValues, r-1) {
			newC := append(pc, values[i])
			permutations = append(permutations, newC)
		}
	}
	return
}

func lib_Int32SliceCombination(values [][]int32, r int) (combinations [][][]int32, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, [][]int32{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
			if err != nil {
				return nil, err
			}
		}
		partialCombinations, err := lib_Int32SliceCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Int32RemoveFromSlice(slice []int32, i int) []int32 {
	n := make([]int32, len(slice))
	copy(n, slice)
	return append(n[:i], n[i+1:]...)
}

func lib_TernaryOPInt32(ok bool, v1, v2 int32) int32 {
	if ok {
		return v1
	}
	return v2
}

type lib_UnionFindInt32 struct {
	nodes map[int32]int32
}

func lib_NewUnionFindInt32(values []int32) *lib_UnionFindInt32 {
	m := map[int32]int32{}
	for _, v := range values {
		m[v] = v
	}
	return &lib_UnionFindInt32{nodes: m}
}

func (u *lib_UnionFindInt32) GetRoot(value int32) (int32, int) {
	v := value
	newV := u.nodes[v]
	cnt := 0
	for newV != v {
		cnt++
		oldV := v
		v = newV
		newV = u.nodes[newV]
		u.nodes[oldV] = newV
	}
	return newV, cnt
}

func (u *lib_UnionFindInt32) Unite(v1, v2 int32) (int32, bool) {
	v1Root, v1HopNum := u.GetRoot(v1)
	v2Root, v2HopNum := u.GetRoot(v2)
	if v1Root == v2Root {
		return v1Root, false
	}
	if v1HopNum >= v2HopNum {
		u.nodes[v2Root] = v1Root
		return v1Root, true
	}
	u.nodes[v1Root] = v2Root
	return v2Root, true
}

func (u *lib_UnionFindInt32) IsSameGroup(v1, v2 int32) bool {
	v1Root, _ := u.GetRoot(v1)
	v2Root, _ := u.GetRoot(v2)
	return v1Root == v2Root
}

func lib_MemoizeInt32(f func(v int32) int32) func(v int32) int32 {
	cache := map[int32]int32{}
	return func(v int32) int32 {
		if cachedResult, ok := cache[v]; ok {
			return cachedResult
		}
		result := f(v)
		cache[v] = result
		return result
	}
}

func lib_ReduceInt64(values []int64, f func(acc, cur int64) int64, initial int64) (newValue int64) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_ReduceInt64Slice(values [][]int64, f func(acc int64, cur []int64) int64, initial int64) (newValue int64) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_CopyInt64(values []int64) []int64 {
	dst := make([]int64, len(values))
	copy(dst, values)
	return dst
}

func lib_CopyInt64Slice(values [][]int64) [][]int64 {
	dst := make([][]int64, len(values))
	for i, value := range values {
		dst[i] = lib_CopyInt64(value)
	}
	return dst
}

func lib_ReverseInt64(values []int64) []int64 {
	newValues := lib_CopyInt64(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_ReverseInt64Slice(values [][]int64) [][]int64 {
	newValues := lib_CopyInt64Slice(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_MapInt64(values []int64, f func(v int64) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapInt64Slice(values [][]int64, f func(v []int64) []int64) (newValues [][]int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapTypeInt64(values [][]int64, f func(v []int64) int64) (newValues []int64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_ZipInt64(valuesList ...[]int64) (newValuesList [][]int64, err error) {
	if len(valuesList) == 0 {
		return nil, errors.New("empty values list are given to ZipInt64")
	}
	valuesLen := len(valuesList[0])
	for _, values := range valuesList {
		if (len(values)) != valuesLen {
			return nil, errors.New("different lengths values are given to ZipInt64")
		}
	}

	for i := 0; i < valuesLen; i++ {
		var newValues []int64
		for _, values := range valuesList {
			newValues = append(newValues, values[i])
		}
		newValuesList = append(newValuesList, newValues)
	}
	return
}

func lib_SomeInt64(values []int64, f func(v int64) bool) bool {
	for _, value := range values {
		if f(value) {
			return true
		}
	}
	return false
}

func lib_SomeInt64Slice(valuesList [][]int64, f func(v []int64) bool) bool {
	for _, values := range valuesList {
		if f(values) {
			return true
		}
	}
	return false
}

func lib_EveryInt64(values []int64, f func(v int64) bool) bool {
	for _, value := range values {
		if !f(value) {
			return false
		}
	}
	return true
}

func lib_EveryInt64Slice(valuesList [][]int64, f func(v []int64) bool) bool {
	for _, values := range valuesList {
		if !f(values) {
			return false
		}
	}
	return true
}

func lib_ChunkInt64ByBits(values []int64, bits []bool) (newValues [][]int64, err error) {
	if len(values) != len(bits)+1 {
		return nil, errors.New(fmt.Sprintf("there are different length between values(%d) and bits(%d)", len(values), len(bits)))
	}

	var chunk []int64
	for i, bit := range bits {
		chunk = append(chunk, values[i])
		if bit {
			newValues = append(newValues, chunk)
			chunk = []int64{}
		}
	}
	chunk = append(chunk, values[len(values)-1])
	newValues = append(newValues, chunk)
	return
}

func lib_UnsetInt64(values []int64, i int) ([]int64, error) {
	if i < 0 {
		return nil, fmt.Errorf("negative number index is given: %d", i)
	}

	if i >= len(values) {
		return nil, fmt.Errorf("index(%d) is larger than slice length(%d)", i, len(values))
	}

	if len(values) == 1 {
		return []int64{}, nil
	}

	if i == len(values)-1 {
		return values[:len(values)-1], nil
	}

	newValues := make([]int64, len(values))
	copy(newValues, values)
	return append(newValues[:i], newValues[i+1:]...), nil
}

func lib_Int64Combination(values []int64, r int) (combinations [][]int64, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, []int64{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
		}
		partialCombinations, err := lib_Int64Combination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Int64Permutation(values []int64, r int) (permutations [][]int64) {
	if r == 1 {
		for _, value := range values {
			permutations = append(permutations, []int64{value})
		}
		return
	}
	for i := range values {
		newValues := lib_Int64RemoveFromSlice(values, i)
		for _, pc := range lib_Int64Permutation(newValues, r-1) {
			newC := append(pc, values[i])
			permutations = append(permutations, newC)
		}
	}
	return
}

func lib_Int64SliceCombination(values [][]int64, r int) (combinations [][][]int64, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, [][]int64{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
			if err != nil {
				return nil, err
			}
		}
		partialCombinations, err := lib_Int64SliceCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Int64RemoveFromSlice(slice []int64, i int) []int64 {
	n := make([]int64, len(slice))
	copy(n, slice)
	return append(n[:i], n[i+1:]...)
}

func lib_TernaryOPInt64(ok bool, v1, v2 int64) int64 {
	if ok {
		return v1
	}
	return v2
}

type lib_UnionFindInt64 struct {
	nodes map[int64]int64
}

func lib_NewUnionFindInt64(values []int64) *lib_UnionFindInt64 {
	m := map[int64]int64{}
	for _, v := range values {
		m[v] = v
	}
	return &lib_UnionFindInt64{nodes: m}
}

func (u *lib_UnionFindInt64) GetRoot(value int64) (int64, int) {
	v := value
	newV := u.nodes[v]
	cnt := 0
	for newV != v {
		cnt++
		oldV := v
		v = newV
		newV = u.nodes[newV]
		u.nodes[oldV] = newV
	}
	return newV, cnt
}

func (u *lib_UnionFindInt64) Unite(v1, v2 int64) (int64, bool) {
	v1Root, v1HopNum := u.GetRoot(v1)
	v2Root, v2HopNum := u.GetRoot(v2)
	if v1Root == v2Root {
		return v1Root, false
	}
	if v1HopNum >= v2HopNum {
		u.nodes[v2Root] = v1Root
		return v1Root, true
	}
	u.nodes[v1Root] = v2Root
	return v2Root, true
}

func (u *lib_UnionFindInt64) IsSameGroup(v1, v2 int64) bool {
	v1Root, _ := u.GetRoot(v1)
	v2Root, _ := u.GetRoot(v2)
	return v1Root == v2Root
}

func lib_MemoizeInt64(f func(v int64) int64) func(v int64) int64 {
	cache := map[int64]int64{}
	return func(v int64) int64 {
		if cachedResult, ok := cache[v]; ok {
			return cachedResult
		}
		result := f(v)
		cache[v] = result
		return result
	}
}

func lib_ReduceFloat32(values []float32, f func(acc, cur float32) float32, initial float32) (newValue float32) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_ReduceFloat32Slice(values [][]float32, f func(acc float32, cur []float32) float32, initial float32) (newValue float32) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_CopyFloat32(values []float32) []float32 {
	dst := make([]float32, len(values))
	copy(dst, values)
	return dst
}

func lib_CopyFloat32Slice(values [][]float32) [][]float32 {
	dst := make([][]float32, len(values))
	for i, value := range values {
		dst[i] = lib_CopyFloat32(value)
	}
	return dst
}

func lib_ReverseFloat32(values []float32) []float32 {
	newValues := lib_CopyFloat32(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_ReverseFloat32Slice(values [][]float32) [][]float32 {
	newValues := lib_CopyFloat32Slice(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_MapFloat32(values []float32, f func(v float32) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat32Slice(values [][]float32, f func(v []float32) []float32) (newValues [][]float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapTypeFloat32(values [][]float32, f func(v []float32) float32) (newValues []float32) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_ZipFloat32(valuesList ...[]float32) (newValuesList [][]float32, err error) {
	if len(valuesList) == 0 {
		return nil, errors.New("empty values list are given to ZipFloat32")
	}
	valuesLen := len(valuesList[0])
	for _, values := range valuesList {
		if (len(values)) != valuesLen {
			return nil, errors.New("different lengths values are given to ZipFloat32")
		}
	}

	for i := 0; i < valuesLen; i++ {
		var newValues []float32
		for _, values := range valuesList {
			newValues = append(newValues, values[i])
		}
		newValuesList = append(newValuesList, newValues)
	}
	return
}

func lib_SomeFloat32(values []float32, f func(v float32) bool) bool {
	for _, value := range values {
		if f(value) {
			return true
		}
	}
	return false
}

func lib_SomeFloat32Slice(valuesList [][]float32, f func(v []float32) bool) bool {
	for _, values := range valuesList {
		if f(values) {
			return true
		}
	}
	return false
}

func lib_EveryFloat32(values []float32, f func(v float32) bool) bool {
	for _, value := range values {
		if !f(value) {
			return false
		}
	}
	return true
}

func lib_EveryFloat32Slice(valuesList [][]float32, f func(v []float32) bool) bool {
	for _, values := range valuesList {
		if !f(values) {
			return false
		}
	}
	return true
}

func lib_ChunkFloat32ByBits(values []float32, bits []bool) (newValues [][]float32, err error) {
	if len(values) != len(bits)+1 {
		return nil, errors.New(fmt.Sprintf("there are different length between values(%d) and bits(%d)", len(values), len(bits)))
	}

	var chunk []float32
	for i, bit := range bits {
		chunk = append(chunk, values[i])
		if bit {
			newValues = append(newValues, chunk)
			chunk = []float32{}
		}
	}
	chunk = append(chunk, values[len(values)-1])
	newValues = append(newValues, chunk)
	return
}

func lib_UnsetFloat32(values []float32, i int) ([]float32, error) {
	if i < 0 {
		return nil, fmt.Errorf("negative number index is given: %d", i)
	}

	if i >= len(values) {
		return nil, fmt.Errorf("index(%d) is larger than slice length(%d)", i, len(values))
	}

	if len(values) == 1 {
		return []float32{}, nil
	}

	if i == len(values)-1 {
		return values[:len(values)-1], nil
	}

	newValues := make([]float32, len(values))
	copy(newValues, values)
	return append(newValues[:i], newValues[i+1:]...), nil
}

func lib_Float32Combination(values []float32, r int) (combinations [][]float32, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, []float32{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
		}
		partialCombinations, err := lib_Float32Combination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Float32Permutation(values []float32, r int) (permutations [][]float32) {
	if r == 1 {
		for _, value := range values {
			permutations = append(permutations, []float32{value})
		}
		return
	}
	for i := range values {
		newValues := lib_Float32RemoveFromSlice(values, i)
		for _, pc := range lib_Float32Permutation(newValues, r-1) {
			newC := append(pc, values[i])
			permutations = append(permutations, newC)
		}
	}
	return
}

func lib_Float32SliceCombination(values [][]float32, r int) (combinations [][][]float32, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, [][]float32{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
			if err != nil {
				return nil, err
			}
		}
		partialCombinations, err := lib_Float32SliceCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Float32RemoveFromSlice(slice []float32, i int) []float32 {
	n := make([]float32, len(slice))
	copy(n, slice)
	return append(n[:i], n[i+1:]...)
}

func lib_TernaryOPFloat32(ok bool, v1, v2 float32) float32 {
	if ok {
		return v1
	}
	return v2
}

type lib_UnionFindFloat32 struct {
	nodes map[float32]float32
}

func lib_NewUnionFindFloat32(values []float32) *lib_UnionFindFloat32 {
	m := map[float32]float32{}
	for _, v := range values {
		m[v] = v
	}
	return &lib_UnionFindFloat32{nodes: m}
}

func (u *lib_UnionFindFloat32) GetRoot(value float32) (float32, int) {
	v := value
	newV := u.nodes[v]
	cnt := 0
	for newV != v {
		cnt++
		oldV := v
		v = newV
		newV = u.nodes[newV]
		u.nodes[oldV] = newV
	}
	return newV, cnt
}

func (u *lib_UnionFindFloat32) Unite(v1, v2 float32) (float32, bool) {
	v1Root, v1HopNum := u.GetRoot(v1)
	v2Root, v2HopNum := u.GetRoot(v2)
	if v1Root == v2Root {
		return v1Root, false
	}
	if v1HopNum >= v2HopNum {
		u.nodes[v2Root] = v1Root
		return v1Root, true
	}
	u.nodes[v1Root] = v2Root
	return v2Root, true
}

func (u *lib_UnionFindFloat32) IsSameGroup(v1, v2 float32) bool {
	v1Root, _ := u.GetRoot(v1)
	v2Root, _ := u.GetRoot(v2)
	return v1Root == v2Root
}

func lib_MemoizeFloat32(f func(v float32) float32) func(v float32) float32 {
	cache := map[float32]float32{}
	return func(v float32) float32 {
		if cachedResult, ok := cache[v]; ok {
			return cachedResult
		}
		result := f(v)
		cache[v] = result
		return result
	}
}

func lib_ReduceFloat64(values []float64, f func(acc, cur float64) float64, initial float64) (newValue float64) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_ReduceFloat64Slice(values [][]float64, f func(acc float64, cur []float64) float64, initial float64) (newValue float64) {
	newValue = initial
	for _, value := range values {
		newValue = f(newValue, value)
	}
	return
}

func lib_CopyFloat64(values []float64) []float64 {
	dst := make([]float64, len(values))
	copy(dst, values)
	return dst
}

func lib_CopyFloat64Slice(values [][]float64) [][]float64 {
	dst := make([][]float64, len(values))
	for i, value := range values {
		dst[i] = lib_CopyFloat64(value)
	}
	return dst
}

func lib_ReverseFloat64(values []float64) []float64 {
	newValues := lib_CopyFloat64(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_ReverseFloat64Slice(values [][]float64) [][]float64 {
	newValues := lib_CopyFloat64Slice(values)
	for i, j := 0, len(values)-1; i < j; i, j = i+1, j-1 {
		newValues[i], newValues[j] = values[j], values[i]
	}
	return newValues
}

func lib_MapFloat64(values []float64, f func(v float64) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapFloat64Slice(values [][]float64, f func(v []float64) []float64) (newValues [][]float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_MapTypeFloat64(values [][]float64, f func(v []float64) float64) (newValues []float64) {
	for _, value := range values {
		newValues = append(newValues, f(value))
	}
	return
}

func lib_ZipFloat64(valuesList ...[]float64) (newValuesList [][]float64, err error) {
	if len(valuesList) == 0 {
		return nil, errors.New("empty values list are given to ZipFloat64")
	}
	valuesLen := len(valuesList[0])
	for _, values := range valuesList {
		if (len(values)) != valuesLen {
			return nil, errors.New("different lengths values are given to ZipFloat64")
		}
	}

	for i := 0; i < valuesLen; i++ {
		var newValues []float64
		for _, values := range valuesList {
			newValues = append(newValues, values[i])
		}
		newValuesList = append(newValuesList, newValues)
	}
	return
}

func lib_SomeFloat64(values []float64, f func(v float64) bool) bool {
	for _, value := range values {
		if f(value) {
			return true
		}
	}
	return false
}

func lib_SomeFloat64Slice(valuesList [][]float64, f func(v []float64) bool) bool {
	for _, values := range valuesList {
		if f(values) {
			return true
		}
	}
	return false
}

func lib_EveryFloat64(values []float64, f func(v float64) bool) bool {
	for _, value := range values {
		if !f(value) {
			return false
		}
	}
	return true
}

func lib_EveryFloat64Slice(valuesList [][]float64, f func(v []float64) bool) bool {
	for _, values := range valuesList {
		if !f(values) {
			return false
		}
	}
	return true
}

func lib_ChunkFloat64ByBits(values []float64, bits []bool) (newValues [][]float64, err error) {
	if len(values) != len(bits)+1 {
		return nil, errors.New(fmt.Sprintf("there are different length between values(%d) and bits(%d)", len(values), len(bits)))
	}

	var chunk []float64
	for i, bit := range bits {
		chunk = append(chunk, values[i])
		if bit {
			newValues = append(newValues, chunk)
			chunk = []float64{}
		}
	}
	chunk = append(chunk, values[len(values)-1])
	newValues = append(newValues, chunk)
	return
}

func lib_UnsetFloat64(values []float64, i int) ([]float64, error) {
	if i < 0 {
		return nil, fmt.Errorf("negative number index is given: %d", i)
	}

	if i >= len(values) {
		return nil, fmt.Errorf("index(%d) is larger than slice length(%d)", i, len(values))
	}

	if len(values) == 1 {
		return []float64{}, nil
	}

	if i == len(values)-1 {
		return values[:len(values)-1], nil
	}

	newValues := make([]float64, len(values))
	copy(newValues, values)
	return append(newValues[:i], newValues[i+1:]...), nil
}

func lib_Float64Combination(values []float64, r int) (combinations [][]float64, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, []float64{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
		}
		partialCombinations, err := lib_Float64Combination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Float64Permutation(values []float64, r int) (permutations [][]float64) {
	if r == 1 {
		for _, value := range values {
			permutations = append(permutations, []float64{value})
		}
		return
	}
	for i := range values {
		newValues := lib_Float64RemoveFromSlice(values, i)
		for _, pc := range lib_Float64Permutation(newValues, r-1) {
			newC := append(pc, values[i])
			permutations = append(permutations, newC)
		}
	}
	return
}

func lib_Float64SliceCombination(values [][]float64, r int) (combinations [][][]float64, err error) {
	if r == 1 {
		for _, value := range values {
			combinations = append(combinations, [][]float64{value})
		}
		return
	}

	for i := range values {
		newValues := values
		for j := 0; j <= i; j++ {
			newValues = newValues[1:]
			if err != nil {
				return nil, err
			}
		}
		partialCombinations, err := lib_Float64SliceCombination(newValues, r-1)
		if err != nil {
			return nil, err
		}

		for _, pc := range partialCombinations {
			newC := append(pc, values[i])
			combinations = append(combinations, newC)
		}
	}
	return
}

func lib_Float64RemoveFromSlice(slice []float64, i int) []float64 {
	n := make([]float64, len(slice))
	copy(n, slice)
	return append(n[:i], n[i+1:]...)
}

func lib_TernaryOPFloat64(ok bool, v1, v2 float64) float64 {
	if ok {
		return v1
	}
	return v2
}

type lib_UnionFindFloat64 struct {
	nodes map[float64]float64
}

func lib_NewUnionFindFloat64(values []float64) *lib_UnionFindFloat64 {
	m := map[float64]float64{}
	for _, v := range values {
		m[v] = v
	}
	return &lib_UnionFindFloat64{nodes: m}
}

func (u *lib_UnionFindFloat64) GetRoot(value float64) (float64, int) {
	v := value
	newV := u.nodes[v]
	cnt := 0
	for newV != v {
		cnt++
		oldV := v
		v = newV
		newV = u.nodes[newV]
		u.nodes[oldV] = newV
	}
	return newV, cnt
}

func (u *lib_UnionFindFloat64) Unite(v1, v2 float64) (float64, bool) {
	v1Root, v1HopNum := u.GetRoot(v1)
	v2Root, v2HopNum := u.GetRoot(v2)
	if v1Root == v2Root {
		return v1Root, false
	}
	if v1HopNum >= v2HopNum {
		u.nodes[v2Root] = v1Root
		return v1Root, true
	}
	u.nodes[v1Root] = v2Root
	return v2Root, true
}

func (u *lib_UnionFindFloat64) IsSameGroup(v1, v2 float64) bool {
	v1Root, _ := u.GetRoot(v1)
	v2Root, _ := u.GetRoot(v2)
	return v1Root == v2Root
}

func lib_MemoizeFloat64(f func(v float64) float64) func(v float64) float64 {
	cache := map[float64]float64{}
	return func(v float64) float64 {
		if cachedResult, ok := cache[v]; ok {
			return cachedResult
		}
		result := f(v)
		cache[v] = result
		return result
	}
}

func lib_MemoizeRune2ToRune(f func(v1, v2 rune) rune) func(v1, v2 rune) rune {
	cache := map[rune]map[rune]rune{}

	return func(v1, v2 rune) rune {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[rune]rune{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeRune5ToRune(f func(v1, v2, v3, v4, v5 rune) rune) func(v1, v2, v3, v4, v5 rune) rune {
	cache := map[rune]map[rune]map[rune]map[rune]map[rune]rune{}

	return func(v1, v2, v3, v4, v5 rune) rune {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[rune]map[rune]map[rune]map[rune]rune{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[rune]map[rune]map[rune]rune{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[rune]map[rune]rune{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[rune]rune{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeRune2ToString(f func(v1, v2 rune) string) func(v1, v2 rune) string {
	cache := map[rune]map[rune]string{}

	return func(v1, v2 rune) string {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[rune]string{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeRune5ToString(f func(v1, v2, v3, v4, v5 rune) string) func(v1, v2, v3, v4, v5 rune) string {
	cache := map[rune]map[rune]map[rune]map[rune]map[rune]string{}

	return func(v1, v2, v3, v4, v5 rune) string {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[rune]map[rune]map[rune]map[rune]string{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[rune]map[rune]map[rune]string{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[rune]map[rune]string{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[rune]string{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeRune2ToInt(f func(v1, v2 rune) int) func(v1, v2 rune) int {
	cache := map[rune]map[rune]int{}

	return func(v1, v2 rune) int {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[rune]int{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeRune5ToInt(f func(v1, v2, v3, v4, v5 rune) int) func(v1, v2, v3, v4, v5 rune) int {
	cache := map[rune]map[rune]map[rune]map[rune]map[rune]int{}

	return func(v1, v2, v3, v4, v5 rune) int {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[rune]map[rune]map[rune]map[rune]int{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[rune]map[rune]map[rune]int{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[rune]map[rune]int{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[rune]int{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeRune2ToInt8(f func(v1, v2 rune) int8) func(v1, v2 rune) int8 {
	cache := map[rune]map[rune]int8{}

	return func(v1, v2 rune) int8 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[rune]int8{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeRune5ToInt8(f func(v1, v2, v3, v4, v5 rune) int8) func(v1, v2, v3, v4, v5 rune) int8 {
	cache := map[rune]map[rune]map[rune]map[rune]map[rune]int8{}

	return func(v1, v2, v3, v4, v5 rune) int8 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[rune]map[rune]map[rune]map[rune]int8{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[rune]map[rune]map[rune]int8{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[rune]map[rune]int8{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[rune]int8{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeRune2ToInt16(f func(v1, v2 rune) int16) func(v1, v2 rune) int16 {
	cache := map[rune]map[rune]int16{}

	return func(v1, v2 rune) int16 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[rune]int16{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeRune5ToInt16(f func(v1, v2, v3, v4, v5 rune) int16) func(v1, v2, v3, v4, v5 rune) int16 {
	cache := map[rune]map[rune]map[rune]map[rune]map[rune]int16{}

	return func(v1, v2, v3, v4, v5 rune) int16 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[rune]map[rune]map[rune]map[rune]int16{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[rune]map[rune]map[rune]int16{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[rune]map[rune]int16{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[rune]int16{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeRune2ToInt32(f func(v1, v2 rune) int32) func(v1, v2 rune) int32 {
	cache := map[rune]map[rune]int32{}

	return func(v1, v2 rune) int32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[rune]int32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeRune5ToInt32(f func(v1, v2, v3, v4, v5 rune) int32) func(v1, v2, v3, v4, v5 rune) int32 {
	cache := map[rune]map[rune]map[rune]map[rune]map[rune]int32{}

	return func(v1, v2, v3, v4, v5 rune) int32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[rune]map[rune]map[rune]map[rune]int32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[rune]map[rune]map[rune]int32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[rune]map[rune]int32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[rune]int32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeRune2ToInt64(f func(v1, v2 rune) int64) func(v1, v2 rune) int64 {
	cache := map[rune]map[rune]int64{}

	return func(v1, v2 rune) int64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[rune]int64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeRune5ToInt64(f func(v1, v2, v3, v4, v5 rune) int64) func(v1, v2, v3, v4, v5 rune) int64 {
	cache := map[rune]map[rune]map[rune]map[rune]map[rune]int64{}

	return func(v1, v2, v3, v4, v5 rune) int64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[rune]map[rune]map[rune]map[rune]int64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[rune]map[rune]map[rune]int64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[rune]map[rune]int64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[rune]int64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeRune2ToFloat32(f func(v1, v2 rune) float32) func(v1, v2 rune) float32 {
	cache := map[rune]map[rune]float32{}

	return func(v1, v2 rune) float32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[rune]float32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeRune5ToFloat32(f func(v1, v2, v3, v4, v5 rune) float32) func(v1, v2, v3, v4, v5 rune) float32 {
	cache := map[rune]map[rune]map[rune]map[rune]map[rune]float32{}

	return func(v1, v2, v3, v4, v5 rune) float32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[rune]map[rune]map[rune]map[rune]float32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[rune]map[rune]map[rune]float32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[rune]map[rune]float32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[rune]float32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeRune2ToFloat64(f func(v1, v2 rune) float64) func(v1, v2 rune) float64 {
	cache := map[rune]map[rune]float64{}

	return func(v1, v2 rune) float64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[rune]float64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeRune5ToFloat64(f func(v1, v2, v3, v4, v5 rune) float64) func(v1, v2, v3, v4, v5 rune) float64 {
	cache := map[rune]map[rune]map[rune]map[rune]map[rune]float64{}

	return func(v1, v2, v3, v4, v5 rune) float64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[rune]map[rune]map[rune]map[rune]float64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[rune]map[rune]map[rune]float64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[rune]map[rune]float64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[rune]float64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeString2ToRune(f func(v1, v2 string) rune) func(v1, v2 string) rune {
	cache := map[string]map[string]rune{}

	return func(v1, v2 string) rune {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[string]rune{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeString5ToRune(f func(v1, v2, v3, v4, v5 string) rune) func(v1, v2, v3, v4, v5 string) rune {
	cache := map[string]map[string]map[string]map[string]map[string]rune{}

	return func(v1, v2, v3, v4, v5 string) rune {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[string]map[string]map[string]map[string]rune{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[string]map[string]map[string]rune{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[string]map[string]rune{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[string]rune{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeString2ToString(f func(v1, v2 string) string) func(v1, v2 string) string {
	cache := map[string]map[string]string{}

	return func(v1, v2 string) string {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[string]string{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeString5ToString(f func(v1, v2, v3, v4, v5 string) string) func(v1, v2, v3, v4, v5 string) string {
	cache := map[string]map[string]map[string]map[string]map[string]string{}

	return func(v1, v2, v3, v4, v5 string) string {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[string]map[string]map[string]map[string]string{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[string]map[string]map[string]string{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[string]map[string]string{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[string]string{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeString2ToInt(f func(v1, v2 string) int) func(v1, v2 string) int {
	cache := map[string]map[string]int{}

	return func(v1, v2 string) int {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[string]int{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeString5ToInt(f func(v1, v2, v3, v4, v5 string) int) func(v1, v2, v3, v4, v5 string) int {
	cache := map[string]map[string]map[string]map[string]map[string]int{}

	return func(v1, v2, v3, v4, v5 string) int {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[string]map[string]map[string]map[string]int{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[string]map[string]map[string]int{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[string]map[string]int{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[string]int{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeString2ToInt8(f func(v1, v2 string) int8) func(v1, v2 string) int8 {
	cache := map[string]map[string]int8{}

	return func(v1, v2 string) int8 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[string]int8{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeString5ToInt8(f func(v1, v2, v3, v4, v5 string) int8) func(v1, v2, v3, v4, v5 string) int8 {
	cache := map[string]map[string]map[string]map[string]map[string]int8{}

	return func(v1, v2, v3, v4, v5 string) int8 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[string]map[string]map[string]map[string]int8{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[string]map[string]map[string]int8{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[string]map[string]int8{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[string]int8{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeString2ToInt16(f func(v1, v2 string) int16) func(v1, v2 string) int16 {
	cache := map[string]map[string]int16{}

	return func(v1, v2 string) int16 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[string]int16{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeString5ToInt16(f func(v1, v2, v3, v4, v5 string) int16) func(v1, v2, v3, v4, v5 string) int16 {
	cache := map[string]map[string]map[string]map[string]map[string]int16{}

	return func(v1, v2, v3, v4, v5 string) int16 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[string]map[string]map[string]map[string]int16{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[string]map[string]map[string]int16{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[string]map[string]int16{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[string]int16{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeString2ToInt32(f func(v1, v2 string) int32) func(v1, v2 string) int32 {
	cache := map[string]map[string]int32{}

	return func(v1, v2 string) int32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[string]int32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeString5ToInt32(f func(v1, v2, v3, v4, v5 string) int32) func(v1, v2, v3, v4, v5 string) int32 {
	cache := map[string]map[string]map[string]map[string]map[string]int32{}

	return func(v1, v2, v3, v4, v5 string) int32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[string]map[string]map[string]map[string]int32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[string]map[string]map[string]int32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[string]map[string]int32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[string]int32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeString2ToInt64(f func(v1, v2 string) int64) func(v1, v2 string) int64 {
	cache := map[string]map[string]int64{}

	return func(v1, v2 string) int64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[string]int64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeString5ToInt64(f func(v1, v2, v3, v4, v5 string) int64) func(v1, v2, v3, v4, v5 string) int64 {
	cache := map[string]map[string]map[string]map[string]map[string]int64{}

	return func(v1, v2, v3, v4, v5 string) int64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[string]map[string]map[string]map[string]int64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[string]map[string]map[string]int64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[string]map[string]int64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[string]int64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeString2ToFloat32(f func(v1, v2 string) float32) func(v1, v2 string) float32 {
	cache := map[string]map[string]float32{}

	return func(v1, v2 string) float32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[string]float32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeString5ToFloat32(f func(v1, v2, v3, v4, v5 string) float32) func(v1, v2, v3, v4, v5 string) float32 {
	cache := map[string]map[string]map[string]map[string]map[string]float32{}

	return func(v1, v2, v3, v4, v5 string) float32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[string]map[string]map[string]map[string]float32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[string]map[string]map[string]float32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[string]map[string]float32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[string]float32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeString2ToFloat64(f func(v1, v2 string) float64) func(v1, v2 string) float64 {
	cache := map[string]map[string]float64{}

	return func(v1, v2 string) float64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[string]float64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeString5ToFloat64(f func(v1, v2, v3, v4, v5 string) float64) func(v1, v2, v3, v4, v5 string) float64 {
	cache := map[string]map[string]map[string]map[string]map[string]float64{}

	return func(v1, v2, v3, v4, v5 string) float64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[string]map[string]map[string]map[string]float64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[string]map[string]map[string]float64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[string]map[string]float64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[string]float64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt2ToRune(f func(v1, v2 int) rune) func(v1, v2 int) rune {
	cache := map[int]map[int]rune{}

	return func(v1, v2 int) rune {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int]rune{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt5ToRune(f func(v1, v2, v3, v4, v5 int) rune) func(v1, v2, v3, v4, v5 int) rune {
	cache := map[int]map[int]map[int]map[int]map[int]rune{}

	return func(v1, v2, v3, v4, v5 int) rune {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int]map[int]map[int]map[int]rune{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int]map[int]map[int]rune{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int]map[int]rune{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int]rune{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt2ToString(f func(v1, v2 int) string) func(v1, v2 int) string {
	cache := map[int]map[int]string{}

	return func(v1, v2 int) string {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int]string{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt5ToString(f func(v1, v2, v3, v4, v5 int) string) func(v1, v2, v3, v4, v5 int) string {
	cache := map[int]map[int]map[int]map[int]map[int]string{}

	return func(v1, v2, v3, v4, v5 int) string {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int]map[int]map[int]map[int]string{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int]map[int]map[int]string{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int]map[int]string{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int]string{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt2ToInt(f func(v1, v2 int) int) func(v1, v2 int) int {
	cache := map[int]map[int]int{}

	return func(v1, v2 int) int {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int]int{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt5ToInt(f func(v1, v2, v3, v4, v5 int) int) func(v1, v2, v3, v4, v5 int) int {
	cache := map[int]map[int]map[int]map[int]map[int]int{}

	return func(v1, v2, v3, v4, v5 int) int {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int]map[int]map[int]map[int]int{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int]map[int]map[int]int{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int]map[int]int{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int]int{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt2ToInt8(f func(v1, v2 int) int8) func(v1, v2 int) int8 {
	cache := map[int]map[int]int8{}

	return func(v1, v2 int) int8 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int]int8{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt5ToInt8(f func(v1, v2, v3, v4, v5 int) int8) func(v1, v2, v3, v4, v5 int) int8 {
	cache := map[int]map[int]map[int]map[int]map[int]int8{}

	return func(v1, v2, v3, v4, v5 int) int8 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int]map[int]map[int]map[int]int8{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int]map[int]map[int]int8{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int]map[int]int8{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int]int8{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt2ToInt16(f func(v1, v2 int) int16) func(v1, v2 int) int16 {
	cache := map[int]map[int]int16{}

	return func(v1, v2 int) int16 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int]int16{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt5ToInt16(f func(v1, v2, v3, v4, v5 int) int16) func(v1, v2, v3, v4, v5 int) int16 {
	cache := map[int]map[int]map[int]map[int]map[int]int16{}

	return func(v1, v2, v3, v4, v5 int) int16 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int]map[int]map[int]map[int]int16{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int]map[int]map[int]int16{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int]map[int]int16{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int]int16{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt2ToInt32(f func(v1, v2 int) int32) func(v1, v2 int) int32 {
	cache := map[int]map[int]int32{}

	return func(v1, v2 int) int32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int]int32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt5ToInt32(f func(v1, v2, v3, v4, v5 int) int32) func(v1, v2, v3, v4, v5 int) int32 {
	cache := map[int]map[int]map[int]map[int]map[int]int32{}

	return func(v1, v2, v3, v4, v5 int) int32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int]map[int]map[int]map[int]int32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int]map[int]map[int]int32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int]map[int]int32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int]int32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt2ToInt64(f func(v1, v2 int) int64) func(v1, v2 int) int64 {
	cache := map[int]map[int]int64{}

	return func(v1, v2 int) int64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int]int64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt5ToInt64(f func(v1, v2, v3, v4, v5 int) int64) func(v1, v2, v3, v4, v5 int) int64 {
	cache := map[int]map[int]map[int]map[int]map[int]int64{}

	return func(v1, v2, v3, v4, v5 int) int64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int]map[int]map[int]map[int]int64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int]map[int]map[int]int64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int]map[int]int64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int]int64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt2ToFloat32(f func(v1, v2 int) float32) func(v1, v2 int) float32 {
	cache := map[int]map[int]float32{}

	return func(v1, v2 int) float32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int]float32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt5ToFloat32(f func(v1, v2, v3, v4, v5 int) float32) func(v1, v2, v3, v4, v5 int) float32 {
	cache := map[int]map[int]map[int]map[int]map[int]float32{}

	return func(v1, v2, v3, v4, v5 int) float32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int]map[int]map[int]map[int]float32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int]map[int]map[int]float32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int]map[int]float32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int]float32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt2ToFloat64(f func(v1, v2 int) float64) func(v1, v2 int) float64 {
	cache := map[int]map[int]float64{}

	return func(v1, v2 int) float64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int]float64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt5ToFloat64(f func(v1, v2, v3, v4, v5 int) float64) func(v1, v2, v3, v4, v5 int) float64 {
	cache := map[int]map[int]map[int]map[int]map[int]float64{}

	return func(v1, v2, v3, v4, v5 int) float64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int]map[int]map[int]map[int]float64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int]map[int]map[int]float64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int]map[int]float64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int]float64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt82ToRune(f func(v1, v2 int8) rune) func(v1, v2 int8) rune {
	cache := map[int8]map[int8]rune{}

	return func(v1, v2 int8) rune {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int8]rune{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt85ToRune(f func(v1, v2, v3, v4, v5 int8) rune) func(v1, v2, v3, v4, v5 int8) rune {
	cache := map[int8]map[int8]map[int8]map[int8]map[int8]rune{}

	return func(v1, v2, v3, v4, v5 int8) rune {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int8]map[int8]map[int8]map[int8]rune{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int8]map[int8]map[int8]rune{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int8]map[int8]rune{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int8]rune{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt82ToString(f func(v1, v2 int8) string) func(v1, v2 int8) string {
	cache := map[int8]map[int8]string{}

	return func(v1, v2 int8) string {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int8]string{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt85ToString(f func(v1, v2, v3, v4, v5 int8) string) func(v1, v2, v3, v4, v5 int8) string {
	cache := map[int8]map[int8]map[int8]map[int8]map[int8]string{}

	return func(v1, v2, v3, v4, v5 int8) string {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int8]map[int8]map[int8]map[int8]string{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int8]map[int8]map[int8]string{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int8]map[int8]string{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int8]string{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt82ToInt(f func(v1, v2 int8) int) func(v1, v2 int8) int {
	cache := map[int8]map[int8]int{}

	return func(v1, v2 int8) int {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int8]int{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt85ToInt(f func(v1, v2, v3, v4, v5 int8) int) func(v1, v2, v3, v4, v5 int8) int {
	cache := map[int8]map[int8]map[int8]map[int8]map[int8]int{}

	return func(v1, v2, v3, v4, v5 int8) int {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int8]map[int8]map[int8]map[int8]int{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int8]map[int8]map[int8]int{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int8]map[int8]int{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int8]int{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt82ToInt8(f func(v1, v2 int8) int8) func(v1, v2 int8) int8 {
	cache := map[int8]map[int8]int8{}

	return func(v1, v2 int8) int8 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int8]int8{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt85ToInt8(f func(v1, v2, v3, v4, v5 int8) int8) func(v1, v2, v3, v4, v5 int8) int8 {
	cache := map[int8]map[int8]map[int8]map[int8]map[int8]int8{}

	return func(v1, v2, v3, v4, v5 int8) int8 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int8]map[int8]map[int8]map[int8]int8{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int8]map[int8]map[int8]int8{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int8]map[int8]int8{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int8]int8{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt82ToInt16(f func(v1, v2 int8) int16) func(v1, v2 int8) int16 {
	cache := map[int8]map[int8]int16{}

	return func(v1, v2 int8) int16 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int8]int16{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt85ToInt16(f func(v1, v2, v3, v4, v5 int8) int16) func(v1, v2, v3, v4, v5 int8) int16 {
	cache := map[int8]map[int8]map[int8]map[int8]map[int8]int16{}

	return func(v1, v2, v3, v4, v5 int8) int16 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int8]map[int8]map[int8]map[int8]int16{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int8]map[int8]map[int8]int16{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int8]map[int8]int16{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int8]int16{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt82ToInt32(f func(v1, v2 int8) int32) func(v1, v2 int8) int32 {
	cache := map[int8]map[int8]int32{}

	return func(v1, v2 int8) int32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int8]int32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt85ToInt32(f func(v1, v2, v3, v4, v5 int8) int32) func(v1, v2, v3, v4, v5 int8) int32 {
	cache := map[int8]map[int8]map[int8]map[int8]map[int8]int32{}

	return func(v1, v2, v3, v4, v5 int8) int32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int8]map[int8]map[int8]map[int8]int32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int8]map[int8]map[int8]int32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int8]map[int8]int32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int8]int32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt82ToInt64(f func(v1, v2 int8) int64) func(v1, v2 int8) int64 {
	cache := map[int8]map[int8]int64{}

	return func(v1, v2 int8) int64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int8]int64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt85ToInt64(f func(v1, v2, v3, v4, v5 int8) int64) func(v1, v2, v3, v4, v5 int8) int64 {
	cache := map[int8]map[int8]map[int8]map[int8]map[int8]int64{}

	return func(v1, v2, v3, v4, v5 int8) int64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int8]map[int8]map[int8]map[int8]int64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int8]map[int8]map[int8]int64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int8]map[int8]int64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int8]int64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt82ToFloat32(f func(v1, v2 int8) float32) func(v1, v2 int8) float32 {
	cache := map[int8]map[int8]float32{}

	return func(v1, v2 int8) float32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int8]float32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt85ToFloat32(f func(v1, v2, v3, v4, v5 int8) float32) func(v1, v2, v3, v4, v5 int8) float32 {
	cache := map[int8]map[int8]map[int8]map[int8]map[int8]float32{}

	return func(v1, v2, v3, v4, v5 int8) float32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int8]map[int8]map[int8]map[int8]float32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int8]map[int8]map[int8]float32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int8]map[int8]float32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int8]float32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt82ToFloat64(f func(v1, v2 int8) float64) func(v1, v2 int8) float64 {
	cache := map[int8]map[int8]float64{}

	return func(v1, v2 int8) float64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int8]float64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt85ToFloat64(f func(v1, v2, v3, v4, v5 int8) float64) func(v1, v2, v3, v4, v5 int8) float64 {
	cache := map[int8]map[int8]map[int8]map[int8]map[int8]float64{}

	return func(v1, v2, v3, v4, v5 int8) float64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int8]map[int8]map[int8]map[int8]float64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int8]map[int8]map[int8]float64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int8]map[int8]float64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int8]float64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt162ToRune(f func(v1, v2 int16) rune) func(v1, v2 int16) rune {
	cache := map[int16]map[int16]rune{}

	return func(v1, v2 int16) rune {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int16]rune{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt165ToRune(f func(v1, v2, v3, v4, v5 int16) rune) func(v1, v2, v3, v4, v5 int16) rune {
	cache := map[int16]map[int16]map[int16]map[int16]map[int16]rune{}

	return func(v1, v2, v3, v4, v5 int16) rune {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int16]map[int16]map[int16]map[int16]rune{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int16]map[int16]map[int16]rune{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int16]map[int16]rune{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int16]rune{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt162ToString(f func(v1, v2 int16) string) func(v1, v2 int16) string {
	cache := map[int16]map[int16]string{}

	return func(v1, v2 int16) string {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int16]string{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt165ToString(f func(v1, v2, v3, v4, v5 int16) string) func(v1, v2, v3, v4, v5 int16) string {
	cache := map[int16]map[int16]map[int16]map[int16]map[int16]string{}

	return func(v1, v2, v3, v4, v5 int16) string {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int16]map[int16]map[int16]map[int16]string{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int16]map[int16]map[int16]string{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int16]map[int16]string{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int16]string{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt162ToInt(f func(v1, v2 int16) int) func(v1, v2 int16) int {
	cache := map[int16]map[int16]int{}

	return func(v1, v2 int16) int {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int16]int{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt165ToInt(f func(v1, v2, v3, v4, v5 int16) int) func(v1, v2, v3, v4, v5 int16) int {
	cache := map[int16]map[int16]map[int16]map[int16]map[int16]int{}

	return func(v1, v2, v3, v4, v5 int16) int {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int16]map[int16]map[int16]map[int16]int{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int16]map[int16]map[int16]int{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int16]map[int16]int{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int16]int{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt162ToInt8(f func(v1, v2 int16) int8) func(v1, v2 int16) int8 {
	cache := map[int16]map[int16]int8{}

	return func(v1, v2 int16) int8 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int16]int8{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt165ToInt8(f func(v1, v2, v3, v4, v5 int16) int8) func(v1, v2, v3, v4, v5 int16) int8 {
	cache := map[int16]map[int16]map[int16]map[int16]map[int16]int8{}

	return func(v1, v2, v3, v4, v5 int16) int8 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int16]map[int16]map[int16]map[int16]int8{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int16]map[int16]map[int16]int8{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int16]map[int16]int8{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int16]int8{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt162ToInt16(f func(v1, v2 int16) int16) func(v1, v2 int16) int16 {
	cache := map[int16]map[int16]int16{}

	return func(v1, v2 int16) int16 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int16]int16{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt165ToInt16(f func(v1, v2, v3, v4, v5 int16) int16) func(v1, v2, v3, v4, v5 int16) int16 {
	cache := map[int16]map[int16]map[int16]map[int16]map[int16]int16{}

	return func(v1, v2, v3, v4, v5 int16) int16 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int16]map[int16]map[int16]map[int16]int16{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int16]map[int16]map[int16]int16{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int16]map[int16]int16{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int16]int16{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt162ToInt32(f func(v1, v2 int16) int32) func(v1, v2 int16) int32 {
	cache := map[int16]map[int16]int32{}

	return func(v1, v2 int16) int32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int16]int32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt165ToInt32(f func(v1, v2, v3, v4, v5 int16) int32) func(v1, v2, v3, v4, v5 int16) int32 {
	cache := map[int16]map[int16]map[int16]map[int16]map[int16]int32{}

	return func(v1, v2, v3, v4, v5 int16) int32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int16]map[int16]map[int16]map[int16]int32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int16]map[int16]map[int16]int32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int16]map[int16]int32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int16]int32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt162ToInt64(f func(v1, v2 int16) int64) func(v1, v2 int16) int64 {
	cache := map[int16]map[int16]int64{}

	return func(v1, v2 int16) int64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int16]int64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt165ToInt64(f func(v1, v2, v3, v4, v5 int16) int64) func(v1, v2, v3, v4, v5 int16) int64 {
	cache := map[int16]map[int16]map[int16]map[int16]map[int16]int64{}

	return func(v1, v2, v3, v4, v5 int16) int64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int16]map[int16]map[int16]map[int16]int64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int16]map[int16]map[int16]int64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int16]map[int16]int64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int16]int64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt162ToFloat32(f func(v1, v2 int16) float32) func(v1, v2 int16) float32 {
	cache := map[int16]map[int16]float32{}

	return func(v1, v2 int16) float32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int16]float32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt165ToFloat32(f func(v1, v2, v3, v4, v5 int16) float32) func(v1, v2, v3, v4, v5 int16) float32 {
	cache := map[int16]map[int16]map[int16]map[int16]map[int16]float32{}

	return func(v1, v2, v3, v4, v5 int16) float32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int16]map[int16]map[int16]map[int16]float32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int16]map[int16]map[int16]float32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int16]map[int16]float32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int16]float32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt162ToFloat64(f func(v1, v2 int16) float64) func(v1, v2 int16) float64 {
	cache := map[int16]map[int16]float64{}

	return func(v1, v2 int16) float64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int16]float64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt165ToFloat64(f func(v1, v2, v3, v4, v5 int16) float64) func(v1, v2, v3, v4, v5 int16) float64 {
	cache := map[int16]map[int16]map[int16]map[int16]map[int16]float64{}

	return func(v1, v2, v3, v4, v5 int16) float64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int16]map[int16]map[int16]map[int16]float64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int16]map[int16]map[int16]float64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int16]map[int16]float64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int16]float64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt322ToRune(f func(v1, v2 int32) rune) func(v1, v2 int32) rune {
	cache := map[int32]map[int32]rune{}

	return func(v1, v2 int32) rune {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int32]rune{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt325ToRune(f func(v1, v2, v3, v4, v5 int32) rune) func(v1, v2, v3, v4, v5 int32) rune {
	cache := map[int32]map[int32]map[int32]map[int32]map[int32]rune{}

	return func(v1, v2, v3, v4, v5 int32) rune {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int32]map[int32]map[int32]map[int32]rune{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int32]map[int32]map[int32]rune{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int32]map[int32]rune{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int32]rune{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt322ToString(f func(v1, v2 int32) string) func(v1, v2 int32) string {
	cache := map[int32]map[int32]string{}

	return func(v1, v2 int32) string {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int32]string{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt325ToString(f func(v1, v2, v3, v4, v5 int32) string) func(v1, v2, v3, v4, v5 int32) string {
	cache := map[int32]map[int32]map[int32]map[int32]map[int32]string{}

	return func(v1, v2, v3, v4, v5 int32) string {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int32]map[int32]map[int32]map[int32]string{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int32]map[int32]map[int32]string{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int32]map[int32]string{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int32]string{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt322ToInt(f func(v1, v2 int32) int) func(v1, v2 int32) int {
	cache := map[int32]map[int32]int{}

	return func(v1, v2 int32) int {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int32]int{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt325ToInt(f func(v1, v2, v3, v4, v5 int32) int) func(v1, v2, v3, v4, v5 int32) int {
	cache := map[int32]map[int32]map[int32]map[int32]map[int32]int{}

	return func(v1, v2, v3, v4, v5 int32) int {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int32]map[int32]map[int32]map[int32]int{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int32]map[int32]map[int32]int{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int32]map[int32]int{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int32]int{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt322ToInt8(f func(v1, v2 int32) int8) func(v1, v2 int32) int8 {
	cache := map[int32]map[int32]int8{}

	return func(v1, v2 int32) int8 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int32]int8{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt325ToInt8(f func(v1, v2, v3, v4, v5 int32) int8) func(v1, v2, v3, v4, v5 int32) int8 {
	cache := map[int32]map[int32]map[int32]map[int32]map[int32]int8{}

	return func(v1, v2, v3, v4, v5 int32) int8 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int32]map[int32]map[int32]map[int32]int8{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int32]map[int32]map[int32]int8{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int32]map[int32]int8{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int32]int8{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt322ToInt16(f func(v1, v2 int32) int16) func(v1, v2 int32) int16 {
	cache := map[int32]map[int32]int16{}

	return func(v1, v2 int32) int16 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int32]int16{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt325ToInt16(f func(v1, v2, v3, v4, v5 int32) int16) func(v1, v2, v3, v4, v5 int32) int16 {
	cache := map[int32]map[int32]map[int32]map[int32]map[int32]int16{}

	return func(v1, v2, v3, v4, v5 int32) int16 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int32]map[int32]map[int32]map[int32]int16{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int32]map[int32]map[int32]int16{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int32]map[int32]int16{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int32]int16{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt322ToInt32(f func(v1, v2 int32) int32) func(v1, v2 int32) int32 {
	cache := map[int32]map[int32]int32{}

	return func(v1, v2 int32) int32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int32]int32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt325ToInt32(f func(v1, v2, v3, v4, v5 int32) int32) func(v1, v2, v3, v4, v5 int32) int32 {
	cache := map[int32]map[int32]map[int32]map[int32]map[int32]int32{}

	return func(v1, v2, v3, v4, v5 int32) int32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int32]map[int32]map[int32]map[int32]int32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int32]map[int32]map[int32]int32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int32]map[int32]int32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int32]int32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt322ToInt64(f func(v1, v2 int32) int64) func(v1, v2 int32) int64 {
	cache := map[int32]map[int32]int64{}

	return func(v1, v2 int32) int64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int32]int64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt325ToInt64(f func(v1, v2, v3, v4, v5 int32) int64) func(v1, v2, v3, v4, v5 int32) int64 {
	cache := map[int32]map[int32]map[int32]map[int32]map[int32]int64{}

	return func(v1, v2, v3, v4, v5 int32) int64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int32]map[int32]map[int32]map[int32]int64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int32]map[int32]map[int32]int64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int32]map[int32]int64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int32]int64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt322ToFloat32(f func(v1, v2 int32) float32) func(v1, v2 int32) float32 {
	cache := map[int32]map[int32]float32{}

	return func(v1, v2 int32) float32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int32]float32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt325ToFloat32(f func(v1, v2, v3, v4, v5 int32) float32) func(v1, v2, v3, v4, v5 int32) float32 {
	cache := map[int32]map[int32]map[int32]map[int32]map[int32]float32{}

	return func(v1, v2, v3, v4, v5 int32) float32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int32]map[int32]map[int32]map[int32]float32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int32]map[int32]map[int32]float32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int32]map[int32]float32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int32]float32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt322ToFloat64(f func(v1, v2 int32) float64) func(v1, v2 int32) float64 {
	cache := map[int32]map[int32]float64{}

	return func(v1, v2 int32) float64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int32]float64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt325ToFloat64(f func(v1, v2, v3, v4, v5 int32) float64) func(v1, v2, v3, v4, v5 int32) float64 {
	cache := map[int32]map[int32]map[int32]map[int32]map[int32]float64{}

	return func(v1, v2, v3, v4, v5 int32) float64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int32]map[int32]map[int32]map[int32]float64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int32]map[int32]map[int32]float64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int32]map[int32]float64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int32]float64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt642ToRune(f func(v1, v2 int64) rune) func(v1, v2 int64) rune {
	cache := map[int64]map[int64]rune{}

	return func(v1, v2 int64) rune {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int64]rune{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt645ToRune(f func(v1, v2, v3, v4, v5 int64) rune) func(v1, v2, v3, v4, v5 int64) rune {
	cache := map[int64]map[int64]map[int64]map[int64]map[int64]rune{}

	return func(v1, v2, v3, v4, v5 int64) rune {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int64]map[int64]map[int64]map[int64]rune{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int64]map[int64]map[int64]rune{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int64]map[int64]rune{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int64]rune{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt642ToString(f func(v1, v2 int64) string) func(v1, v2 int64) string {
	cache := map[int64]map[int64]string{}

	return func(v1, v2 int64) string {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int64]string{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt645ToString(f func(v1, v2, v3, v4, v5 int64) string) func(v1, v2, v3, v4, v5 int64) string {
	cache := map[int64]map[int64]map[int64]map[int64]map[int64]string{}

	return func(v1, v2, v3, v4, v5 int64) string {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int64]map[int64]map[int64]map[int64]string{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int64]map[int64]map[int64]string{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int64]map[int64]string{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int64]string{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt642ToInt(f func(v1, v2 int64) int) func(v1, v2 int64) int {
	cache := map[int64]map[int64]int{}

	return func(v1, v2 int64) int {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int64]int{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt645ToInt(f func(v1, v2, v3, v4, v5 int64) int) func(v1, v2, v3, v4, v5 int64) int {
	cache := map[int64]map[int64]map[int64]map[int64]map[int64]int{}

	return func(v1, v2, v3, v4, v5 int64) int {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int64]map[int64]map[int64]map[int64]int{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int64]map[int64]map[int64]int{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int64]map[int64]int{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int64]int{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt642ToInt8(f func(v1, v2 int64) int8) func(v1, v2 int64) int8 {
	cache := map[int64]map[int64]int8{}

	return func(v1, v2 int64) int8 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int64]int8{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt645ToInt8(f func(v1, v2, v3, v4, v5 int64) int8) func(v1, v2, v3, v4, v5 int64) int8 {
	cache := map[int64]map[int64]map[int64]map[int64]map[int64]int8{}

	return func(v1, v2, v3, v4, v5 int64) int8 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int64]map[int64]map[int64]map[int64]int8{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int64]map[int64]map[int64]int8{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int64]map[int64]int8{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int64]int8{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt642ToInt16(f func(v1, v2 int64) int16) func(v1, v2 int64) int16 {
	cache := map[int64]map[int64]int16{}

	return func(v1, v2 int64) int16 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int64]int16{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt645ToInt16(f func(v1, v2, v3, v4, v5 int64) int16) func(v1, v2, v3, v4, v5 int64) int16 {
	cache := map[int64]map[int64]map[int64]map[int64]map[int64]int16{}

	return func(v1, v2, v3, v4, v5 int64) int16 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int64]map[int64]map[int64]map[int64]int16{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int64]map[int64]map[int64]int16{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int64]map[int64]int16{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int64]int16{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt642ToInt32(f func(v1, v2 int64) int32) func(v1, v2 int64) int32 {
	cache := map[int64]map[int64]int32{}

	return func(v1, v2 int64) int32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int64]int32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt645ToInt32(f func(v1, v2, v3, v4, v5 int64) int32) func(v1, v2, v3, v4, v5 int64) int32 {
	cache := map[int64]map[int64]map[int64]map[int64]map[int64]int32{}

	return func(v1, v2, v3, v4, v5 int64) int32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int64]map[int64]map[int64]map[int64]int32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int64]map[int64]map[int64]int32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int64]map[int64]int32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int64]int32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt642ToInt64(f func(v1, v2 int64) int64) func(v1, v2 int64) int64 {
	cache := map[int64]map[int64]int64{}

	return func(v1, v2 int64) int64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int64]int64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt645ToInt64(f func(v1, v2, v3, v4, v5 int64) int64) func(v1, v2, v3, v4, v5 int64) int64 {
	cache := map[int64]map[int64]map[int64]map[int64]map[int64]int64{}

	return func(v1, v2, v3, v4, v5 int64) int64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int64]map[int64]map[int64]map[int64]int64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int64]map[int64]map[int64]int64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int64]map[int64]int64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int64]int64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt642ToFloat32(f func(v1, v2 int64) float32) func(v1, v2 int64) float32 {
	cache := map[int64]map[int64]float32{}

	return func(v1, v2 int64) float32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int64]float32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt645ToFloat32(f func(v1, v2, v3, v4, v5 int64) float32) func(v1, v2, v3, v4, v5 int64) float32 {
	cache := map[int64]map[int64]map[int64]map[int64]map[int64]float32{}

	return func(v1, v2, v3, v4, v5 int64) float32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int64]map[int64]map[int64]map[int64]float32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int64]map[int64]map[int64]float32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int64]map[int64]float32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int64]float32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeInt642ToFloat64(f func(v1, v2 int64) float64) func(v1, v2 int64) float64 {
	cache := map[int64]map[int64]float64{}

	return func(v1, v2 int64) float64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[int64]float64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeInt645ToFloat64(f func(v1, v2, v3, v4, v5 int64) float64) func(v1, v2, v3, v4, v5 int64) float64 {
	cache := map[int64]map[int64]map[int64]map[int64]map[int64]float64{}

	return func(v1, v2, v3, v4, v5 int64) float64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[int64]map[int64]map[int64]map[int64]float64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[int64]map[int64]map[int64]float64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[int64]map[int64]float64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[int64]float64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat322ToRune(f func(v1, v2 float32) rune) func(v1, v2 float32) rune {
	cache := map[float32]map[float32]rune{}

	return func(v1, v2 float32) rune {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float32]rune{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat325ToRune(f func(v1, v2, v3, v4, v5 float32) rune) func(v1, v2, v3, v4, v5 float32) rune {
	cache := map[float32]map[float32]map[float32]map[float32]map[float32]rune{}

	return func(v1, v2, v3, v4, v5 float32) rune {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float32]map[float32]map[float32]map[float32]rune{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float32]map[float32]map[float32]rune{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float32]map[float32]rune{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float32]rune{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat322ToString(f func(v1, v2 float32) string) func(v1, v2 float32) string {
	cache := map[float32]map[float32]string{}

	return func(v1, v2 float32) string {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float32]string{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat325ToString(f func(v1, v2, v3, v4, v5 float32) string) func(v1, v2, v3, v4, v5 float32) string {
	cache := map[float32]map[float32]map[float32]map[float32]map[float32]string{}

	return func(v1, v2, v3, v4, v5 float32) string {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float32]map[float32]map[float32]map[float32]string{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float32]map[float32]map[float32]string{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float32]map[float32]string{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float32]string{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat322ToInt(f func(v1, v2 float32) int) func(v1, v2 float32) int {
	cache := map[float32]map[float32]int{}

	return func(v1, v2 float32) int {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float32]int{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat325ToInt(f func(v1, v2, v3, v4, v5 float32) int) func(v1, v2, v3, v4, v5 float32) int {
	cache := map[float32]map[float32]map[float32]map[float32]map[float32]int{}

	return func(v1, v2, v3, v4, v5 float32) int {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float32]map[float32]map[float32]map[float32]int{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float32]map[float32]map[float32]int{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float32]map[float32]int{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float32]int{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat322ToInt8(f func(v1, v2 float32) int8) func(v1, v2 float32) int8 {
	cache := map[float32]map[float32]int8{}

	return func(v1, v2 float32) int8 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float32]int8{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat325ToInt8(f func(v1, v2, v3, v4, v5 float32) int8) func(v1, v2, v3, v4, v5 float32) int8 {
	cache := map[float32]map[float32]map[float32]map[float32]map[float32]int8{}

	return func(v1, v2, v3, v4, v5 float32) int8 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float32]map[float32]map[float32]map[float32]int8{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float32]map[float32]map[float32]int8{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float32]map[float32]int8{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float32]int8{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat322ToInt16(f func(v1, v2 float32) int16) func(v1, v2 float32) int16 {
	cache := map[float32]map[float32]int16{}

	return func(v1, v2 float32) int16 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float32]int16{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat325ToInt16(f func(v1, v2, v3, v4, v5 float32) int16) func(v1, v2, v3, v4, v5 float32) int16 {
	cache := map[float32]map[float32]map[float32]map[float32]map[float32]int16{}

	return func(v1, v2, v3, v4, v5 float32) int16 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float32]map[float32]map[float32]map[float32]int16{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float32]map[float32]map[float32]int16{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float32]map[float32]int16{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float32]int16{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat322ToInt32(f func(v1, v2 float32) int32) func(v1, v2 float32) int32 {
	cache := map[float32]map[float32]int32{}

	return func(v1, v2 float32) int32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float32]int32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat325ToInt32(f func(v1, v2, v3, v4, v5 float32) int32) func(v1, v2, v3, v4, v5 float32) int32 {
	cache := map[float32]map[float32]map[float32]map[float32]map[float32]int32{}

	return func(v1, v2, v3, v4, v5 float32) int32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float32]map[float32]map[float32]map[float32]int32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float32]map[float32]map[float32]int32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float32]map[float32]int32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float32]int32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat322ToInt64(f func(v1, v2 float32) int64) func(v1, v2 float32) int64 {
	cache := map[float32]map[float32]int64{}

	return func(v1, v2 float32) int64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float32]int64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat325ToInt64(f func(v1, v2, v3, v4, v5 float32) int64) func(v1, v2, v3, v4, v5 float32) int64 {
	cache := map[float32]map[float32]map[float32]map[float32]map[float32]int64{}

	return func(v1, v2, v3, v4, v5 float32) int64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float32]map[float32]map[float32]map[float32]int64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float32]map[float32]map[float32]int64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float32]map[float32]int64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float32]int64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat322ToFloat32(f func(v1, v2 float32) float32) func(v1, v2 float32) float32 {
	cache := map[float32]map[float32]float32{}

	return func(v1, v2 float32) float32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float32]float32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat325ToFloat32(f func(v1, v2, v3, v4, v5 float32) float32) func(v1, v2, v3, v4, v5 float32) float32 {
	cache := map[float32]map[float32]map[float32]map[float32]map[float32]float32{}

	return func(v1, v2, v3, v4, v5 float32) float32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float32]map[float32]map[float32]map[float32]float32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float32]map[float32]map[float32]float32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float32]map[float32]float32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float32]float32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat322ToFloat64(f func(v1, v2 float32) float64) func(v1, v2 float32) float64 {
	cache := map[float32]map[float32]float64{}

	return func(v1, v2 float32) float64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float32]float64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat325ToFloat64(f func(v1, v2, v3, v4, v5 float32) float64) func(v1, v2, v3, v4, v5 float32) float64 {
	cache := map[float32]map[float32]map[float32]map[float32]map[float32]float64{}

	return func(v1, v2, v3, v4, v5 float32) float64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float32]map[float32]map[float32]map[float32]float64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float32]map[float32]map[float32]float64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float32]map[float32]float64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float32]float64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat642ToRune(f func(v1, v2 float64) rune) func(v1, v2 float64) rune {
	cache := map[float64]map[float64]rune{}

	return func(v1, v2 float64) rune {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float64]rune{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat645ToRune(f func(v1, v2, v3, v4, v5 float64) rune) func(v1, v2, v3, v4, v5 float64) rune {
	cache := map[float64]map[float64]map[float64]map[float64]map[float64]rune{}

	return func(v1, v2, v3, v4, v5 float64) rune {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float64]map[float64]map[float64]map[float64]rune{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float64]map[float64]map[float64]rune{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float64]map[float64]rune{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float64]rune{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat642ToString(f func(v1, v2 float64) string) func(v1, v2 float64) string {
	cache := map[float64]map[float64]string{}

	return func(v1, v2 float64) string {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float64]string{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat645ToString(f func(v1, v2, v3, v4, v5 float64) string) func(v1, v2, v3, v4, v5 float64) string {
	cache := map[float64]map[float64]map[float64]map[float64]map[float64]string{}

	return func(v1, v2, v3, v4, v5 float64) string {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float64]map[float64]map[float64]map[float64]string{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float64]map[float64]map[float64]string{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float64]map[float64]string{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float64]string{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat642ToInt(f func(v1, v2 float64) int) func(v1, v2 float64) int {
	cache := map[float64]map[float64]int{}

	return func(v1, v2 float64) int {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float64]int{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat645ToInt(f func(v1, v2, v3, v4, v5 float64) int) func(v1, v2, v3, v4, v5 float64) int {
	cache := map[float64]map[float64]map[float64]map[float64]map[float64]int{}

	return func(v1, v2, v3, v4, v5 float64) int {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float64]map[float64]map[float64]map[float64]int{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float64]map[float64]map[float64]int{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float64]map[float64]int{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float64]int{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat642ToInt8(f func(v1, v2 float64) int8) func(v1, v2 float64) int8 {
	cache := map[float64]map[float64]int8{}

	return func(v1, v2 float64) int8 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float64]int8{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat645ToInt8(f func(v1, v2, v3, v4, v5 float64) int8) func(v1, v2, v3, v4, v5 float64) int8 {
	cache := map[float64]map[float64]map[float64]map[float64]map[float64]int8{}

	return func(v1, v2, v3, v4, v5 float64) int8 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float64]map[float64]map[float64]map[float64]int8{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float64]map[float64]map[float64]int8{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float64]map[float64]int8{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float64]int8{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat642ToInt16(f func(v1, v2 float64) int16) func(v1, v2 float64) int16 {
	cache := map[float64]map[float64]int16{}

	return func(v1, v2 float64) int16 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float64]int16{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat645ToInt16(f func(v1, v2, v3, v4, v5 float64) int16) func(v1, v2, v3, v4, v5 float64) int16 {
	cache := map[float64]map[float64]map[float64]map[float64]map[float64]int16{}

	return func(v1, v2, v3, v4, v5 float64) int16 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float64]map[float64]map[float64]map[float64]int16{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float64]map[float64]map[float64]int16{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float64]map[float64]int16{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float64]int16{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat642ToInt32(f func(v1, v2 float64) int32) func(v1, v2 float64) int32 {
	cache := map[float64]map[float64]int32{}

	return func(v1, v2 float64) int32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float64]int32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat645ToInt32(f func(v1, v2, v3, v4, v5 float64) int32) func(v1, v2, v3, v4, v5 float64) int32 {
	cache := map[float64]map[float64]map[float64]map[float64]map[float64]int32{}

	return func(v1, v2, v3, v4, v5 float64) int32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float64]map[float64]map[float64]map[float64]int32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float64]map[float64]map[float64]int32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float64]map[float64]int32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float64]int32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat642ToInt64(f func(v1, v2 float64) int64) func(v1, v2 float64) int64 {
	cache := map[float64]map[float64]int64{}

	return func(v1, v2 float64) int64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float64]int64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat645ToInt64(f func(v1, v2, v3, v4, v5 float64) int64) func(v1, v2, v3, v4, v5 float64) int64 {
	cache := map[float64]map[float64]map[float64]map[float64]map[float64]int64{}

	return func(v1, v2, v3, v4, v5 float64) int64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float64]map[float64]map[float64]map[float64]int64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float64]map[float64]map[float64]int64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float64]map[float64]int64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float64]int64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat642ToFloat32(f func(v1, v2 float64) float32) func(v1, v2 float64) float32 {
	cache := map[float64]map[float64]float32{}

	return func(v1, v2 float64) float32 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float64]float32{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat645ToFloat32(f func(v1, v2, v3, v4, v5 float64) float32) func(v1, v2, v3, v4, v5 float64) float32 {
	cache := map[float64]map[float64]map[float64]map[float64]map[float64]float32{}

	return func(v1, v2, v3, v4, v5 float64) float32 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float64]map[float64]map[float64]map[float64]float32{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float64]map[float64]map[float64]float32{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float64]map[float64]float32{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float64]float32{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

func lib_MemoizeFloat642ToFloat64(f func(v1, v2 float64) float64) func(v1, v2 float64) float64 {
	cache := map[float64]map[float64]float64{}

	return func(v1, v2 float64) float64 {
		if v1Map, ok := cache[v1]; ok {
			if cachedValue, ok := v1Map[v2]; ok {
				return cachedValue
			}
		}

		result := f(v1, v2)
		_, v1Ok := cache[v1]
		if !v1Ok {
			cache[v1] = map[float64]float64{}
		}

		cache[v1][v2] = result
		return result
	}
}

func lib_MemoizeFloat645ToFloat64(f func(v1, v2, v3, v4, v5 float64) float64) func(v1, v2, v3, v4, v5 float64) float64 {
	cache := map[float64]map[float64]map[float64]map[float64]map[float64]float64{}

	return func(v1, v2, v3, v4, v5 float64) float64 {
		if _, ok := cache[v1]; !ok {
			cache[v1] = map[float64]map[float64]map[float64]map[float64]float64{}
		}
		if _, ok := cache[v1][v2]; !ok {
			cache[v1][v2] = map[float64]map[float64]map[float64]float64{}
		}
		if _, ok := cache[v1][v2][v3]; !ok {
			cache[v1][v2][v3] = map[float64]map[float64]float64{}
		}
		if _, ok := cache[v1][v2][v3][v4]; !ok {
			cache[v1][v2][v3][v4] = map[float64]float64{}
		}
		if cachedValue, ok := cache[v1][v2][v3][v4][v5]; ok {
			return cachedValue
		}

		result := f(v1, v2, v3, v4, v5)
		cache[v1][v2][v3][v4][v5] = result
		return result
	}
}

type lib_Graph struct {
	AdjacencyMatrix [][]bool
}

func lib_NewGraph(nodeNum int, edges [][]int, directed bool) (*lib_Graph, error) {
	if nodeNum < 1 {
		return nil, fmt.Errorf("invalid nodeNum: %d", nodeNum)
	}

	var aMatrix [][]bool
	for i := 0; i < nodeNum; i++ {
		line := make([]bool, nodeNum)
		aMatrix = append(aMatrix, line)
	}

	for _, edge := range edges {
		aMatrix[edge[0]][edge[1]] = true
		if !directed {
			aMatrix[edge[1]][edge[0]] = true
		}
	}

	return &lib_Graph{AdjacencyMatrix: aMatrix}, nil
}

func (g *lib_Graph) IsValidPath(path []int) bool {
	for i := 1; i < len(path); i++ {
		if !g.AdjacencyMatrix[path[i-1]][path[i]] {
			return false
		}
	}
	return true
}

func lib_toLines(scanner *bufio.Scanner) [][]string {
	var lines [][]string
	for scanner.Scan() {
		text := lib_TrimSpaceAndNewLineCodeAndTab(scanner.Text())
		if len(text) == 0 {
			lines = append(lines, []string{})
			continue
		}
		line := strings.Split(text, " ")
		lines = append(lines, line)
	}
	return lines
}

func lib_toLinesFromReader(reader *bufio.Reader) (lines [][]string, err error) {
	for {
		chunks, err := lib_readLineAsChunks(reader)
		if err == io.EOF {
			return lines, nil
		}

		if err != nil {
			return nil, fmt.Errorf("failed to read line from reader: %v", err)
		}
		lineStr := lib_TrimSpaceAndNewLineCodeAndTab(strings.Join(chunks, ""))
		line := strings.Split(lineStr, " ")
		lines = append(lines, line)
	}
}

func lib_readLineAsChunks(reader *bufio.Reader) (chunks []string, err error) {
	for {
		chunk, isPrefix, err := reader.ReadLine()
		if err != nil {
			return nil, err
		}
		chunks = append(chunks, string(chunk))
		if !isPrefix {
			return chunks, nil
		}
	}
}

type lib_Input struct {
	lines [][]string
}

func (i *lib_Input) validateColIndex(index int) error {
	if index < 0 {
		return errors.New(fmt.Sprintf("index is under zero: %d", index))
	}

	return nil
}

func (i *lib_Input) validateRowIndex(index int) error {
	if index >= len(i.lines) {
		return errors.New(fmt.Sprintf("index(%d) is larger than lines(%d)", index, len(i.lines)))
	}

	if index < 0 {
		return errors.New(fmt.Sprintf("index is under zero: %d", index))
	}
	return nil
}

func (i *lib_Input) GetLines(startRowIndex, endRowIndex int) ([][]string, error) {
	if err := i.validateRowIndex(startRowIndex); err != nil {
		return nil, fmt.Errorf("invalid start row index: %v", err)
	}
	if err := i.validateRowIndex(endRowIndex - 1); err != nil {
		return nil, fmt.Errorf("invalid end row index: %v", err)
	}
	return i.lines[startRowIndex:endRowIndex], nil
}

func (i *lib_Input) GetStringLinesFrom(fromIndex int) (newLines [][]string, err error) {
	for index := range i.lines {
		if index < fromIndex {
			continue
		}
		newLine, err := i.GetLine(index)
		if err != nil {
			return nil, err
		}
		newLines = append(newLines, newLine)
	}
	return
}

func (i *lib_Input) GetValue(rowIndex, colIndex int) (string, error) {
	line, err := i.GetLine(rowIndex)
	if err != nil {
		return "", err
	}
	if colIndex < 0 || colIndex >= len(line) {
		return "", fmt.Errorf("Invalid col index: %v ", colIndex)
	}
	return line[colIndex], nil
}

func (i *lib_Input) GetFirstValue(rowIndex int) (string, error) {
	return i.GetValue(rowIndex, 0)
}

func (i *lib_Input) GetColLine(colIndex int) (newLine []string, err error) {
	if err := i.validateColIndex(colIndex); err != nil {
		return nil, err
	}

	for i, line := range i.lines {
		if len(line) <= colIndex {
			return nil, errors.New(fmt.Sprintf("col index(%d) is larger than %dth line length(%d)", colIndex, i, len(line)))
		}
		newLine = append(newLine, line[colIndex])
	}

	return newLine, nil
}

func (i *lib_Input) GetLine(index int) ([]string, error) {
	if err := i.validateRowIndex(index); err != nil {
		return nil, err
	}
	return i.lines[index], nil
}

func (i *lib_Input) ReadAsStringGridFrom(fromIndex int) ([][]string, error) {
	lines, err := i.GetStringLinesFrom(fromIndex)
	if err != nil {
		return nil, err
	}

	var m [][]string
	for _, line := range lines {
		if len(line) > 1 {
			return nil, fmt.Errorf("unexpected length line: %v", line)
		}

		var mLine []string
		for _, r := range line[0] {
			mLine = append(mLine, string(r))
		}
		m = append(m, mLine)
	}
	return m, nil
}

func lib_NewInput(scanner *bufio.Scanner) *lib_Input {
	return &lib_Input{
		lines: lib_toLines(scanner),
	}
}

func lib_NewInputFromReader(reader *bufio.Reader) (*lib_Input, error) {
	lines, err := lib_toLinesFromReader(reader)
	if err != nil {
		return nil, fmt.Errorf("failed to create new Input from reader: %v", err)
	}
	return &lib_Input{
		lines: lines,
	}, nil
}

func (i *lib_Input) MustGetIntLines() (newLines [][]int) {
	newLines, err := i.GetIntLines()
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetIntLinesFrom(fromIndex int) (newLines [][]int) {
	newLines, err := i.GetIntLinesFrom(fromIndex)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetIntLineRange(fromRowIndex, rangeNum int) (newLines [][]int) {
	newLines, err := i.GetIntLineRange(fromRowIndex, rangeNum)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetIntLine(index int) []int {
	v, err := i.GetIntLine(index)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetIntValue(rowIndex, colIndex int) int {
	v, err := i.GetIntValue(rowIndex, colIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetFirstIntValue(rowIndex int) int {
	v, err := i.GetFirstIntValue(rowIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetColIntLine(colIndex int) (newLine []int) {
	newLine, err := i.GetColIntLine(colIndex)
	if err != nil {
		panic(err)
	}
	return newLine
}

func (i *lib_Input) MustGetInt8Lines() (newLines [][]int8) {
	newLines, err := i.GetInt8Lines()
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt8LinesFrom(fromIndex int) (newLines [][]int8) {
	newLines, err := i.GetInt8LinesFrom(fromIndex)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt8LineRange(fromRowIndex, rangeNum int) (newLines [][]int8) {
	newLines, err := i.GetInt8LineRange(fromRowIndex, rangeNum)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt8Line(index int) []int8 {
	v, err := i.GetInt8Line(index)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetInt8Value(rowIndex, colIndex int) int8 {
	v, err := i.GetInt8Value(rowIndex, colIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetFirstInt8Value(rowIndex int) int8 {
	v, err := i.GetFirstInt8Value(rowIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetColInt8Line(colIndex int) (newLine []int8) {
	newLine, err := i.GetColInt8Line(colIndex)
	if err != nil {
		panic(err)
	}
	return newLine
}

func (i *lib_Input) MustGetInt16Lines() (newLines [][]int16) {
	newLines, err := i.GetInt16Lines()
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt16LinesFrom(fromIndex int) (newLines [][]int16) {
	newLines, err := i.GetInt16LinesFrom(fromIndex)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt16LineRange(fromRowIndex, rangeNum int) (newLines [][]int16) {
	newLines, err := i.GetInt16LineRange(fromRowIndex, rangeNum)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt16Line(index int) []int16 {
	v, err := i.GetInt16Line(index)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetInt16Value(rowIndex, colIndex int) int16 {
	v, err := i.GetInt16Value(rowIndex, colIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetFirstInt16Value(rowIndex int) int16 {
	v, err := i.GetFirstInt16Value(rowIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetColInt16Line(colIndex int) (newLine []int16) {
	newLine, err := i.GetColInt16Line(colIndex)
	if err != nil {
		panic(err)
	}
	return newLine
}

func (i *lib_Input) MustGetInt32Lines() (newLines [][]int32) {
	newLines, err := i.GetInt32Lines()
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt32LinesFrom(fromIndex int) (newLines [][]int32) {
	newLines, err := i.GetInt32LinesFrom(fromIndex)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt32LineRange(fromRowIndex, rangeNum int) (newLines [][]int32) {
	newLines, err := i.GetInt32LineRange(fromRowIndex, rangeNum)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt32Line(index int) []int32 {
	v, err := i.GetInt32Line(index)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetInt32Value(rowIndex, colIndex int) int32 {
	v, err := i.GetInt32Value(rowIndex, colIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetFirstInt32Value(rowIndex int) int32 {
	v, err := i.GetFirstInt32Value(rowIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetColInt32Line(colIndex int) (newLine []int32) {
	newLine, err := i.GetColInt32Line(colIndex)
	if err != nil {
		panic(err)
	}
	return newLine
}

func (i *lib_Input) MustGetInt64Lines() (newLines [][]int64) {
	newLines, err := i.GetInt64Lines()
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt64LinesFrom(fromIndex int) (newLines [][]int64) {
	newLines, err := i.GetInt64LinesFrom(fromIndex)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt64LineRange(fromRowIndex, rangeNum int) (newLines [][]int64) {
	newLines, err := i.GetInt64LineRange(fromRowIndex, rangeNum)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetInt64Line(index int) []int64 {
	v, err := i.GetInt64Line(index)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetInt64Value(rowIndex, colIndex int) int64 {
	v, err := i.GetInt64Value(rowIndex, colIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetFirstInt64Value(rowIndex int) int64 {
	v, err := i.GetFirstInt64Value(rowIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetColInt64Line(colIndex int) (newLine []int64) {
	newLine, err := i.GetColInt64Line(colIndex)
	if err != nil {
		panic(err)
	}
	return newLine
}

func (i *lib_Input) MustGetFloat32Lines() (newLines [][]float32) {
	newLines, err := i.GetFloat32Lines()
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetFloat32LinesFrom(fromIndex int) (newLines [][]float32) {
	newLines, err := i.GetFloat32LinesFrom(fromIndex)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetFloat32LineRange(fromRowIndex, rangeNum int) (newLines [][]float32) {
	newLines, err := i.GetFloat32LineRange(fromRowIndex, rangeNum)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetFloat32Line(index int) []float32 {
	v, err := i.GetFloat32Line(index)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetFloat32Value(rowIndex, colIndex int) float32 {
	v, err := i.GetFloat32Value(rowIndex, colIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetFirstFloat32Value(rowIndex int) float32 {
	v, err := i.GetFirstFloat32Value(rowIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetColFloat32Line(colIndex int) (newLine []float32) {
	newLine, err := i.GetColFloat32Line(colIndex)
	if err != nil {
		panic(err)
	}
	return newLine
}

func (i *lib_Input) MustGetFloat64Lines() (newLines [][]float64) {
	newLines, err := i.GetFloat64Lines()
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetFloat64LinesFrom(fromIndex int) (newLines [][]float64) {
	newLines, err := i.GetFloat64LinesFrom(fromIndex)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetFloat64LineRange(fromRowIndex, rangeNum int) (newLines [][]float64) {
	newLines, err := i.GetFloat64LineRange(fromRowIndex, rangeNum)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetFloat64Line(index int) []float64 {
	v, err := i.GetFloat64Line(index)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetFloat64Value(rowIndex, colIndex int) float64 {
	v, err := i.GetFloat64Value(rowIndex, colIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetFirstFloat64Value(rowIndex int) float64 {
	v, err := i.GetFirstFloat64Value(rowIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetColFloat64Line(colIndex int) (newLine []float64) {
	newLine, err := i.GetColFloat64Line(colIndex)
	if err != nil {
		panic(err)
	}
	return newLine
}

func lib_MustSubtractIntBy(values1 []int, values2 []int, f func(v int) int) (newValues []int) {
	newValues, err := lib_SubtractIntBy(values1, values2, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustSubtractInt(values1 []int, values2 []int) (newValues []int) {
	newValues, err := lib_SubtractInt(values1, values2)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffIntBy(values []int, f func(v int) int) (newValues []int) {
	newValues, err := lib_RDiffIntBy(values, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffInt(values []int) (newValues []int) {
	newValues, err := lib_RDiffInt(values)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustStringToIntSlice(s string) (ValueLine []int) {
	ValueLine, err := lib_StringToIntSlice(s)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustStringSliceToIntSlice(line []string) (ValueLine []int) {
	ValueLine, err := lib_StringSliceToIntSlice(line)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustMaxInt(values []int) (max int) {
	max, err := lib_MaxInt(values)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntVA(values ...int) (max int) {
	max, err := lib_MaxIntVA(values...)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMinInt(values []int) (min int) {
	min, err := lib_MinInt(values)
	if err != nil {
		panic(err)
	}
	return min
}

func lib_MustSubtractInt8By(values1 []int8, values2 []int8, f func(v int8) int8) (newValues []int8) {
	newValues, err := lib_SubtractInt8By(values1, values2, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustSubtractInt8(values1 []int8, values2 []int8) (newValues []int8) {
	newValues, err := lib_SubtractInt8(values1, values2)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffInt8By(values []int8, f func(v int8) int8) (newValues []int8) {
	newValues, err := lib_RDiffInt8By(values, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffInt8(values []int8) (newValues []int8) {
	newValues, err := lib_RDiffInt8(values)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustStringToInt8Slice(s string) (ValueLine []int8) {
	ValueLine, err := lib_StringToInt8Slice(s)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustStringSliceToInt8Slice(line []string) (ValueLine []int8) {
	ValueLine, err := lib_StringSliceToInt8Slice(line)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustMaxInt8(values []int8) (max int8) {
	max, err := lib_MaxInt8(values)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8VA(values ...int8) (max int8) {
	max, err := lib_MaxInt8VA(values...)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMinInt8(values []int8) (min int8) {
	min, err := lib_MinInt8(values)
	if err != nil {
		panic(err)
	}
	return min
}

func lib_MustSubtractInt16By(values1 []int16, values2 []int16, f func(v int16) int16) (newValues []int16) {
	newValues, err := lib_SubtractInt16By(values1, values2, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustSubtractInt16(values1 []int16, values2 []int16) (newValues []int16) {
	newValues, err := lib_SubtractInt16(values1, values2)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffInt16By(values []int16, f func(v int16) int16) (newValues []int16) {
	newValues, err := lib_RDiffInt16By(values, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffInt16(values []int16) (newValues []int16) {
	newValues, err := lib_RDiffInt16(values)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustStringToInt16Slice(s string) (ValueLine []int16) {
	ValueLine, err := lib_StringToInt16Slice(s)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustStringSliceToInt16Slice(line []string) (ValueLine []int16) {
	ValueLine, err := lib_StringSliceToInt16Slice(line)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustMaxInt16(values []int16) (max int16) {
	max, err := lib_MaxInt16(values)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16VA(values ...int16) (max int16) {
	max, err := lib_MaxInt16VA(values...)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMinInt16(values []int16) (min int16) {
	min, err := lib_MinInt16(values)
	if err != nil {
		panic(err)
	}
	return min
}

func lib_MustSubtractInt32By(values1 []int32, values2 []int32, f func(v int32) int32) (newValues []int32) {
	newValues, err := lib_SubtractInt32By(values1, values2, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustSubtractInt32(values1 []int32, values2 []int32) (newValues []int32) {
	newValues, err := lib_SubtractInt32(values1, values2)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffInt32By(values []int32, f func(v int32) int32) (newValues []int32) {
	newValues, err := lib_RDiffInt32By(values, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffInt32(values []int32) (newValues []int32) {
	newValues, err := lib_RDiffInt32(values)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustStringToInt32Slice(s string) (ValueLine []int32) {
	ValueLine, err := lib_StringToInt32Slice(s)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustStringSliceToInt32Slice(line []string) (ValueLine []int32) {
	ValueLine, err := lib_StringSliceToInt32Slice(line)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustMaxInt32(values []int32) (max int32) {
	max, err := lib_MaxInt32(values)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32VA(values ...int32) (max int32) {
	max, err := lib_MaxInt32VA(values...)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMinInt32(values []int32) (min int32) {
	min, err := lib_MinInt32(values)
	if err != nil {
		panic(err)
	}
	return min
}

func lib_MustSubtractInt64By(values1 []int64, values2 []int64, f func(v int64) int64) (newValues []int64) {
	newValues, err := lib_SubtractInt64By(values1, values2, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustSubtractInt64(values1 []int64, values2 []int64) (newValues []int64) {
	newValues, err := lib_SubtractInt64(values1, values2)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffInt64By(values []int64, f func(v int64) int64) (newValues []int64) {
	newValues, err := lib_RDiffInt64By(values, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffInt64(values []int64) (newValues []int64) {
	newValues, err := lib_RDiffInt64(values)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustStringToInt64Slice(s string) (ValueLine []int64) {
	ValueLine, err := lib_StringToInt64Slice(s)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustStringSliceToInt64Slice(line []string) (ValueLine []int64) {
	ValueLine, err := lib_StringSliceToInt64Slice(line)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustMaxInt64(values []int64) (max int64) {
	max, err := lib_MaxInt64(values)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64VA(values ...int64) (max int64) {
	max, err := lib_MaxInt64VA(values...)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMinInt64(values []int64) (min int64) {
	min, err := lib_MinInt64(values)
	if err != nil {
		panic(err)
	}
	return min
}

func lib_MustSubtractFloat32By(values1 []float32, values2 []float32, f func(v float32) float32) (newValues []float32) {
	newValues, err := lib_SubtractFloat32By(values1, values2, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustSubtractFloat32(values1 []float32, values2 []float32) (newValues []float32) {
	newValues, err := lib_SubtractFloat32(values1, values2)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffFloat32By(values []float32, f func(v float32) float32) (newValues []float32) {
	newValues, err := lib_RDiffFloat32By(values, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffFloat32(values []float32) (newValues []float32) {
	newValues, err := lib_RDiffFloat32(values)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustStringToFloat32Slice(s string) (ValueLine []float32) {
	ValueLine, err := lib_StringToFloat32Slice(s)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustStringSliceToFloat32Slice(line []string) (ValueLine []float32) {
	ValueLine, err := lib_StringSliceToFloat32Slice(line)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustMaxFloat32(values []float32) (max float32) {
	max, err := lib_MaxFloat32(values)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32VA(values ...float32) (max float32) {
	max, err := lib_MaxFloat32VA(values...)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMinFloat32(values []float32) (min float32) {
	min, err := lib_MinFloat32(values)
	if err != nil {
		panic(err)
	}
	return min
}

func lib_MustSubtractFloat64By(values1 []float64, values2 []float64, f func(v float64) float64) (newValues []float64) {
	newValues, err := lib_SubtractFloat64By(values1, values2, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustSubtractFloat64(values1 []float64, values2 []float64) (newValues []float64) {
	newValues, err := lib_SubtractFloat64(values1, values2)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffFloat64By(values []float64, f func(v float64) float64) (newValues []float64) {
	newValues, err := lib_RDiffFloat64By(values, f)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustRDiffFloat64(values []float64) (newValues []float64) {
	newValues, err := lib_RDiffFloat64(values)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustStringToFloat64Slice(s string) (ValueLine []float64) {
	ValueLine, err := lib_StringToFloat64Slice(s)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustStringSliceToFloat64Slice(line []string) (ValueLine []float64) {
	ValueLine, err := lib_StringSliceToFloat64Slice(line)
	if err != nil {
		panic(err)
	}
	return ValueLine
}

func lib_MustMaxFloat64(values []float64) (max float64) {
	max, err := lib_MaxFloat64(values)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64VA(values ...float64) (max float64) {
	max, err := lib_MaxFloat64VA(values...)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMinFloat64(values []float64) (min float64) {
	min, err := lib_MinFloat64(values)
	if err != nil {
		panic(err)
	}
	return min
}

func lib_MustMaxIntByIntSlice(values [][]int, f func(vs []int) int) (max int) {
	max, err := lib_MaxIntByIntSlice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByIntSlice2(values [][][]int, f func(vs [][]int) int) (max int) {
	max, err := lib_MaxIntByIntSlice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByInt8Slice(values [][]int8, f func(vs []int8) int) (max int) {
	max, err := lib_MaxIntByInt8Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByInt8Slice2(values [][][]int8, f func(vs [][]int8) int) (max int) {
	max, err := lib_MaxIntByInt8Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByInt16Slice(values [][]int16, f func(vs []int16) int) (max int) {
	max, err := lib_MaxIntByInt16Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByInt16Slice2(values [][][]int16, f func(vs [][]int16) int) (max int) {
	max, err := lib_MaxIntByInt16Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByInt32Slice(values [][]int32, f func(vs []int32) int) (max int) {
	max, err := lib_MaxIntByInt32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByInt32Slice2(values [][][]int32, f func(vs [][]int32) int) (max int) {
	max, err := lib_MaxIntByInt32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByInt64Slice(values [][]int64, f func(vs []int64) int) (max int) {
	max, err := lib_MaxIntByInt64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByInt64Slice2(values [][][]int64, f func(vs [][]int64) int) (max int) {
	max, err := lib_MaxIntByInt64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByFloat32Slice(values [][]float32, f func(vs []float32) int) (max int) {
	max, err := lib_MaxIntByFloat32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByFloat32Slice2(values [][][]float32, f func(vs [][]float32) int) (max int) {
	max, err := lib_MaxIntByFloat32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByFloat64Slice(values [][]float64, f func(vs []float64) int) (max int) {
	max, err := lib_MaxIntByFloat64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxIntByFloat64Slice2(values [][][]float64, f func(vs [][]float64) int) (max int) {
	max, err := lib_MaxIntByFloat64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByIntSlice(values [][]int, f func(vs []int) int8) (max int8) {
	max, err := lib_MaxInt8ByIntSlice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByIntSlice2(values [][][]int, f func(vs [][]int) int8) (max int8) {
	max, err := lib_MaxInt8ByIntSlice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByInt8Slice(values [][]int8, f func(vs []int8) int8) (max int8) {
	max, err := lib_MaxInt8ByInt8Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByInt8Slice2(values [][][]int8, f func(vs [][]int8) int8) (max int8) {
	max, err := lib_MaxInt8ByInt8Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByInt16Slice(values [][]int16, f func(vs []int16) int8) (max int8) {
	max, err := lib_MaxInt8ByInt16Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByInt16Slice2(values [][][]int16, f func(vs [][]int16) int8) (max int8) {
	max, err := lib_MaxInt8ByInt16Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByInt32Slice(values [][]int32, f func(vs []int32) int8) (max int8) {
	max, err := lib_MaxInt8ByInt32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByInt32Slice2(values [][][]int32, f func(vs [][]int32) int8) (max int8) {
	max, err := lib_MaxInt8ByInt32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByInt64Slice(values [][]int64, f func(vs []int64) int8) (max int8) {
	max, err := lib_MaxInt8ByInt64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByInt64Slice2(values [][][]int64, f func(vs [][]int64) int8) (max int8) {
	max, err := lib_MaxInt8ByInt64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByFloat32Slice(values [][]float32, f func(vs []float32) int8) (max int8) {
	max, err := lib_MaxInt8ByFloat32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) int8) (max int8) {
	max, err := lib_MaxInt8ByFloat32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByFloat64Slice(values [][]float64, f func(vs []float64) int8) (max int8) {
	max, err := lib_MaxInt8ByFloat64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt8ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) int8) (max int8) {
	max, err := lib_MaxInt8ByFloat64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByIntSlice(values [][]int, f func(vs []int) int16) (max int16) {
	max, err := lib_MaxInt16ByIntSlice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByIntSlice2(values [][][]int, f func(vs [][]int) int16) (max int16) {
	max, err := lib_MaxInt16ByIntSlice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByInt8Slice(values [][]int8, f func(vs []int8) int16) (max int16) {
	max, err := lib_MaxInt16ByInt8Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByInt8Slice2(values [][][]int8, f func(vs [][]int8) int16) (max int16) {
	max, err := lib_MaxInt16ByInt8Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByInt16Slice(values [][]int16, f func(vs []int16) int16) (max int16) {
	max, err := lib_MaxInt16ByInt16Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByInt16Slice2(values [][][]int16, f func(vs [][]int16) int16) (max int16) {
	max, err := lib_MaxInt16ByInt16Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByInt32Slice(values [][]int32, f func(vs []int32) int16) (max int16) {
	max, err := lib_MaxInt16ByInt32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByInt32Slice2(values [][][]int32, f func(vs [][]int32) int16) (max int16) {
	max, err := lib_MaxInt16ByInt32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByInt64Slice(values [][]int64, f func(vs []int64) int16) (max int16) {
	max, err := lib_MaxInt16ByInt64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByInt64Slice2(values [][][]int64, f func(vs [][]int64) int16) (max int16) {
	max, err := lib_MaxInt16ByInt64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByFloat32Slice(values [][]float32, f func(vs []float32) int16) (max int16) {
	max, err := lib_MaxInt16ByFloat32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) int16) (max int16) {
	max, err := lib_MaxInt16ByFloat32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByFloat64Slice(values [][]float64, f func(vs []float64) int16) (max int16) {
	max, err := lib_MaxInt16ByFloat64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt16ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) int16) (max int16) {
	max, err := lib_MaxInt16ByFloat64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByIntSlice(values [][]int, f func(vs []int) int32) (max int32) {
	max, err := lib_MaxInt32ByIntSlice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByIntSlice2(values [][][]int, f func(vs [][]int) int32) (max int32) {
	max, err := lib_MaxInt32ByIntSlice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByInt8Slice(values [][]int8, f func(vs []int8) int32) (max int32) {
	max, err := lib_MaxInt32ByInt8Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByInt8Slice2(values [][][]int8, f func(vs [][]int8) int32) (max int32) {
	max, err := lib_MaxInt32ByInt8Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByInt16Slice(values [][]int16, f func(vs []int16) int32) (max int32) {
	max, err := lib_MaxInt32ByInt16Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByInt16Slice2(values [][][]int16, f func(vs [][]int16) int32) (max int32) {
	max, err := lib_MaxInt32ByInt16Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByInt32Slice(values [][]int32, f func(vs []int32) int32) (max int32) {
	max, err := lib_MaxInt32ByInt32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByInt32Slice2(values [][][]int32, f func(vs [][]int32) int32) (max int32) {
	max, err := lib_MaxInt32ByInt32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByInt64Slice(values [][]int64, f func(vs []int64) int32) (max int32) {
	max, err := lib_MaxInt32ByInt64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByInt64Slice2(values [][][]int64, f func(vs [][]int64) int32) (max int32) {
	max, err := lib_MaxInt32ByInt64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByFloat32Slice(values [][]float32, f func(vs []float32) int32) (max int32) {
	max, err := lib_MaxInt32ByFloat32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) int32) (max int32) {
	max, err := lib_MaxInt32ByFloat32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByFloat64Slice(values [][]float64, f func(vs []float64) int32) (max int32) {
	max, err := lib_MaxInt32ByFloat64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt32ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) int32) (max int32) {
	max, err := lib_MaxInt32ByFloat64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByIntSlice(values [][]int, f func(vs []int) int64) (max int64) {
	max, err := lib_MaxInt64ByIntSlice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByIntSlice2(values [][][]int, f func(vs [][]int) int64) (max int64) {
	max, err := lib_MaxInt64ByIntSlice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByInt8Slice(values [][]int8, f func(vs []int8) int64) (max int64) {
	max, err := lib_MaxInt64ByInt8Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByInt8Slice2(values [][][]int8, f func(vs [][]int8) int64) (max int64) {
	max, err := lib_MaxInt64ByInt8Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByInt16Slice(values [][]int16, f func(vs []int16) int64) (max int64) {
	max, err := lib_MaxInt64ByInt16Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByInt16Slice2(values [][][]int16, f func(vs [][]int16) int64) (max int64) {
	max, err := lib_MaxInt64ByInt16Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByInt32Slice(values [][]int32, f func(vs []int32) int64) (max int64) {
	max, err := lib_MaxInt64ByInt32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByInt32Slice2(values [][][]int32, f func(vs [][]int32) int64) (max int64) {
	max, err := lib_MaxInt64ByInt32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByInt64Slice(values [][]int64, f func(vs []int64) int64) (max int64) {
	max, err := lib_MaxInt64ByInt64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByInt64Slice2(values [][][]int64, f func(vs [][]int64) int64) (max int64) {
	max, err := lib_MaxInt64ByInt64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByFloat32Slice(values [][]float32, f func(vs []float32) int64) (max int64) {
	max, err := lib_MaxInt64ByFloat32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) int64) (max int64) {
	max, err := lib_MaxInt64ByFloat32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByFloat64Slice(values [][]float64, f func(vs []float64) int64) (max int64) {
	max, err := lib_MaxInt64ByFloat64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxInt64ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) int64) (max int64) {
	max, err := lib_MaxInt64ByFloat64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByIntSlice(values [][]int, f func(vs []int) float32) (max float32) {
	max, err := lib_MaxFloat32ByIntSlice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByIntSlice2(values [][][]int, f func(vs [][]int) float32) (max float32) {
	max, err := lib_MaxFloat32ByIntSlice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByInt8Slice(values [][]int8, f func(vs []int8) float32) (max float32) {
	max, err := lib_MaxFloat32ByInt8Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByInt8Slice2(values [][][]int8, f func(vs [][]int8) float32) (max float32) {
	max, err := lib_MaxFloat32ByInt8Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByInt16Slice(values [][]int16, f func(vs []int16) float32) (max float32) {
	max, err := lib_MaxFloat32ByInt16Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByInt16Slice2(values [][][]int16, f func(vs [][]int16) float32) (max float32) {
	max, err := lib_MaxFloat32ByInt16Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByInt32Slice(values [][]int32, f func(vs []int32) float32) (max float32) {
	max, err := lib_MaxFloat32ByInt32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByInt32Slice2(values [][][]int32, f func(vs [][]int32) float32) (max float32) {
	max, err := lib_MaxFloat32ByInt32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByInt64Slice(values [][]int64, f func(vs []int64) float32) (max float32) {
	max, err := lib_MaxFloat32ByInt64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByInt64Slice2(values [][][]int64, f func(vs [][]int64) float32) (max float32) {
	max, err := lib_MaxFloat32ByInt64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByFloat32Slice(values [][]float32, f func(vs []float32) float32) (max float32) {
	max, err := lib_MaxFloat32ByFloat32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) float32) (max float32) {
	max, err := lib_MaxFloat32ByFloat32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByFloat64Slice(values [][]float64, f func(vs []float64) float32) (max float32) {
	max, err := lib_MaxFloat32ByFloat64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat32ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) float32) (max float32) {
	max, err := lib_MaxFloat32ByFloat64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByIntSlice(values [][]int, f func(vs []int) float64) (max float64) {
	max, err := lib_MaxFloat64ByIntSlice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByIntSlice2(values [][][]int, f func(vs [][]int) float64) (max float64) {
	max, err := lib_MaxFloat64ByIntSlice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByInt8Slice(values [][]int8, f func(vs []int8) float64) (max float64) {
	max, err := lib_MaxFloat64ByInt8Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByInt8Slice2(values [][][]int8, f func(vs [][]int8) float64) (max float64) {
	max, err := lib_MaxFloat64ByInt8Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByInt16Slice(values [][]int16, f func(vs []int16) float64) (max float64) {
	max, err := lib_MaxFloat64ByInt16Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByInt16Slice2(values [][][]int16, f func(vs [][]int16) float64) (max float64) {
	max, err := lib_MaxFloat64ByInt16Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByInt32Slice(values [][]int32, f func(vs []int32) float64) (max float64) {
	max, err := lib_MaxFloat64ByInt32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByInt32Slice2(values [][][]int32, f func(vs [][]int32) float64) (max float64) {
	max, err := lib_MaxFloat64ByInt32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByInt64Slice(values [][]int64, f func(vs []int64) float64) (max float64) {
	max, err := lib_MaxFloat64ByInt64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByInt64Slice2(values [][][]int64, f func(vs [][]int64) float64) (max float64) {
	max, err := lib_MaxFloat64ByInt64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByFloat32Slice(values [][]float32, f func(vs []float32) float64) (max float64) {
	max, err := lib_MaxFloat64ByFloat32Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByFloat32Slice2(values [][][]float32, f func(vs [][]float32) float64) (max float64) {
	max, err := lib_MaxFloat64ByFloat32Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByFloat64Slice(values [][]float64, f func(vs []float64) float64) (max float64) {
	max, err := lib_MaxFloat64ByFloat64Slice(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustMaxFloat64ByFloat64Slice2(values [][][]float64, f func(vs [][]float64) float64) (max float64) {
	max, err := lib_MaxFloat64ByFloat64Slice2(values, f)
	if err != nil {
		panic(err)
	}
	return max
}

func lib_MustZipRune(valuesList ...[]rune) (newValuesList [][]rune) {
	newValuesList, err := lib_ZipRune(valuesList...)
	if err != nil {
		panic(err)
	}
	return newValuesList
}

func lib_MustChunkRuneByBits(values []rune, bits []bool) (newValues [][]rune) {
	newValues, err := lib_ChunkRuneByBits(values, bits)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustUnsetRune(values []rune, i int) []rune {
	v, err := lib_UnsetRune(values, i)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustRuneCombination(values []rune, r int) (combinations [][]rune) {
	combinations, err := lib_RuneCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustRuneSliceCombination(values [][]rune, r int) (combinations [][][]rune) {
	combinations, err := lib_RuneSliceCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustZipString(valuesList ...[]string) (newValuesList [][]string) {
	newValuesList, err := lib_ZipString(valuesList...)
	if err != nil {
		panic(err)
	}
	return newValuesList
}

func lib_MustChunkStringByBits(values []string, bits []bool) (newValues [][]string) {
	newValues, err := lib_ChunkStringByBits(values, bits)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustUnsetString(values []string, i int) []string {
	v, err := lib_UnsetString(values, i)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustStringCombination(values []string, r int) (combinations [][]string) {
	combinations, err := lib_StringCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustStringSliceCombination(values [][]string, r int) (combinations [][][]string) {
	combinations, err := lib_StringSliceCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustZipInt(valuesList ...[]int) (newValuesList [][]int) {
	newValuesList, err := lib_ZipInt(valuesList...)
	if err != nil {
		panic(err)
	}
	return newValuesList
}

func lib_MustChunkIntByBits(values []int, bits []bool) (newValues [][]int) {
	newValues, err := lib_ChunkIntByBits(values, bits)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustUnsetInt(values []int, i int) []int {
	v, err := lib_UnsetInt(values, i)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustIntCombination(values []int, r int) (combinations [][]int) {
	combinations, err := lib_IntCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustIntSliceCombination(values [][]int, r int) (combinations [][][]int) {
	combinations, err := lib_IntSliceCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustZipInt8(valuesList ...[]int8) (newValuesList [][]int8) {
	newValuesList, err := lib_ZipInt8(valuesList...)
	if err != nil {
		panic(err)
	}
	return newValuesList
}

func lib_MustChunkInt8ByBits(values []int8, bits []bool) (newValues [][]int8) {
	newValues, err := lib_ChunkInt8ByBits(values, bits)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustUnsetInt8(values []int8, i int) []int8 {
	v, err := lib_UnsetInt8(values, i)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustInt8Combination(values []int8, r int) (combinations [][]int8) {
	combinations, err := lib_Int8Combination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustInt8SliceCombination(values [][]int8, r int) (combinations [][][]int8) {
	combinations, err := lib_Int8SliceCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustZipInt16(valuesList ...[]int16) (newValuesList [][]int16) {
	newValuesList, err := lib_ZipInt16(valuesList...)
	if err != nil {
		panic(err)
	}
	return newValuesList
}

func lib_MustChunkInt16ByBits(values []int16, bits []bool) (newValues [][]int16) {
	newValues, err := lib_ChunkInt16ByBits(values, bits)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustUnsetInt16(values []int16, i int) []int16 {
	v, err := lib_UnsetInt16(values, i)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustInt16Combination(values []int16, r int) (combinations [][]int16) {
	combinations, err := lib_Int16Combination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustInt16SliceCombination(values [][]int16, r int) (combinations [][][]int16) {
	combinations, err := lib_Int16SliceCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustZipInt32(valuesList ...[]int32) (newValuesList [][]int32) {
	newValuesList, err := lib_ZipInt32(valuesList...)
	if err != nil {
		panic(err)
	}
	return newValuesList
}

func lib_MustChunkInt32ByBits(values []int32, bits []bool) (newValues [][]int32) {
	newValues, err := lib_ChunkInt32ByBits(values, bits)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustUnsetInt32(values []int32, i int) []int32 {
	v, err := lib_UnsetInt32(values, i)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustInt32Combination(values []int32, r int) (combinations [][]int32) {
	combinations, err := lib_Int32Combination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustInt32SliceCombination(values [][]int32, r int) (combinations [][][]int32) {
	combinations, err := lib_Int32SliceCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustZipInt64(valuesList ...[]int64) (newValuesList [][]int64) {
	newValuesList, err := lib_ZipInt64(valuesList...)
	if err != nil {
		panic(err)
	}
	return newValuesList
}

func lib_MustChunkInt64ByBits(values []int64, bits []bool) (newValues [][]int64) {
	newValues, err := lib_ChunkInt64ByBits(values, bits)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustUnsetInt64(values []int64, i int) []int64 {
	v, err := lib_UnsetInt64(values, i)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustInt64Combination(values []int64, r int) (combinations [][]int64) {
	combinations, err := lib_Int64Combination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustInt64SliceCombination(values [][]int64, r int) (combinations [][][]int64) {
	combinations, err := lib_Int64SliceCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustZipFloat32(valuesList ...[]float32) (newValuesList [][]float32) {
	newValuesList, err := lib_ZipFloat32(valuesList...)
	if err != nil {
		panic(err)
	}
	return newValuesList
}

func lib_MustChunkFloat32ByBits(values []float32, bits []bool) (newValues [][]float32) {
	newValues, err := lib_ChunkFloat32ByBits(values, bits)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustUnsetFloat32(values []float32, i int) []float32 {
	v, err := lib_UnsetFloat32(values, i)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustFloat32Combination(values []float32, r int) (combinations [][]float32) {
	combinations, err := lib_Float32Combination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustFloat32SliceCombination(values [][]float32, r int) (combinations [][][]float32) {
	combinations, err := lib_Float32SliceCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustZipFloat64(valuesList ...[]float64) (newValuesList [][]float64) {
	newValuesList, err := lib_ZipFloat64(valuesList...)
	if err != nil {
		panic(err)
	}
	return newValuesList
}

func lib_MustChunkFloat64ByBits(values []float64, bits []bool) (newValues [][]float64) {
	newValues, err := lib_ChunkFloat64ByBits(values, bits)
	if err != nil {
		panic(err)
	}
	return newValues
}

func lib_MustUnsetFloat64(values []float64, i int) []float64 {
	v, err := lib_UnsetFloat64(values, i)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustFloat64Combination(values []float64, r int) (combinations [][]float64) {
	combinations, err := lib_Float64Combination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustFloat64SliceCombination(values [][]float64, r int) (combinations [][][]float64) {
	combinations, err := lib_Float64SliceCombination(values, r)
	if err != nil {
		panic(err)
	}
	return combinations
}

func lib_MustNewGraph(nodeNum int, edges [][]int, directed bool) *lib_Graph {
	v, err := lib_NewGraph(nodeNum, edges, directed)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetLines(startRowIndex, endRowIndex int) [][]string {
	v, err := i.GetLines(startRowIndex, endRowIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetStringLinesFrom(fromIndex int) (newLines [][]string) {
	newLines, err := i.GetStringLinesFrom(fromIndex)
	if err != nil {
		panic(err)
	}
	return newLines
}

func (i *lib_Input) MustGetValue(rowIndex, colIndex int) string {
	v, err := i.GetValue(rowIndex, colIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetFirstValue(rowIndex int) string {
	v, err := i.GetFirstValue(rowIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustGetColLine(colIndex int) (newLine []string) {
	newLine, err := i.GetColLine(colIndex)
	if err != nil {
		panic(err)
	}
	return newLine
}

func (i *lib_Input) MustGetLine(index int) []string {
	v, err := i.GetLine(index)
	if err != nil {
		panic(err)
	}
	return v
}

func (i *lib_Input) MustReadAsStringGridFrom(fromIndex int) [][]string {
	v, err := i.ReadAsStringGridFrom(fromIndex)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustNewInputFromReader(reader *bufio.Reader) *lib_Input {
	v, err := lib_NewInputFromReader(reader)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustCombination(n, r int) int {
	v, err := lib_Combination(n, r)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustBigCombination(n, r int) *big.Int {
	v, err := lib_BigCombination(n, r)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustParallelBigCombination(n, r int) *big.Int {
	v, err := lib_ParallelBigCombination(n, r)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustMemoizedCombination(n, r int) int {
	v, err := lib_MemoizedCombination(n, r)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustMemoizedBigCombination(n, r int) *big.Int {
	v, err := lib_MemoizedBigCombination(n, r)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_MustFactorial(n int) (f int) {
	f, err := lib_Factorial(n)
	if err != nil {
		panic(err)
	}
	return f
}

func lib_MustMemoizedFactorial(n int, cache map[int]int) int {
	v, err := lib_MemoizedFactorial(n, cache)
	if err != nil {
		panic(err)
	}
	return v
}

func lib_toSpecificBitIntLine(line []string, bitSize int) (intLine []int64, err error) {
	for j, v := range line {
		intV, err := strconv.ParseInt(v, 10, bitSize)
		if err != nil {
			return nil, fmt.Errorf(fmt.Sprintf("%dth value: %v", j, err.Error()))
		}
		intLine = append(intLine, intV)
	}
	return intLine, nil
}

func lib_BitEnumeration(digits uint) (enums [][]bool) {
	if digits == 0 {
		return [][]bool{}
	}

	for i := 0; i < 1<<digits; i++ {
		e := []bool{}
		for d := uint(0); d < digits; d++ {
			e = append(e, i>>d&1 == 1)
		}
		enums = append(enums, e)
	}
	return
}

func lib_Combination(n, r int) (int, error) {
	if n < r {
		return 0, fmt.Errorf("r(%d) is larger than n(%d)", r, n)
	}

	if n == r {
		return 1, nil
	}

	rFac, err := lib_Factorial(r)
	if err != nil {
		return 0, fmt.Errorf("too large r: %s", err)
	}
	nFac, err := lib_Factorial(n)
	if err != nil {
		return 0, fmt.Errorf("too large n: %s", err)
	}
	nrFac, err := lib_Factorial(n - r)
	if err != nil {
		return 0, fmt.Errorf("too large n - r: %s", err)
	}
	return nFac / (rFac * nrFac), nil
}

func lib_BigCombination(n, r int) (*big.Int, error) {
	if n < r {
		return nil, fmt.Errorf("r(%d) is larger than n(%d)", r, n)
	}

	if n == r {
		return big.NewInt(1), nil
	}

	rFac := lib_BigFactorial(r)
	nFac := lib_BigFactorial(n)
	nrFac := lib_BigFactorial(n - r)
	return nFac.Div(nFac, rFac.Mul(rFac, nrFac)), nil
}

func lib_ParallelBigCombination(n, r int) (*big.Int, error) {
	if n < r {
		return nil, fmt.Errorf("r(%d) is larger than n(%d)", r, n)
	}

	if n == r {
		return big.NewInt(1), nil
	}

	rChan := make(chan *big.Int)
	nChan := make(chan *big.Int)
	nrChan := make(chan *big.Int)
	go func(r int) {
		rChan <- lib_BigFactorial(r)
	}(r)
	go func(n int) {
		nChan <- lib_BigFactorial(n)
	}(n)
	go func(nr int) {
		nrChan <- lib_BigFactorial(nr)
	}(n - r)

	rFac, nFac, nrFac := <-rChan, <-nChan, <-nrChan
	return nFac.Div(nFac, rFac.Mul(rFac, nrFac)), nil
}

func lib_MemoizedCombination(n, r int) (int, error) {
	if n < r {
		return 0, fmt.Errorf("r(%d) is larger than n(%d)", r, n)
	}

	if n == r {
		return 1, nil
	}

	cache := map[int]int{}
	rFac, err := lib_MemoizedFactorial(r, cache)
	if err != nil {
		return 0, fmt.Errorf("too large r: %s", err)
	}
	nFac, err := lib_MemoizedFactorial(n, cache)
	if err != nil {
		return 0, fmt.Errorf("too large n: %s", err)
	}
	nrFac, err := lib_MemoizedFactorial(n-r, cache)
	if err != nil {
		return 0, fmt.Errorf("too large n - r: %s", err)
	}
	return nFac / (rFac * nrFac), nil
}

func lib_MemoizedBigCombination(n, r int) (*big.Int, error) {
	if n < r {
		return nil, fmt.Errorf("r(%d) is larger than n(%d)", r, n)
	}

	if n == r {
		return big.NewInt(1), nil
	}

	cache := map[int]*big.Int{}
	rFac := lib_MemoizedBigFactorial(r, cache)
	nFac := lib_MemoizedBigFactorial(n, cache)
	nrFac := lib_MemoizedBigFactorial(n-r, cache)
	return nFac.Div(nFac, rFac.Mul(rFac, nrFac)), nil
}

func lib_Factorial(n int) (f int, err error) {
	if n > 20 { // FIXME Consider 32bit architecture
		return 0, fmt.Errorf("too large n: %d", n)
	}

	f = 1
	for i := 2; i <= n; i++ {
		f = f * i
	}
	return
}

func lib_BigFactorial(n int) *big.Int {
	result := big.NewInt(1)
	for i := 2; i <= n; i++ {
		result = result.Mul(result, big.NewInt(int64(i)))
	}
	return result
}

func lib_MemoizedFactorial(n int, cache map[int]int) (int, error) {
	if n > 20 { // FIXME Consider 32bit architecture
		return 0, fmt.Errorf("too large n: %d", n)
	}

	if cachedResult, ok := cache[n]; ok {
		return cachedResult, nil
	}

	if n == 1 {
		return 1, nil
	}

	beforeResult, err := lib_MemoizedFactorial(n-1, cache)
	if err != nil {
		return 0, err
	}
	result := n * beforeResult
	cache[n] = result
	return result, nil
}

func lib_MemoizedBigFactorial(n int, cache map[int]*big.Int) *big.Int {
	if cachedResult, ok := cache[n]; ok {
		return cachedResult
	}

	if n == 1 {
		return big.NewInt(1)
	}

	beforeResult := lib_MemoizedBigFactorial(n-1, cache)
	bigN := big.NewInt(int64(n))
	result := bigN.Mul(bigN, beforeResult)
	cache[n] = result
	return result
}

func lib_FindPosFromStringGrid(m [][]string, s string) (int, int) {
	for rowIndex, row := range m {
		for colIndex, p := range row {
			if p == s {
				return rowIndex, colIndex
			}
		}
	}
	panic(s + " not found")
}

func lib_ToYesNo(yes bool) string {
	return lib_TernaryOPString(yes, "Yes", "No")
}

func lib_PanicIfErrorExist(err error) {
	if err != nil {
		panic(err)
	}
}

func lib_TrimSpaceAndNewLineCodeAndTab(s string) string {
	return strings.TrimFunc(s, func(r rune) bool {
		return r == ' ' || r == '\r' || r == '\n' || r == '\t'
	})
}