@rgsoft/math
Version:
Yet another JS math library
1 lines • 51.3 kB
Source Map (JSON)
{"version":3,"sources":["../src/bases.ts","../src/combination.ts","../src/complex.ts","../src/vector.ts","../src/line.ts","../src/number.ts","../src/pdf/erf.ts","../src/pdf/exponential.ts","../src/pdf/gaussian.ts","../src/pdf/uniform.ts","../src/pmf/binomial.ts","../src/pmf/negative-binomial.ts","../src/pmf/poisson.ts","../src/segment.ts"],"sourcesContent":["const alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');\r\n\r\n/**\r\n * Converts an integer to its string representation on a given base\r\n * @param { number } n Number\r\n * @param { number } b Base\r\n * @returns { string }\r\n */\r\nexport function toBase(n: number, b: number): string {\r\n if (!Number.isInteger(n) || n < 0) {\r\n throw new Error('The number must be positive integer');\r\n }\r\n\r\n if (!Number.isInteger(b) || b <= 0) {\r\n throw new Error('The base must be a positive integer');\r\n }\r\n \r\n if (b < 2) {\r\n throw new Error('The min base is 2');\r\n }\r\n \r\n if (b > alphabet.length) {\r\n throw new Error(`The max base allowed is ${alphabet.length}`);\r\n }\r\n\r\n let e = 1;\r\n const digits: string[] = [];\r\n while (n / (e * b) >= 1) {\r\n e *= b;\r\n }\r\n do {\r\n digits.push(alphabet[Math.floor(n / e)]);\r\n n = n % e;\r\n e /= b;\r\n } while (e >= 1);\r\n\r\n return digits.join('');\r\n};\r\n\r\n/**\r\n * Converts a string representing a number in a certain base to an integer\r\n * @param { string } d Digits\r\n * @param { number } b Base\r\n * @returns { string }\r\n */\r\nexport function fromBase(d: string, b: number): number {\r\n if (!Number.isInteger(b) || b <= 0) {\r\n throw new Error('The base must be a positive integer');\r\n }\r\n \r\n if (b < 2) {\r\n throw new Error('The min base is 2');\r\n }\r\n \r\n if (b > alphabet.length) {\r\n throw new Error(`The max base allowed is ${alphabet.length}`);\r\n }\r\n const digits = d.split('').reverse();\r\n return digits.reduce((prev: number, curr: string, e: number): number => {\r\n const n = alphabet.indexOf(curr);\r\n if (n < 0) {\r\n throw new Error(`Digit ${curr} not found`);\r\n }\r\n if (n >= b) {\r\n throw new Error(`Invalid digit ${curr} for base ${b}`);\r\n }\r\n return prev + n * (b ** e);\r\n }, 0);\r\n};\r\n","/**\r\n * Calculates the factorial of a positive integer\r\n * @param { number } n Number to calculate from\r\n * @param { number } m (Optional) Number to calculate to\r\n * @returns { number }\r\n */\r\nexport function factorial(n: number, m: number = NaN): number {\r\n if (!Number.isInteger(n) || n < 0) {\r\n throw new Error('The number must be a positive integer');\r\n }\r\n\r\n if (isNaN(m)) {\r\n m = 1;\r\n } else {\r\n if (!Number.isInteger(m) || m < 0) {\r\n throw new Error('The lower limit must be a positive integer');\r\n }\r\n if (n < m) {\r\n throw new Error('The lower limit cannot be higher than the number');\r\n }\r\n }\r\n\r\n \r\n if (n === 0) {\r\n return 1;\r\n }\r\n\r\n let f = 1;\r\n while (n >= m) {\r\n f *= n;\r\n n--;\r\n }\r\n return f;\r\n};\r\n\r\n/**\r\n * Calculates the combination of n taking by k.\r\n * @param { number } n \r\n * @param { number } k \r\n * @returns { number }\r\n */\r\nexport function combination(n: number, k: number): number {\r\n if (!Number.isInteger(n) || n < 0) {\r\n throw new Error('The number of elements must be a positive integer');\r\n }\r\n if (!Number.isInteger(k) || k < 0) {\r\n throw new Error('The group quantity must be a positive integer');\r\n }\r\n if (k > n) {\r\n throw new Error('The group quantity cannot be greater than the total elements');\r\n }\r\n if (k === 0 || k === n) {\r\n return 1;\r\n }\r\n return factorial(n, Math.max(k + 1, n - k + 1)) / factorial(Math.min(k, n - k));\r\n}\r\n\r\n/**\r\n * Calculates the permutation of n taking by k.\r\n * @param { number } n \r\n * @param { number } k \r\n * @returns { number }\r\n */\r\nexport function permutation(n: number, k: number): number {\r\n if (!Number.isInteger(n) || n < 0) {\r\n throw new Error('The number of elements must be a positive integer');\r\n }\r\n if (!Number.isInteger(k) || k < 0) {\r\n throw new Error('The group quantity must be a positive integer');\r\n }\r\n if (k > n) {\r\n throw new Error('The group quantity cannot be greater than the total elements');\r\n }\r\n if (k === 0) {\r\n return 1;\r\n }\r\n return factorial(n, n - k + 1);\r\n}","export class Complex {\r\n private _mag?: number;\r\n\r\n constructor(public readonly a: number, public readonly b: number) {\r\n return this;\r\n }\r\n\r\n /**\r\n * \r\n * @param { number | Complex} n \r\n */\r\n add(n: number | Complex): Complex {\r\n let { a, b } = this;\r\n if (typeof n === 'number') {\r\n a += n;\r\n } else if (n instanceof Complex) {\r\n a += n.a;\r\n b += n.b;\r\n }\r\n return new Complex(a, b);\r\n }\r\n\r\n \r\n /**\r\n * \r\n * @param { number | Complex} n \r\n */\r\n sub(n: number | Complex): Complex {\r\n let { a, b } = this;\r\n if (typeof n === 'number') {\r\n a -= n;\r\n } else if (n instanceof Complex) {\r\n a -= n.a;\r\n b -= n.b;\r\n }\r\n return new Complex(a, b);\r\n }\r\n \r\n /**\r\n * \r\n * @param { number | Complex} n \r\n */\r\n mult(n: number | Complex): Complex {\r\n let { a, b } = this;\r\n if (typeof n === 'number') {\r\n a *= n;\r\n b *= n;\r\n } else if (n instanceof Complex) {\r\n a = this.a * n.a - this.b * n.b;\r\n b = this.a * n.b + this.b * n.a;\r\n }\r\n return new Complex(a, b);\r\n }\r\n \r\n /**\r\n * \r\n * @param { number | Complex} n \r\n */\r\n div(n: number | Complex): Complex {\r\n let { a, b } = this;\r\n \r\n if (typeof n === 'number') {\r\n a /= n;\r\n b /= n;\r\n } else if (n instanceof Complex) {\r\n const d = n.a * n.a + n.b * n.b;\r\n a = (this.a * n.a + this.b * n.b) / d;\r\n b = (this.b * n.a - this.a * n.b) / d;\r\n }\r\n return new Complex(a, b);\r\n }\r\n \r\n sqrt(): Complex {\r\n let { a, b } = this;\r\n const m = Math.sqrt(this.mag);\r\n const phi = Math.atan2(this.b, this.a) * 0.5;\r\n a = m * Math.cos(phi);\r\n b = m * Math.sin(phi);\r\n \r\n return new Complex(a, b);\r\n }\r\n\r\n conjugate(): Complex {\r\n return new Complex(this.a, -1 * this.b);\r\n }\r\n\r\n toString(): string {\r\n let str = '';\r\n if (this.a !== 0) {\r\n str += `${this.a}`\r\n }\r\n if (this.b > 0) {\r\n if (this.b === 1) {\r\n str += ` + i`\r\n } else {\r\n str += ` + ${this.b}i`\r\n }\r\n } else if (this.b < 0) {\r\n if (this.b === -1) {\r\n str += ` - i`\r\n } else {\r\n str += ` - ${Math.abs(this.b)}i`\r\n }\r\n }\r\n return str.trim();\r\n }\r\n \r\n /**\r\n * @returns { number }\r\n */\r\n get mag(): number {\r\n if (this._mag === undefined) {\r\n this._mag = Math.sqrt(this.a * this.a + this.b * this.b);\r\n }\r\n return this._mag;\r\n }\r\n};","export class Vector {\r\n private _x : number;\r\n private _y : number;\r\n private _mag? : number;\r\n private _angle? : number;\r\n\r\n /**\r\n * \r\n * @param { number } x \r\n * @param { number } y \r\n */\r\n constructor(x: number, y: number) {\r\n this._x = x;\r\n this._y = y;\r\n this.resetValues();\r\n }\r\n\r\n private resetValues() {\r\n this._mag = undefined;\r\n this._angle = undefined;\r\n }\r\n\r\n /**\r\n * @returns { number }\r\n */\r\n get mag(): number {\r\n if (this._mag === undefined) {\r\n this._mag = Math.sqrt(this._x * this._x + this._y * this._y);\r\n }\r\n return this._mag;\r\n }\r\n\r\n /**\r\n * @param { number } value\r\n */\r\n set mag(value: number) {\r\n if (value < 0) {\r\n throw new Error('New magnitude must be positive');\r\n }\r\n this.normalize();\r\n this.mult(value);\r\n this._mag = value;\r\n }\r\n\r\n /**\r\n * @returns { number }\r\n */\r\n get angle(): number {\r\n if (this._angle === undefined) {\r\n if (this.mag > 0) {\r\n this._angle = Math.atan2(this._y, this._x);\r\n } else {\r\n this._angle = 0;\r\n }\r\n }\r\n return this._angle;\r\n }\r\n\r\n /**\r\n * @returns { number }\r\n */\r\n get x(): number {\r\n return this._x;\r\n }\r\n\r\n /**\r\n * @param { number } value\r\n */\r\n set x(value: number) {\r\n this._x = value;\r\n this.resetValues();\r\n }\r\n\r\n /**\r\n * @returns { number }\r\n */\r\n get y(): number {\r\n return this._y;\r\n }\r\n\r\n /**\r\n * @param { number } value\r\n */\r\n set y(value: number) {\r\n this._y = value;\r\n this.resetValues();\r\n }\r\n\r\n /**\r\n * \r\n * @returns { Vector }\r\n */\r\n normalize(): Vector {\r\n if (this.mag === 0) {\r\n return this;\r\n }\r\n this._x /= this.mag;\r\n this._y /= this.mag;\r\n this.resetValues();\r\n return this;\r\n }\r\n\r\n /**\r\n * \r\n * @param { number} num \r\n * @returns { Vector }\r\n */\r\n mult(num: number): Vector {\r\n this._x *= num;\r\n this._y *= num;\r\n this.resetValues();\r\n return this;\r\n }\r\n\r\n /**\r\n * \r\n * @param { number} num \r\n * @returns { Vector }\r\n */\r\n div(num: number): Vector {\r\n this._x /= num;\r\n this._y /= num;\r\n this.resetValues();\r\n return this;\r\n }\r\n\r\n /**\r\n * @param {Vector} v\r\n * @returns {number}\r\n */\r\n dot(v: Vector): number {\r\n return this._x * v._x + this._y * v._y;\r\n }\r\n\r\n /**\r\n * \r\n * @param { Vector } vector \r\n * @returns { Vector }\r\n */\r\n add(vector: Vector): Vector {\r\n this._x += vector._x;\r\n this._y += vector._y;\r\n this.resetValues();\r\n return this;\r\n }\r\n\r\n /**\r\n * \r\n * @param { Vector } vector \r\n * @returns { Vector }\r\n */\r\n sub(vector: Vector): Vector {\r\n this._x -= vector._x;\r\n this._y -= vector._y;\r\n this.resetValues();\r\n return this;\r\n }\r\n\r\n /**\r\n * \r\n * @param { Vector } vector \r\n * @returns { number }\r\n */\r\n dist(vector: Vector): number {\r\n const dx = this._x - vector._x;\r\n const dy = this._y - vector._y;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n }\r\n\r\n /**\r\n * \r\n * @param { Vector } vector \r\n * @returns { boolean }\r\n */\r\n equals(vector: Vector): boolean {\r\n return vector.x === this._x && vector.y === this.y;\r\n }\r\n\r\n /**\r\n * \r\n * @param { Vector } vector \r\n * @returns { number }\r\n */\r\n angleTo(vector: Vector): number {\r\n const cp = this.dot(vector);\r\n if (this.mag === 0 || vector.mag === 0) {\r\n return NaN;\r\n }\r\n return Math.acos(cp / (this.mag * vector.mag));\r\n }\r\n\r\n /**\r\n * Calculates the projection on another vector\r\n * @param { Vector } vector \r\n * @returns { Vector }\r\n */\r\n projection(vector: Vector): Vector {\r\n const cp = this.dot(vector);\r\n const sqrtMag = vector.dot(vector);\r\n const proj = vector.copy();\r\n proj.mult(cp / sqrtMag);\r\n return proj;\r\n }\r\n\r\n /**\r\n * @returns { Vector }\r\n */\r\n copy(): Vector {\r\n return new Vector(this._x, this._y);\r\n }\r\n\r\n transpose() {\r\n const aux = this._y;\r\n this._y = this._x;\r\n this._x = aux;\r\n this.resetValues();\r\n }\r\n\r\n /**\r\n * \r\n * @param { number } mag\r\n */\r\n limit(mag: number) {\r\n if (this.mag <= mag) {\r\n return;\r\n }\r\n this.mag = mag;\r\n }\r\n\r\n /**\r\n * \r\n * @param { number } angle \r\n * @returns { Vector }\r\n */\r\n static fromAngle(angle: number): Vector {\r\n const instance = new Vector(Math.cos(angle), Math.sin(angle));\r\n instance._angle = angle;\r\n return instance;\r\n }\r\n\r\n /**\r\n * \r\n * @param { Vector } v \r\n * @param { Vector } w \r\n * @returns { Vector }\r\n */\r\n static add(v: Vector, w: Vector): Vector {\r\n const instance = v.copy();\r\n return instance.add(w);\r\n }\r\n\r\n /**\r\n * \r\n * @param { Vector } v \r\n * @param { Vector } w \r\n * @returns { Vector }\r\n */\r\n static sub(v: Vector, w: Vector): Vector {\r\n const instance = v.copy();\r\n return instance.sub(w);\r\n }\r\n\r\n /**\r\n * \r\n * @param { Vector } v \r\n * @param { number } n\r\n * @returns { Vector }\r\n */\r\n static mult(v: Vector, n: number): Vector {\r\n const instance = v.copy();\r\n return instance.mult(n);\r\n }\r\n\r\n /**\r\n * \r\n * @param { Vector } v \r\n * @param { number } n\r\n * @returns { Vector }\r\n */\r\n static div(v: Vector, n: number): Vector {\r\n const instance = v.copy();\r\n return instance.div(n);\r\n }\r\n}\r\n","import { Vector } from \"./vector\";\r\n\r\nexport class Line {\r\n\r\n constructor(public readonly m: number, public readonly a: number) {\r\n }\r\n\r\n static fromPoints(p: Vector, q: Vector): Line {\r\n const m = p.x === q.x ? NaN : ((p.y - q.y)/(p.x - q.x));\r\n const a = isNaN(m) ? p.x : -1 * m * p.x + p.y;\r\n return new Line(m, a);\r\n }\r\n\r\n static mediatrix(p: Vector, q: Vector): Line {\r\n const a = q.copy();\r\n a.sub(p);\r\n a.mult(0.5);\r\n const b = Vector.fromAngle(a.angle + Math.PI * 0.5);\r\n\r\n a.add(p);\r\n b.add(a);\r\n\r\n return Line.fromPoints(a, b);\r\n }\r\n\r\n /**\r\n * Calculates a line intersection point with another\r\n * @param { Line } line \r\n * @returns { Vector }\r\n */\r\n intersectionPoint(line: Line): Vector {\r\n\r\n let x, y;\r\n\r\n if (this.m === line.m) {\r\n throw new Error('The slopes are equal');\r\n }\r\n\r\n if (isNaN(this.m)) {\r\n x = this.a;\r\n y = line.m * x + line.a;\r\n } else if (isNaN(line.m)) {\r\n x = line.a;\r\n y = this.m * x + this.a;\r\n } else {\r\n x = (line.a - this.a) / (this.m - line.m);\r\n y = this.m * x + this.a;\r\n }\r\n\r\n return new Vector(x, y);\r\n }\r\n\r\n}","export function mod(n: number, m: number): number {\r\n if (!Number.isInteger(n)) {\r\n throw new Error('The number must be an integer')\r\n }\r\n\r\n if (!Number.isInteger(m) || m <= 0) {\r\n throw new Error('Modulo must be a positive integer');\r\n }\r\n\r\n return ((n % m) + m) % m;\r\n};\r\n\r\n/**\r\n * Gets the greatest common divisor\r\n * @param { number } a\r\n * @param { number } b\r\n */\r\nexport function gcd(a: number, b: number): number {\r\n if (!Number.isInteger(a) || a <= 0) {\r\n throw new Error('Both numbers must be positive integers');\r\n }\r\n if (!Number.isInteger(b) || b <= 0) {\r\n throw new Error('Both numbers must be positive integers');\r\n }\r\n if (a === b) {\r\n return a;\r\n }\r\n\r\n let d: number;\r\n\r\n do {\r\n d = Math.abs(a - b);\r\n a = Math.min(a, b);\r\n b = d;\r\n } while (d !== a && d > 0);\r\n return d;\r\n};\r\n\r\n/**\r\n * Gets least common multiple\r\n * @param { number } a\r\n * @param { number } b\r\n */\r\nexport function lcm(a: number, b: number): number {\r\n if (!Number.isInteger(a) || a <= 0) {\r\n throw new Error('Both numbers must be positive integers');\r\n }\r\n if (!Number.isInteger(b) || b <= 0) {\r\n throw new Error('Both numbers must be positive integers');\r\n }\r\n const d = gcd(a, b);\r\n return a * b / d;\r\n};\r\n\r\n/**\r\n * Checks if a number is prime\r\n * @param { number } n\r\n * @returns { boolean }\r\n */\r\nexport function prime(n: number): boolean {\r\n if (!Number.isInteger(n) || n <= 0) {\r\n throw new Error('The number must be positive integer');\r\n }\r\n const l = Math.sqrt(n);\r\n for (let i = 2; i <= l; i++) {\r\n if ((n % i) === 0) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n};\r\n\r\n/**\r\n * Get the prime factorization of a positive integer\r\n * @param { number } n\r\n * @returns { number[][] }\r\n */\r\nexport function factors(n: number): number[][] {\r\n if (!Number.isInteger(n) || n <= 0) {\r\n throw new Error('The number must be positive integer');\r\n }\r\n\r\n if (n === 1) {\r\n return [ [1, 1] ];\r\n }\r\n\r\n const factors: number[][] = [];\r\n let i = 2;\r\n let factor = [i, 0];\r\n \r\n while (n > 1) {\r\n if ((n % i) === 0) {\r\n n /= i;\r\n factor[1]++;\r\n } else {\r\n i++;\r\n if (factor[1] > 0) {\r\n factors.push(factor);\r\n }\r\n factor = [i, 0];\r\n }\r\n }\r\n if (factor[1] > 0) {\r\n factors.push(factor);\r\n }\r\n return factors;\r\n};\r\n\r\n/**\r\n * Gets the totient of a posite integer\r\n * @param { number } m\r\n * @returns { number }\r\n */\r\nexport function totient(m: number): number {\r\n if (!Number.isInteger(m) || m <= 0) {\r\n throw new Error('The number must be positive integer');\r\n }\r\n const factorization = factors(m);\r\n let a = 1;\r\n let b = 1;\r\n factorization.forEach(f => {\r\n a *= f[0];\r\n b *= f[0] - 1;\r\n });\r\n\r\n return b * m / a; \r\n};\r\n\r\n/**\r\n * Generates de Collatz sequence\r\n * @param { number } n\r\n * @param { number } limit\r\n * @returns { number }\r\n */\r\nexport function collatz(n: number, limit: number = 10000): number[] {\r\n if (!Number.isInteger(n) || n <= 0) {\r\n throw new Error('The number must be positive integer');\r\n }\r\n\r\n const seq = [n];\r\n\r\n for (let i = 1; i < limit; i++) {\r\n if (n === 1) {\r\n break;\r\n }\r\n if ((n % 2) === 0) {\r\n n = n * 0.5;\r\n } else {\r\n n = 3 * n +1;\r\n }\r\n seq.push(n);\r\n }\r\n\r\n return seq;\r\n};\r\n\r\n/**\r\n * Gets the digital roots of a positive integer\r\n * @param { number } n\r\n * @returns { number }\r\n */\r\nexport function digitalRoots(n: number): number {\r\n if (!Number.isInteger(n) || n <= 0) {\r\n throw new Error('The number must be positive integer');\r\n }\r\n if (n < 10) {\r\n return n;\r\n }\r\n do {\r\n let chars = n.toString().split('');\r\n n = chars.reduce((prev, c) => prev += Number(c), 0);\r\n } while (n >= 10);\r\n\r\n return n;\r\n};\r\n","export function erf(z: number): number {\r\n const t = 1 / (1 + 0.5 * Math.abs(z));\r\n const tau = t * Math.exp(\r\n -z * z -\r\n 1.26551223 +\r\n 1.00002368 * t +\r\n 0.37409196 * t ** 2 +\r\n 0.09678418 * t ** 3 -\r\n 0.18628806 * t ** 4 +\r\n 0.27886807 * t ** 5 -\r\n 1.13520398 * t ** 6 +\r\n 1.48851587 * t ** 7 -\r\n 0.82215223 * t ** 8 +\r\n 0.17087277 * t ** 9\r\n );\r\n\r\n return z >= 0 ? 1 - tau : tau - 1;\r\n}\r\n","import { PDF } from \"./pdf\";\r\n\r\nexport class Exponential implements PDF {\r\n\r\n private readonly m: number;\r\n\r\n constructor(private readonly mean: number) {\r\n this.m = 1 / mean;\r\n }\r\n\r\n getAccumulated(x: number): number {\r\n if (x < 0) {\r\n return 0;\r\n }\r\n return 1 - Math.exp(-this.m * x);\r\n }\r\n\r\n getValue(): number {\r\n const p = Math.random();\r\n if (p === 1) {\r\n return Infinity;\r\n }\r\n return -1 * Math.log(1 - p) * this.mean;\r\n }\r\n\r\n getMean(): number {\r\n return this.mean;\r\n }\r\n\r\n}","import { erf } from \"./erf\";\r\nimport { PDF } from \"./pdf\";\r\n\r\nexport class Gaussian implements PDF {\r\n\r\n public readonly stdDev: number;\r\n\r\n constructor(public readonly m: number = 0, public readonly v: number = 1) {\r\n if (v <= 0) {\r\n throw new Error('Variance must be positive');\r\n }\r\n this.stdDev = Math.sqrt(v);\r\n }\r\n\r\n getAccumulated(x: number): number {\r\n const z = (x - this.m) / Math.sqrt(2 * this.v);\r\n return 0.5 * (1 + erf(z));\r\n }\r\n\r\n inverseCFD(p: number): number {\r\n if (p < 0 || p > 1) {\r\n throw new Error(\"Invalid value for p\");\r\n }\r\n if (p === 0) return -Infinity;\r\n if (p === 1) return Infinity;\r\n\r\n const a = [-39.6968302866538, 220.946098424521, -275.928510446969, 138.357751867269, -30.6647980661472, 2.50662827745924];\r\n const b = [-54.4760987982241, 161.585836858041, -155.698979859887, 66.8013118877197, -13.2806815528857];\r\n const c = [-7.78489400243029e-03, -0.322396458041136, -2.40075827716184, -2.54973253934373, 4.37466414146497, 2.93816398269878];\r\n const d = [7.78469570904146e-03, 0.32246712907004, 2.445134137143, 3.75440866190742];\r\n\r\n let q, r;\r\n\r\n if (p < 0.02425) {\r\n // Lower region\r\n q = Math.sqrt(-2 * Math.log(p));\r\n return (((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) /\r\n ((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1);\r\n } else if (p > 1 - 0.02425) {\r\n // Upper region\r\n q = Math.sqrt(-2 * Math.log(1 - p));\r\n return -(((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) /\r\n ((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1);\r\n } else {\r\n // Central region\r\n q = p - 0.5;\r\n r = q * q;\r\n return (((((a[0] * r + a[1]) * r + a[2]) * r + a[3]) * r + a[4]) * r + a[5]) * q /\r\n (((((b[0] * r + b[1]) * r + b[2]) * r + b[3]) * r + b[4]) * r + 1);\r\n }\r\n }\r\n\r\n getMean(): number {\r\n return this.m;\r\n }\r\n\r\n getValue(): number {\r\n const p = Math.random();\r\n const z = this.inverseCFD(p);\r\n return this.m + z * this.stdDev;\r\n }\r\n}","import { PDF } from \"./pdf\";\r\n\r\nexport class Uniform implements PDF {\r\n\r\n constructor(public readonly min: number, public readonly max: number) {\r\n if (min > max) {\r\n throw new Error('Min cannot be greater than max');\r\n }\r\n }\r\n getAccumulated(x: number): number {\r\n if (x < this.min) {\r\n return 0;\r\n }\r\n\r\n if (x > this.max) {\r\n return 1;\r\n }\r\n\r\n return (x- this.min) / (this.max - this.min);\r\n\r\n }\r\n\r\n getMean(): number {\r\n return (this.max + this.min) * 0.5;\r\n }\r\n\r\n getValue(): number {\r\n return Math.random() * (this.max - this.min) + this.min;\r\n }\r\n\r\n}\r\n","import { combination } from \"../combination\";\r\nimport { PMF } from \"./pmf\";\r\n\r\nexport class Binomial implements PMF {\r\n\r\n private readonly probabilities: number[];\r\n private readonly accumulative: number[];\r\n\r\n constructor (private readonly n: number, private readonly p: number) {\r\n if (!Number.isInteger(n) || n < 1) {\r\n throw new Error('The number of experiments must be a positive integer');\r\n }\r\n\r\n if (!(p >= 0 && p <= 1)) {\r\n throw new Error('The success probability must be between 0 and 1');\r\n }\r\n\r\n this.probabilities = Array(n + 1).fill(0).map((_, i: number) => combination(n, i) * (p ** i) * (1 - p) ** (n - i));\r\n let acc = 0;\r\n this.accumulative = this.probabilities.map((p) => {\r\n acc += p;\r\n return acc;\r\n });\r\n }\r\n\r\n getAccumulated(x: number): number {\r\n x = Math.floor(x);\r\n if (isNaN(x)) {\r\n throw new Error('Number expected');\r\n }\r\n if (x < 0) {\r\n return 0;\r\n }\r\n if (x > this.n) {\r\n return 1;\r\n }\r\n\r\n return this.accumulative[x];\r\n }\r\n\r\n getValue(): number {\r\n const rnd = Math.random();\r\n return this.accumulative.findIndex((acc) => rnd < acc)\r\n }\r\n\r\n probability(x: number): number {\r\n if (!Number.isInteger(x) || x < 0) {\r\n throw new Error('The value must be a positive integer');\r\n }\r\n if (x > this.n) {\r\n throw new Error('The value cannot ve larger than the experiments number');\r\n }\r\n return this.probabilities[x];\r\n }\r\n}","import { combination } from \"../combination\";\r\nimport { PMF } from \"./pmf\";\r\n\r\nexport class NegativeBinomial implements PMF {\r\n \r\n private readonly accumulative: number[] = [];\r\n\r\n constructor (private readonly r: number, private readonly p: number) {\r\n if (!Number.isInteger(r) || r < 1) {\r\n throw new Error('The number of experiments must be a positive integer');\r\n }\r\n \r\n if (!(p >= 0 && p <= 1)) {\r\n throw new Error('The success probability must be between 0 and 1');\r\n }\r\n }\r\n \r\n getAccumulated(x: number): number {\r\n x = Math.floor(x);\r\n if (isNaN(x)) {\r\n throw new Error('Number expected');\r\n }\r\n if (x < 0) {\r\n return 0;\r\n }\r\n if (this.accumulative.length > x) {\r\n return this.accumulative[x];\r\n }\r\n let i = this.accumulative.length;\r\n let acc = i > 0 ? this.accumulative[i - 1] : 0;\r\n do {\r\n acc += this.probability(i);\r\n this.accumulative.push(acc);\r\n i++;\r\n } while (i <= x);\r\n return this.accumulative[x];\r\n }\r\n\r\n getValue(): number {\r\n const rnd = Math.random();\r\n let i = 0;\r\n while (i < this.accumulative.length) {\r\n if (rnd < this.accumulative[i]) {\r\n return i;\r\n }\r\n i++;\r\n }\r\n let acc = i > 0 ? this.accumulative[i - 1] : 0;\r\n do {\r\n acc += this.probability(i);\r\n this.accumulative.push(acc);\r\n i++;\r\n } while (rnd > acc);\r\n return i - 1;\r\n }\r\n\r\n probability(x: number): number {\r\n if (!Number.isInteger(x) || x < 0) {\r\n throw new Error('The value must be a positive integer');\r\n }\r\n return combination(this.r + x - 1, x) * (this.p ** this.r) * ((1 - this.p) ** x);\r\n }\r\n}","import { factorial } from \"../combination\";\r\nimport { PMF } from \"./pmf\";\r\n\r\nexport class Poisson implements PMF {\r\n \r\n private readonly accumulative: number[] = [];\r\n\r\n constructor (private readonly l: number) {\r\n if (!Number.isInteger(l) || l < 0) {\r\n throw new Error('The number of experiments must be a positive integer');\r\n }\r\n }\r\n\r\n getAccumulated(x: number): number {\r\n x = Math.floor(x);\r\n if (isNaN(x)) {\r\n throw new Error('Number expected');\r\n }\r\n if (x < 0) {\r\n return 0;\r\n }\r\n if (this.accumulative.length > x) {\r\n return this.accumulative[x];\r\n }\r\n let i = this.accumulative.length;\r\n let acc = i > 0 ? this.accumulative[i - 1] : 0;\r\n do {\r\n acc += this.probability(i);\r\n this.accumulative.push(acc);\r\n i++;\r\n } while (i <= x);\r\n return this.accumulative[x];\r\n }\r\n\r\n getValue(): number {\r\n const rnd = Math.random();\r\n let i = 0;\r\n while (i < this.accumulative.length) {\r\n if (rnd < this.accumulative[i]) {\r\n return i;\r\n }\r\n i++;\r\n }\r\n let acc = i > 0 ? this.accumulative[i - 1] : 0;\r\n do {\r\n acc += this.probability(i);\r\n this.accumulative.push(acc);\r\n i++;\r\n } while (rnd > acc);\r\n return i - 1;\r\n }\r\n\r\n probability(x: number): number {\r\n if (!Number.isInteger(x) || x < 0) {\r\n throw new Error('The value must be a positive integer');\r\n }\r\n return (this.l ** x) * Math.exp(-this.l) / factorial(x);\r\n }\r\n}","import { Vector } from \"./vector\";\r\n\r\nexport class Segment {\r\n constructor (public readonly p: Vector, public readonly q: Vector) {\r\n }\r\n\r\n /**\r\n * \r\n * @param { Vector } r \r\n * @returns { boolean }\r\n */\r\n isOnSegment(r: Vector): boolean {\r\n return (this.q.x - this.p.x)*(r.y - this.p.y) === (this.q.y - this.p.y) * (r.x - this.p.x);\r\n }\r\n\r\n /**\r\n * To find orientation of ordered triplet (p, q, r).\r\n * The function returns following values\r\n * 0 when p, q and r are collinear; -1 when clockwise, 1 counterclockwise\r\n * \r\n * @param { Vector } p \r\n * @param { Vector } q \r\n * @param { Vector } r \r\n * @returns { number }\r\n */\r\n private getOrientation(p: Vector, q: Vector, r: Vector): number {\r\n\r\n // See https://www.geeksforgeeks.org/orientation-3-ordered-points/ \r\n // for details of below formula. \r\n let val = (q.y - p.y) * (r.x - q.x) -\r\n (q.x - p.x) * (r.y - q.y);\r\n\r\n if (val == 0) return 0; // collinear \r\n\r\n return (val > 0) ? -1 : 1; // clock or counterclock wise \r\n }\r\n\r\n \r\n /**\r\n * \r\n * Returns true if intersects with this segment\r\n * \r\n * @param { Segment } segment\r\n * @returns { boolean }\r\n */\r\n intersects(segment: Segment): boolean {\r\n\r\n // Find the four orientations needed for general and \r\n // special cases \r\n let o1 = this.getOrientation(this.p, this.q, segment.p);\r\n let o2 = this.getOrientation(this.p, this.q, segment.q);\r\n let o3 = this.getOrientation(segment.p, segment.q, this.p);\r\n let o4 = this.getOrientation(segment.p, segment.q, this.q);\r\n\r\n // General case \r\n if (o1 != o2 && o3 != o4) {\r\n return true;\r\n }\r\n\r\n // Special Cases \r\n // The first point of the segemnt lies on this segment \r\n if (o1 == 0 && this.isOnSegment(segment.p)) {\r\n return true;\r\n }\r\n\r\n // The second point of the segemnt lies on this segment \r\n if (o2 == 0 && this.isOnSegment(segment.q)) {\r\n return true;\r\n }\r\n\r\n // The first point of this segments lies on the other segment \r\n if (o3 == 0 && segment.isOnSegment(this.p)) {\r\n return true;\r\n }\r\n\r\n // The second point of this segments lies on the other segment \r\n if (o4 == 0 && segment.isOnSegment(this.q)) {\r\n return true;\r\n }\r\n\r\n return false; // Doesn't fall in any of the above cases \r\n }\r\n};"],"mappings":";AAAA,IAAM,WAAW,uCAAuC,MAAM,EAAE;AAQzD,SAAS,OAAO,GAAW,GAAmB;AACjD,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACzD;AAEA,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACzD;AAEA,MAAI,IAAI,GAAG;AACP,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACvC;AAEA,MAAI,IAAI,SAAS,QAAQ;AACrB,UAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM,EAAE;AAAA,EAChE;AAEA,MAAI,IAAI;AACR,QAAM,SAAmB,CAAC;AAC1B,SAAO,KAAK,IAAI,MAAM,GAAG;AACrB,SAAK;AAAA,EACT;AACA,KAAG;AACC,WAAO,KAAK,SAAS,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC;AACvC,QAAI,IAAI;AACR,SAAK;AAAA,EACT,SAAS,KAAK;AAEd,SAAO,OAAO,KAAK,EAAE;AACzB;AAQO,SAAS,SAAS,GAAW,GAAmB;AACnD,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACzD;AAEA,MAAI,IAAI,GAAG;AACP,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACvC;AAEA,MAAI,IAAI,SAAS,QAAQ;AACrB,UAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM,EAAE;AAAA,EAChE;AACA,QAAM,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ;AACnC,SAAO,OAAO,OAAO,CAAC,MAAc,MAAc,MAAsB;AACpE,UAAM,IAAI,SAAS,QAAQ,IAAI;AAC/B,QAAI,IAAI,GAAG;AACP,YAAM,IAAI,MAAM,SAAS,IAAI,YAAY;AAAA,IAC7C;AACA,QAAI,KAAK,GAAG;AACR,YAAM,IAAI,MAAM,iBAAiB,IAAI,aAAa,CAAC,EAAE;AAAA,IACzD;AACA,WAAO,OAAO,IAAK,KAAK;AAAA,EAC5B,GAAG,CAAC;AACR;;;AC9DO,SAAS,UAAU,GAAW,IAAY,KAAa;AAC1D,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,UAAM,IAAI,MAAM,uCAAuC;AAAA,EAC3D;AAEA,MAAI,MAAM,CAAC,GAAG;AACV,QAAI;AAAA,EACR,OAAO;AACH,QAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAChE;AACA,QAAI,IAAI,GAAG;AACP,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACtE;AAAA,EACJ;AAGA,MAAI,MAAM,GAAG;AACT,WAAO;AAAA,EACX;AAEA,MAAI,IAAI;AACR,SAAO,KAAK,GAAG;AACX,SAAK;AACL;AAAA,EACJ;AACA,SAAO;AACX;AAQO,SAAS,YAAY,GAAW,GAAmB;AACtD,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACvE;AACA,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACnE;AACA,MAAI,IAAI,GAAG;AACP,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAClF;AACA,MAAI,MAAM,KAAK,MAAM,GAAG;AACpB,WAAO;AAAA,EACX;AACA,SAAO,UAAU,GAAG,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAClF;AAQO,SAAS,YAAY,GAAW,GAAmB;AACtD,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACvE;AACA,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,UAAM,IAAI,MAAM,+CAA+C;AAAA,EACnE;AACA,MAAI,IAAI,GAAG;AACP,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAClF;AACA,MAAI,MAAM,GAAG;AACT,WAAO;AAAA,EACX;AACA,SAAO,UAAU,GAAG,IAAI,IAAI,CAAC;AACjC;;;AC7EO,IAAM,UAAN,MAAM,SAAQ;AAAA,EAGjB,YAA4B,GAA2B,GAAW;AAAtC;AAA2B;AACnD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,GAA8B;AAC9B,QAAI,EAAE,GAAG,EAAE,IAAI;AACf,QAAI,OAAO,MAAM,UAAU;AACvB,WAAK;AAAA,IACT,WAAW,aAAa,UAAS;AAC7B,WAAK,EAAE;AACP,WAAK,EAAE;AAAA,IACX;AACA,WAAO,IAAI,SAAQ,GAAG,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,GAA8B;AAC9B,QAAI,EAAE,GAAG,EAAE,IAAI;AACf,QAAI,OAAO,MAAM,UAAU;AACvB,WAAK;AAAA,IACT,WAAW,aAAa,UAAS;AAC7B,WAAK,EAAE;AACP,WAAK,EAAE;AAAA,IACX;AACA,WAAO,IAAI,SAAQ,GAAG,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAK,GAA8B;AAC/B,QAAI,EAAE,GAAG,EAAE,IAAI;AACf,QAAI,OAAO,MAAM,UAAU;AACvB,WAAK;AACL,WAAK;AAAA,IACT,WAAW,aAAa,UAAS;AAC7B,UAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAC9B,UAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE;AAAA,IAClC;AACA,WAAO,IAAI,SAAQ,GAAG,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,GAA8B;AAC9B,QAAI,EAAE,GAAG,EAAE,IAAI;AAEf,QAAI,OAAO,MAAM,UAAU;AACvB,WAAK;AACL,WAAK;AAAA,IACT,WAAW,aAAa,UAAS;AAC7B,YAAM,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAC9B,WAAK,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,KAAK;AACpC,WAAK,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,KAAK;AAAA,IACxC;AACA,WAAO,IAAI,SAAQ,GAAG,CAAC;AAAA,EAC3B;AAAA,EAEA,OAAgB;AACZ,QAAI,EAAE,GAAG,EAAE,IAAI;AACf,UAAM,IAAI,KAAK,KAAK,KAAK,GAAG;AAC5B,UAAM,MAAM,KAAK,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI;AACzC,QAAI,IAAI,KAAK,IAAI,GAAG;AACpB,QAAI,IAAI,KAAK,IAAI,GAAG;AAEpB,WAAO,IAAI,SAAQ,GAAG,CAAC;AAAA,EAC3B;AAAA,EAEA,YAAqB;AACjB,WAAO,IAAI,SAAQ,KAAK,GAAG,KAAK,KAAK,CAAC;AAAA,EAC1C;AAAA,EAEA,WAAmB;AACf,QAAI,MAAM;AACV,QAAI,KAAK,MAAM,GAAG;AACd,aAAO,GAAG,KAAK,CAAC;AAAA,IACpB;AACA,QAAI,KAAK,IAAI,GAAG;AACZ,UAAI,KAAK,MAAM,GAAG;AACd,eAAO;AAAA,MACX,OAAO;AACH,eAAO,MAAM,KAAK,CAAC;AAAA,MACvB;AAAA,IACJ,WAAW,KAAK,IAAI,GAAG;AACnB,UAAI,KAAK,MAAM,IAAI;AACf,eAAO;AAAA,MACX,OAAO;AACH,eAAO,MAAM,KAAK,IAAI,KAAK,CAAC,CAAC;AAAA,MACjC;AAAA,IACJ;AACA,WAAO,IAAI,KAAK;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAc;AACd,QAAI,KAAK,SAAS,QAAW;AACzB,WAAK,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC;AAAA,IAC3D;AACA,WAAO,KAAK;AAAA,EAChB;AACJ;;;ACpHO,IAAM,SAAN,MAAM,QAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWhB,YAAY,GAAW,GAAW;AAC9B,SAAK,KAAK;AACV,SAAK,KAAK;AACV,SAAK,YAAY;AAAA,EACrB;AAAA,EAEQ,cAAc;AAClB,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAc;AACd,QAAI,KAAK,SAAS,QAAW;AACzB,WAAK,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAAA,IAC/D;AACA,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAI,OAAe;AACnB,QAAI,QAAQ,GAAG;AACX,YAAM,IAAI,MAAM,gCAAgC;AAAA,IACpD;AACA,SAAK,UAAU;AACf,SAAK,KAAK,KAAK;AACf,SAAK,OAAO;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAgB;AAChB,QAAI,KAAK,WAAW,QAAW;AAC3B,UAAI,KAAK,MAAM,GAAG;AACd,aAAK,SAAS,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;AAAA,MAC7C,OAAO;AACH,aAAK,SAAS;AAAA,MAClB;AAAA,IACJ;AACA,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAY;AACZ,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,EAAE,OAAe;AACjB,SAAK,KAAK;AACV,SAAK,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAY;AACZ,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,EAAE,OAAe;AACjB,SAAK,KAAK;AACV,SAAK,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAoB;AAChB,QAAI,KAAK,QAAQ,GAAG;AAChB,aAAO;AAAA,IACX;AACA,SAAK,MAAM,KAAK;AAChB,SAAK,MAAM,KAAK;AAChB,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,KAAqB;AACtB,SAAK,MAAM;AACX,SAAK,MAAM;AACX,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,KAAqB;AACrB,SAAK,MAAM;AACX,SAAK,MAAM;AACX,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,GAAmB;AACnB,WAAO,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,EAAE;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,QAAwB;AACxB,SAAK,MAAM,OAAO;AAClB,SAAK,MAAM,OAAO;AAClB,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,QAAwB;AACxB,SAAK,MAAM,OAAO;AAClB,SAAK,MAAM,OAAO;AAClB,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,QAAwB;AACzB,UAAM,KAAK,KAAK,KAAK,OAAO;AAC5B,UAAM,KAAK,KAAK,KAAK,OAAO;AAC5B,WAAO,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAyB;AAC5B,WAAO,OAAO,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,QAAwB;AAC5B,UAAM,KAAK,KAAK,IAAI,MAAM;AAC1B,QAAI,KAAK,QAAQ,KAAK,OAAO,QAAQ,GAAG;AACpC,aAAO;AAAA,IACX;AACA,WAAO,KAAK,KAAK,MAAM,KAAK,MAAM,OAAO,IAAI;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,QAAwB;AAC/B,UAAM,KAAK,KAAK,IAAI,MAAM;AAC1B,UAAM,UAAU,OAAO,IAAI,MAAM;AACjC,UAAM,OAAO,OAAO,KAAK;AACzB,SAAK,KAAK,KAAK,OAAO;AACtB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe;AACX,WAAO,IAAI,QAAO,KAAK,IAAI,KAAK,EAAE;AAAA,EACtC;AAAA,EAEA,YAAY;AACR,UAAM,MAAM,KAAK;AACjB,SAAK,KAAK,KAAK;AACf,SAAK,KAAK;AACV,SAAK,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAa;AACf,QAAI,KAAK,OAAO,KAAK;AACjB;AAAA,IACJ;AACA,SAAK,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,UAAU,OAAuB;AACpC,UAAM,WAAW,IAAI,QAAO,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,KAAK,CAAC;AAC5D,aAAS,SAAS;AAClB,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAI,GAAW,GAAmB;AACrC,UAAM,WAAW,EAAE,KAAK;AACxB,WAAO,SAAS,IAAI,CAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAI,GAAW,GAAmB;AACrC,UAAM,WAAW,EAAE,KAAK;AACxB,WAAO,SAAS,IAAI,CAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KAAK,GAAW,GAAmB;AACtC,UAAM,WAAW,EAAE,KAAK;AACxB,WAAO,SAAS,KAAK,CAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAI,GAAW,GAAmB;AACrC,UAAM,WAAW,EAAE,KAAK;AACxB,WAAO,SAAS,IAAI,CAAC;AAAA,EACzB;AACJ;;;ACzRO,IAAM,OAAN,MAAM,MAAK;AAAA,EAEd,YAA4B,GAA2B,GAAW;AAAtC;AAA2B;AAAA,EACvD;AAAA,EAEA,OAAO,WAAW,GAAW,GAAiB;AAC1C,UAAM,IAAI,EAAE,MAAM,EAAE,IAAI,OAAQ,EAAE,IAAI,EAAE,MAAI,EAAE,IAAI,EAAE;AACpD,UAAM,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE;AAC5C,WAAO,IAAI,MAAK,GAAG,CAAC;AAAA,EACxB;AAAA,EAEA,OAAO,UAAU,GAAW,GAAiB;AACzC,UAAM,IAAI,EAAE,KAAK;AACjB,MAAE,IAAI,CAAC;AACP,MAAE,KAAK,GAAG;AACV,UAAM,IAAI,OAAO,UAAU,EAAE,QAAQ,KAAK,KAAK,GAAG;AAElD,MAAE,IAAI,CAAC;AACP,MAAE,IAAI,CAAC;AAEP,WAAO,MAAK,WAAW,GAAG,CAAC;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,MAAoB;AAElC,QAAI,GAAG;AAEP,QAAI,KAAK,MAAM,KAAK,GAAG;AACnB,YAAM,IAAI,MAAM,sBAAsB;AAAA,IAC1C;AAEA,QAAI,MAAM,KAAK,CAAC,GAAG;AACf,UAAI,KAAK;AACT,UAAI,KAAK,IAAI,IAAI,KAAK;AAAA,IAC1B,WAAW,MAAM,KAAK,CAAC,GAAG;AACtB,UAAI,KAAK;AACT,UAAI,KAAK,IAAI,IAAI,KAAK;AAAA,IAC1B,OAAO;AACH,WAAK,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK;AACvC,UAAI,KAAK,IAAI,IAAI,KAAK;AAAA,IAC1B;AAEA,WAAO,IAAI,OAAO,GAAG,CAAC;AAAA,EAC1B;AAEJ;;;ACpDO,SAAS,IAAI,GAAW,GAAmB;AAC9C,MAAI,CAAC,OAAO,UAAU,CAAC,GAAG;AACtB,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AAEA,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACvD;AAEA,UAAS,IAAI,IAAK,KAAK;AAC3B;AAOO,SAAS,IAAI,GAAW,GAAmB;AAC9C,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC5D;AACA,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC5D;AACA,MAAI,MAAM,GAAG;AACT,WAAO;AAAA,EACX;AAEA,MAAI;AAEJ,KAAG;AACC,QAAI,KAAK,IAAI,IAAI,CAAC;AAClB,QAAI,KAAK,IAAI,GAAG,CAAC;AACjB,QAAI;AAAA,EACR,SAAS,MAAM,KAAK,IAAI;AACxB,SAAO;AACX;AAOO,SAAS,IAAI,GAAW,GAAmB;AAC9C,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC5D;AACA,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC5D;AACA,QAAM,IAAI,IAAI,GAAG,CAAC;AAClB,SAAO,IAAI,IAAI;AACnB;AAOO,SAAS,MAAM,GAAoB;AACtC,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACzD;AACA,QAAM,IAAI,KAAK,KAAK,CAAC;AACrB,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AACzB,QAAK,IAAI,MAAO,GAAG;AACf,aAAO;AAAA,IACX;AAAA,EACJ;AACA,SAAO;AACX;AAOO,SAAS,QAAQ,GAAuB;AAC3C,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACzD;AAEA,MAAI,MAAM,GAAG;AACT,WAAO,CAAE,CAAC,GAAG,CAAC,CAAE;AAAA,EACpB;AAEA,QAAMA,WAAsB,CAAC;AAC7B,MAAI,IAAI;AACR,MAAI,SAAS,CAAC,GAAG,CAAC;AAElB,SAAO,IAAI,GAAG;AACV,QAAK,IAAI,MAAO,GAAG;AACf,WAAK;AACL,aAAO,CAAC;AAAA,IACZ,OAAO;AACH;AACA,UAAI,OAAO,CAAC,IAAI,GAAG;AACf,QAAAA,SAAQ,KAAK,MAAM;AAAA,MACvB;AACA,eAAS,CAAC,GAAG,CAAC;AAAA,IAClB;AAAA,EACJ;AACA,MAAI,OAAO,CAAC,IAAI,GAAG;AACf,IAAAA,SAAQ,KAAK,MAAM;AAAA,EACvB;AACA,SAAOA;AACX;AAOO,SAAS,QAAQ,GAAmB;AACvC,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACzD;AACA,QAAM,gBAAgB,QAAQ,CAAC;AAC/B,MAAI,IAAI;AACR,MAAI,IAAI;AACR,gBAAc,QAAQ,OAAK;AACvB,SAAK,EAAE,CAAC;AACR,SAAK,EAAE,CAAC,IAAI;AAAA,EAChB,CAAC;AAED,SAAO,IAAI,IAAI;AACnB;AAQO,SAAS,QAAQ,GAAW,QAAgB,KAAiB;AAChE,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACzD;AAEA,QAAM,MAAM,CAAC,CAAC;AAEd,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC5B,QAAI,MAAM,GAAG;AACT;AAAA,IACJ;AACA,QAAK,IAAI,MAAO,GAAG;AACf,UAAI,IAAI;AAAA,IACZ,OAAO;AACH,UAAI,IAAI,IAAG;AAAA,IACf;AACA,QAAI,KAAK,CAAC;AAAA,EACd;AAEA,SAAO;AACX;AAOO,SAAS,aAAa,GAAmB;AAC5C,MAAI,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACzD;AACA,MAAI,IAAI,IAAI;AACR,WAAO;AAAA,EACX;AACA,KAAG;AACC,QAAI,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE;AACjC,QAAI,MAAM,OAAO,CAAC,MAAM,MAAM,QAAQ,OAAO,CAAC,GAAG,CAAC;AAAA,EACtD,SAAS,KAAK;AAEd,SAAO;AACX;;;AC9KO,SAAS,IAAI,GAAmB;AACnC,QAAM,IAAI,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC;AACnC,QAAM,MAAM,IAAI,KAAK;AAAA,IACjB,CAAC,IAAI,IACL,aACA,aAAa,IACb,aAAa,KAAK,IAClB,aAAa,KAAK,IAClB,aAAa,KAAK,IAClB,aAAa,KAAK,IAClB,aAAa,KAAK,IAClB,aAAa,KAAK,IAClB,aAAa,KAAK,IAClB,aAAa,KAAK;AAAA,EACtB;AAEA,SAAO,KAAK,IAAI,IAAI,MAAM,MAAM;AACpC;;;ACfO,IAAM,cAAN,MAAiC;AAAA,EAIpC,YAA6B,MAAc;AAAd;AACzB,SAAK,IAAI,IAAI;AAAA,EACjB;AAAA,EAEA,eAAe,GAAmB;AAC9B,QAAI,IAAI,GAAG;AACP,aAAO;AAAA,IACX;AACA,WAAO,IAAI,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC;AAAA,EACnC;AAAA,EAEA,WAAmB;AACf,UAAM,IAAI,KAAK,OAAO;AACtB,QAAI,MAAM,GAAG;AACT,aAAO;AAAA,IACX;AACA,WAAO,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK;AAAA,EACvC;AAAA,EAEA,UAAkB;AACd,WAAO,KAAK;AAAA,EAChB;AAEJ;;;AC1BO,IAAM,WAAN,MAA8B;AAAA,EAIjC,YAA4B,IAAY,GAAmB,IAAY,GAAG;AAA9C;AAA+B;AACvD,QAAI,KAAK,GAAG;AACR,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AACA,SAAK,SAAS,KAAK,KAAK,CAAC;AAAA,EAC7B;AAAA,EAEA,eAAe,GAAmB;AAC9B,UAAM,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC;AAC7C,WAAO,OAAO,IAAI,IAAI,CAAC;AAAA,EAC3B;AAAA,EAEA,WAAW,GAAmB;AAC1B,QAAI,IAAI,KAAK,IAAI,GAAG;AAChB,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACzC;AACA,QAAI,MAAM,EAAG,QAAO;AACpB,QAAI,MAAM,EAAG,QAAO;AAEpB,UAAM,IAAI,CAAC,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,gBAAgB;AACxH,UAAM,IAAI,CAAC,mBAAmB,kBAAkB,mBAAmB,kBAAkB,iBAAiB;AACtG,UAAM,IAAI,CAAC,sBAAuB,oBAAoB,mBAAmB,mBAAmB,kBAAkB,gBAAgB;AAC9H,UAAM,IAAI,CAAC,qBAAsB,kBAAkB,gBAAgB,gBAAgB;AAEnF,QAAI,GAAG;AAEP,QAAI,IAAI,SAAS;AAEb,UAAI,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;AAC9B,kBAAY,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAClE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI;AAAA,IAC3D,WAAW,IAAI,IAAI,SAAS;AAExB,UAAI,KAAK,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC;AAClC,aAAO,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SACnE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI;AAAA,IAC3D,OAAO;AAEH,UAAI,IAAI;AACR,UAAI,IAAI;AACR,kBAAY,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,SACtE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,IAAI;AAAA,IACxE;AAAA,EACJ;AAAA,EAEA,UAAkB;AACd,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,WAAmB;AACf,UAAM,IAAI,KAAK,OAAO;AACtB,UAAM,IAAI,KAAK,WAAW,CAAC;AAC3B,WAAO,KAAK,IAAI,IAAI,KAAK;AAAA,EAC7B;AACJ;;;AC3DO,IAAM,UAAN,MAA6B;AAAA,EAEhC,YAA4B,KAA6B,KAAa;AAA1C;AAA6B;AACrD,QAAI,MAAM,KAAK;AACX,YAAM,IAAI,MAAM,gCAAgC;AAAA,IACpD;AAAA,EACJ;AAAA,EACA,eAAe,GAAmB;AAC9B,QAAI,IAAI,KAAK,KAAK;AACd,aAAO;AAAA,IACX;AAEA,QAAI,IAAI,KAAK,KAAK;AACd,aAAO;AAAA,IACX;AAEA,YAAQ,IAAG,KAAK,QAAQ,KAAK,MAAM,KAAK;AAAA,EAE5C;AAAA,EAEA,UAAkB;AACd,YAAQ,KAAK,MAAM,KAAK,OAAO;AAAA,EACnC;AAAA,EAEA,WAAmB;AACf,WAAO,KAAK,OAAO,KAAK,KAAK,MAAM,KAAK,OAAO,KAAK;AAAA,EACxD;AAEJ;;;AC3BO,IAAM,WAAN,MAA8B;AAAA,EAKjC,YAA8B,GAA4B,GAAW;AAAvC;AAA4B;AACtD,QAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,YAAM,IAAI,MAAM,sDAAsD;AAAA,IAC1E;AAEA,QAAI,EAAE,KAAK,KAAK,KAAK,IAAI;AACrB,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACrE;AAEA,SAAK,gBAAgB,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,MAAc,YAAY,GAAG,CAAC,IAAK,KAAK,KAAM,IAAI,OAAO,IAAI,EAAE;AACjH,QAAI,MAAM;AACV,SAAK,eAAe,KAAK,cAAc,IAAI,CAACC,OAAM;AAC9C,aAAOA;AACP,aAAO;AAAA,IACX,CAAC;AAAA,EACL;AAAA,EAEA,eAAe,GAAmB;AAC9B,QAAI,KAAK,MAAM,CAAC;AAChB,QAAI,MAAM,CAAC,GAAG;AACV,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACrC;AACA,QAAI,IAAI,GAAG;AACP,aAAO;AAAA,IACX;AACA,QAAI,IAAI,KAAK,GAAG;AACZ,aAAO;AAAA,IACX;AAEA,WAAO,KAAK,aAAa,CAAC;AAAA,EAC9B;AAAA,EAEA,WAAmB;AACf,UAAM,MAAM,KAAK,OAAO;AACxB,WAAO,KAAK,aAAa,UAAU,CAAC,QAAQ,MAAM,GAAG;AAAA,EACzD;AAAA,EAEA,YAAY,GAAmB;AAC3B,QAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,YAAM,IAAI,MAAM,sCAAsC;AAAA,IAC1D;AACA,QAAI,IAAI,KAAK,GAAG;AACZ,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC5E;AACA,WAAO,KAAK,cAAc,CAAC;AAAA,EAC/B;AACJ;;;ACnDO,IAAM,mBAAN,MAAsC;AAAA,EAIzC,YAA8B,GAA4B,GAAW;AAAvC;AAA4B;AAF1D,SAAiB,eAAyB,CAAC;AAGvC,QAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,YAAM,IAAI,MAAM,sDAAsD;AAAA,IAC1E;AAEA,QAAI,EAAE,KAAK,KAAK,KAAK,IAAI;AACrB,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACrE;AAAA,EACJ;AAAA,EAEA,eAAe,GAAmB;AAC9B,QAAI,KAAK,MAAM,CAAC;AAChB,QAAI,MAAM,CAAC,GAAG;AACV,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACrC;AACA,QAAI,IAAI,GAAG;AACP,aAAO;AAAA,IACX;AACA,QAAI,KAAK,aAAa,SAAS,GAAG;AAC9B,aAAO,KAAK,aAAa,CAAC;AAAA,IAC9B;AACA,QAAI,IAAI,KAAK,aAAa;AAC1B,QAAI,MAAM,IAAI,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI;AAC7C,OAAG;AACC,aAAO,KAAK,YAAY,CAAC;AACzB,WAAK,aAAa,KAAK,GAAG;AAC1B;AAAA,IACJ,SAAS,KAAK;AACd,WAAO,KAAK,aAAa,CAAC;AAAA,EAC9B;AAAA,EAEA,WAAmB;AACf,UAAM,MAAM,KAAK,OAAO;AACxB,QAAI,IAAI;AACR,WAAO,IAAI,KAAK,aAAa,QAAQ;AACjC,UAAI,MAAM,KAAK,aAAa,CAAC,GAAG;AAC5B,eAAO;AAAA,MACX;AACA;AAAA,IACJ;AACA,QAAI,MAAM,IAAI,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI;AAC7C,OAAG;AACC,aAAO,KAAK,YAAY,CAAC;AACzB,WAAK,aAAa,KAAK,GAAG;AAC1B;AAAA,IACJ,SAAS,MAAM;AACf,WAAO,IAAI;AAAA,EACf;AAAA,EAEA,YAAY,GAAmB;AAC3B,QAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,YAAM,IAAI,MAAM,sCAAsC;AAAA,IAC1D;AACA,WAAO,YAAY,KAAK,IAAI,IAAI,GAAG,CAAC,IAAK,KAAK,KAAK,KAAK,KAAO,IAAI,KAAK,MAAM;AAAA,EAClF;AACJ;;;AC3DO,IAAM,UAAN,MAA6B;AAAA,EAIhC,YAA8B,GAAW;AAAX;AAF9B,SAAiB,eAAyB,CAAC;AAGvC,QAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI,GAAG;AAC/B,YAAM,IAAI,MAAM,sDAAsD;AAAA,IAC1E;AAAA,EACJ;AAAA,EAEA,eAAe,GAAmB;AAC9B,QAAI,KAAK,MAAM,CAAC;AAChB,QAAI,MAAM,CAAC,GAAG;AACV,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACrC;AACA,QAAI,IAAI,GAAG;AACP,aAAO;AAAA,IACX;AACA,QAAI,KAAK,aAAa,SAAS,GAAG;AAC9B,aAAO,KAAK,aAAa,CAAC;AAAA,IAC9B;AACA,QAAI,IAAI,KAAK,aAAa;AAC1B,QAAI,MAAM,IAAI,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI;AAC7C,OAAG;AACC,aAAO,KAAK,YAAY,CAAC;AACzB,WAAK,aAAa,KAAK,GAAG;AAC1B;AAAA,IACJ,SAAS,KAAK;AACd,WAAO,KAAK,aAAa,CAAC;AAAA,EAC9B;AAAA,EAEA,WAAmB;AACf,UAAM,MAAM,KAAK,OAAO;AACxB,QAAI,IAAI;AACR,WAAO,IAAI,KAAK,aAAa,QAAQ;AACjC,UAAI,MAAM,KAAK,aAAa,CAAC,GAAG;AAC5B,eAAO;AAAA,MACX;AACA;AAAA,IACJ;AACA,QAAI,MAAM,IAAI,IAAI,KAAK,aAAa,IAAI,CAAC,IAAI;AAC7C,OAAG;AACC,aAAO,KAAK,YAAY,CAAC;AACzB,WAAK,aAAa,KAAK,GAAG;AAC1B;AAAA,IACJ,SAAS,MAAM;AACf,WAAO,IAAI;AAAA,EACf;AAAA,EAEA,YAAY,GAAmB;AAC3B,QAAI,CAAC,OAAO,UAAU,CAAC,KAAK,IAAI