"use strict"
Object.getOwnPropertyNames(Math).forEach((name) => {
global[name] = Math[name]
})
const exit = process.exit
const assert = require("assert")
function push(v, a) {
v.push(a)
}
function _norm(a) {
if (a === undefined) return null
return a
}
function _get(a, k) {
if (a instanceof Map) return _norm(a.get(k))
return a[k]
}
function _set(a, k, x) {
if (a instanceof Map) a.set(k, x)
else a[k] = x
return x
}
function len(a) {
if (a instanceof Map) return a.size
return a.length
}
function repr(a) {
return JSON.stringify(a)
}
function _prin(a) {
if (typeof a === "string") {
process.stdout.write(a)
return
}
process.stdout.write(repr(a))
}
function _eprin(a) {
if (typeof a === "string") {
process.stderr.write(a)
return
}
process.stderr.write(repr(a))
}
function string(a) {
return a.toString()
}
function eq(a, b) {
if (a === b) return true
if (a == null || b == null || typeof a !== "object" || typeof b !== "object") return false
const aIsArray = Array.isArray(a)
const bIsArray = Array.isArray(b)
if (aIsArray !== bIsArray) return false
if (aIsArray) {
if (a.length !== b.length) return false
for (let i = 0; i < a.length; i++) {
if (!eq(a[i], b[i])) return false
}
return true
} else {
const keysA = Object.keys(a)
const keysB = Object.keys(b)
if (keysA.length !== keysB.length) return false
for (const key of keysA) {
if (!Object.prototype.hasOwnProperty.call(b, key) || !eq(a[key], b[key])) {
return false
}
}
return true
}
}
function _typeof(value) {
if (value === null) {
return "null"
}
const basicType = typeof value
if (basicType !== "object") {
return basicType
}
const objectType = Object.prototype.toString.call(value)
const match = objectType.match(/^\[object\s(.*)\]$/)
if (match) {
const typeName = match[1]
return typeName.toLowerCase()
}
return "object"
}
function range() {
let start, stop, step
if (arguments.length === 1) {
start = 0
stop = arguments[0]
step = 1
} else if (arguments.length === 2) {
start = arguments[0]
stop = arguments[1]
step = 1
} else if (arguments.length === 3) {
start = arguments[0]
stop = arguments[1]
step = arguments[2]
} else {
throw new Error("range requires at least one argument")
}
if (step === 0) {
throw new Error("range() step argument must not be zero")
}
const result = []
if (step > 0) {
for (let i = start; i < stop; i += step) {
result.push(i)
}
} else {
for (let i = start; i > stop; i += step) {
result.push(i)
}
}
return result
}