{"version":3,"file":"groupD8.mjs","sources":["../../../src/maths/matrix/groupD8.ts"],"sourcesContent":["// Your friendly neighbour https://en.wikipedia.org/wiki/Dihedral_group\n//\n// This file implements the dihedral group of order 16, also called\n// of degree 8. That's why its called groupD8.\n\nimport { type RectangleLike } from '../../culling/Culler';\nimport { type Rectangle } from '../shapes/Rectangle';\nimport { Matrix } from './Matrix';\n\n/*\n * Transform matrix for operation n is:\n * | ux | vx |\n * | uy | vy |\n */\n\nconst ux = [1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1, 0, 1];\nconst uy = [0, 1, 1, 1, 0, -1, -1, -1, 0, 1, 1, 1, 0, -1, -1, -1];\nconst vx = [0, -1, -1, -1, 0, 1, 1, 1, 0, 1, 1, 1, 0, -1, -1, -1];\nconst vy = [1, 1, 0, -1, -1, -1, 0, 1, -1, -1, 0, 1, 1, 1, 0, -1];\n\n/**\n * [Cayley Table]{@link https://en.wikipedia.org/wiki/Cayley_table}\n * for the composition of each rotation in the dihederal group D8.\n * @type {number[][]}\n * @private\n */\nconst rotationCayley: number[][] = [];\n\n/**\n * Matrices for each `GD8Symmetry` rotation.\n * @type {Matrix[]}\n * @private\n */\nconst rotationMatrices: Matrix[] = [];\n\n/** Alias for `Math.sign`. */\nconst signum = Math.sign;\n\n/*\n * Initializes `rotationCayley` and `rotationMatrices`. It is called\n * only once below.\n */\nfunction init(): void\n{\n    for (let i = 0; i < 16; i++)\n    {\n        const row: number[] = [];\n\n        rotationCayley.push(row);\n\n        for (let j = 0; j < 16; j++)\n        {\n            /* Multiplies rotation matrices i and j. */\n            const _ux = signum((ux[i] * ux[j]) + (vx[i] * uy[j]));\n            const _uy = signum((uy[i] * ux[j]) + (vy[i] * uy[j]));\n            const _vx = signum((ux[i] * vx[j]) + (vx[i] * vy[j]));\n            const _vy = signum((uy[i] * vx[j]) + (vy[i] * vy[j]));\n\n            /* Finds rotation matrix matching the product and pushes it. */\n            for (let k = 0; k < 16; k++)\n            {\n                if (ux[k] === _ux && uy[k] === _uy\n                      && vx[k] === _vx && vy[k] === _vy)\n                {\n                    row.push(k);\n                    break;\n                }\n            }\n        }\n    }\n\n    for (let i = 0; i < 16; i++)\n    {\n        const mat = new Matrix();\n\n        mat.set(ux[i], uy[i], vx[i], vy[i], 0, 0);\n        rotationMatrices.push(mat);\n    }\n}\n\ninit();\n\ntype GD8Symmetry = number;\n/**\n * @typedef {number} GD8Symmetry\n * @see groupD8\n */\n\n/**\n * Implements the dihedral group D8, which is similar to\n * [group D4]{@link http://mathworld.wolfram.com/DihedralGroupD4.html};\n * D8 is the same but with diagonals, and it is used for texture\n * rotations.\n *\n * The directions the U- and V- axes after rotation\n * of an angle of `a: GD8Constant` are the vectors `(uX(a), uY(a))`\n * and `(vX(a), vY(a))`. These aren't necessarily unit vectors.\n * @author Ivan: ivanpopelyshev\n * @groupDescription groupD8\n * @category maths\n * @advanced\n */\nexport const groupD8 = {\n    /**\n     * | Rotation | Direction |\n     * |----------|-----------|\n     * | 0°       | East      |\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    E: 0,\n\n    /**\n     * | Rotation | Direction |\n     * |----------|-----------|\n     * | 45°↻     | Southeast |\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    SE: 1,\n\n    /**\n     * | Rotation | Direction |\n     * |----------|-----------|\n     * | 90°↻     | South     |\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    S: 2,\n\n    /**\n     * | Rotation | Direction |\n     * |----------|-----------|\n     * | 135°↻    | Southwest |\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    SW: 3,\n\n    /**\n     * | Rotation | Direction |\n     * |----------|-----------|\n     * | 180°     | West      |\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    W: 4,\n\n    /**\n     * | Rotation    | Direction    |\n     * |-------------|--------------|\n     * | -135°/225°↻ | Northwest    |\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    NW: 5,\n\n    /**\n     * | Rotation    | Direction    |\n     * |-------------|--------------|\n     * | -90°/270°↻  | North        |\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    N: 6,\n\n    /**\n     * | Rotation    | Direction    |\n     * |-------------|--------------|\n     * | -45°/315°↻  | Northeast    |\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    NE: 7,\n\n    /**\n     * Reflection about Y-axis.\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    MIRROR_VERTICAL: 8,\n\n    /**\n     * Reflection about the main diagonal.\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    MAIN_DIAGONAL: 10,\n\n    /**\n     * Reflection about X-axis.\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    MIRROR_HORIZONTAL: 12,\n\n    /**\n     * Reflection about reverse diagonal.\n     * @group groupD8\n     * @type {GD8Symmetry}\n     */\n    REVERSE_DIAGONAL: 14,\n\n    /**\n     * @group groupD8\n     * @param {GD8Symmetry} ind - sprite rotation angle.\n     * @returns {GD8Symmetry} The X-component of the U-axis\n     *    after rotating the axes.\n     */\n    uX: (ind: GD8Symmetry): GD8Symmetry => ux[ind],\n\n    /**\n     * @group groupD8\n     * @param {GD8Symmetry} ind - sprite rotation angle.\n     * @returns {GD8Symmetry} The Y-component of the U-axis\n     *    after rotating the axes.\n     */\n    uY: (ind: GD8Symmetry): GD8Symmetry => uy[ind],\n\n    /**\n     * @group groupD8\n     * @param {GD8Symmetry} ind - sprite rotation angle.\n     * @returns {GD8Symmetry} The X-component of the V-axis\n     *    after rotating the axes.\n     */\n    vX: (ind: GD8Symmetry): GD8Symmetry => vx[ind],\n\n    /**\n     * @group groupD8\n     * @param {GD8Symmetry} ind - sprite rotation angle.\n     * @returns {GD8Symmetry} The Y-component of the V-axis\n     *    after rotating the axes.\n     */\n    vY: (ind: GD8Symmetry): GD8Symmetry => vy[ind],\n\n    /**\n     * @group groupD8\n     * @param {GD8Symmetry} rotation - symmetry whose opposite\n     *   is needed. Only rotations have opposite symmetries while\n     *   reflections don't.\n     * @returns {GD8Symmetry} The opposite symmetry of `rotation`\n     */\n    inv: (rotation: GD8Symmetry): GD8Symmetry =>\n    {\n        if (rotation & 8)// true only if between 8 & 15 (reflections)\n        {\n            return rotation & 15;// or rotation % 16\n        }\n\n        return (-rotation) & 7;// or (8 - rotation) % 8\n    },\n\n    /**\n     * Composes the two D8 operations.\n     *\n     * Taking `^` as reflection:\n     *\n     * |       | E=0 | S=2 | W=4 | N=6 | E^=8 | S^=10 | W^=12 | N^=14 |\n     * |-------|-----|-----|-----|-----|------|-------|-------|-------|\n     * | E=0   | E   | S   | W   | N   | E^   | S^    | W^    | N^    |\n     * | S=2   | S   | W   | N   | E   | S^   | W^    | N^    | E^    |\n     * | W=4   | W   | N   | E   | S   | W^   | N^    | E^    | S^    |\n     * | N=6   | N   | E   | S   | W   | N^   | E^    | S^    | W^    |\n     * | E^=8  | E^  | N^  | W^  | S^  | E    | N     | W     | S     |\n     * | S^=10 | S^  | E^  | N^  | W^  | S    | E     | N     | W     |\n     * | W^=12 | W^  | S^  | E^  | N^  | W    | S     | E     | N     |\n     * | N^=14 | N^  | W^  | S^  | E^  | N    | W     | S     | E     |\n     *\n     * [This is a Cayley table]{@link https://en.wikipedia.org/wiki/Cayley_table}\n     * @group groupD8\n     * @param {GD8Symmetry} rotationSecond - Second operation, which\n     *   is the row in the above cayley table.\n     * @param {GD8Symmetry} rotationFirst - First operation, which\n     *   is the column in the above cayley table.\n     * @returns {GD8Symmetry} Composed operation\n     */\n    add: (rotationSecond: GD8Symmetry, rotationFirst: GD8Symmetry): GD8Symmetry => (\n        rotationCayley[rotationSecond][rotationFirst]\n    ),\n\n    /**\n     * Reverse of `add`.\n     * @group groupD8\n     * @param {GD8Symmetry} rotationSecond - Second operation\n     * @param {GD8Symmetry} rotationFirst - First operation\n     * @returns {GD8Symmetry} Result\n     */\n    sub: (rotationSecond: GD8Symmetry, rotationFirst: GD8Symmetry): GD8Symmetry => (\n        rotationCayley[rotationSecond][groupD8.inv(rotationFirst)]\n    ),\n\n    /**\n     * Adds 180 degrees to rotation, which is a commutative\n     * operation.\n     * @group groupD8\n     * @param {number} rotation - The number to rotate.\n     * @returns {number} Rotated number\n     */\n    rotate180: (rotation: number): number => rotation ^ 4,\n\n    /**\n     * Checks if the rotation angle is vertical, i.e. south\n     * or north. It doesn't work for reflections.\n     * @group groupD8\n     * @param {GD8Symmetry} rotation - The number to check.\n     * @returns {boolean} Whether or not the direction is vertical\n     */\n    isVertical: (rotation: GD8Symmetry): boolean => (rotation & 3) === 2, // rotation % 4 === 2\n\n    /**\n     * Approximates the vector `V(dx,dy)` into one of the\n     * eight directions provided by `groupD8`.\n     * @group groupD8\n     * @param {number} dx - X-component of the vector\n     * @param {number} dy - Y-component of the vector\n     * @returns {GD8Symmetry} Approximation of the vector into\n     *  one of the eight symmetries.\n     */\n    byDirection: (dx: number, dy: number): GD8Symmetry =>\n    {\n        if (Math.abs(dx) * 2 <= Math.abs(dy))\n        {\n            if (dy >= 0)\n            {\n                return groupD8.S;\n            }\n\n            return groupD8.N;\n        }\n        else if (Math.abs(dy) * 2 <= Math.abs(dx))\n        {\n            if (dx > 0)\n            {\n                return groupD8.E;\n            }\n\n            return groupD8.W;\n        }\n        else if (dy > 0)\n        {\n            if (dx > 0)\n            {\n                return groupD8.SE;\n            }\n\n            return groupD8.SW;\n        }\n        else if (dx > 0)\n        {\n            return groupD8.NE;\n        }\n\n        return groupD8.NW;\n    },\n\n    /**\n     * Helps sprite to compensate texture packer rotation.\n     * @group groupD8\n     * @param {Matrix} matrix - sprite world matrix\n     * @param {GD8Symmetry} rotation - The rotation factor to use.\n     * @param {number} tx - sprite anchoring\n     * @param {number} ty - sprite anchoring\n     * @param {number} dw - sprite width\n     * @param {number} dh - sprite height\n     */\n    matrixAppendRotationInv: (matrix: Matrix, rotation: GD8Symmetry, tx = 0, ty = 0, dw = 0, dh = 0): void =>\n    {\n        // Packer used \"rotation\", we use \"inv(rotation)\"\n        const mat: Matrix = rotationMatrices[groupD8.inv(rotation)];\n\n        const a = mat.a;\n        const b = mat.b;\n        const c = mat.c;\n        const d = mat.d;\n\n        const finalTx = tx - Math.min(0, a * dw, c * dh, (a * dw) + (c * dh));\n        const finalTy = ty - Math.min(0, b * dw, d * dh, (b * dw) + (d * dh));\n\n        const a1 = matrix.a;\n        const b1 = matrix.b;\n        const c1 = matrix.c;\n        const d1 = matrix.d;\n\n        matrix.a = (a * a1) + (b * c1);\n        matrix.b = (a * b1) + (b * d1);\n        matrix.c = (c * a1) + (d * c1);\n        matrix.d = (c * b1) + (d * d1);\n\n        matrix.tx = (finalTx * a1) + (finalTy * c1) + matrix.tx;\n        matrix.ty = (finalTx * b1) + (finalTy * d1) + matrix.ty;\n    },\n\n    /**\n     * Transforms rectangle coordinates based on texture packer rotation.\n     * Used when texture atlas pages are rotated and coordinates need to be adjusted.\n     * @group groupD8\n     * @param {RectangleLike} rect - Rectangle with original coordinates to transform\n     * @param {RectangleLike} sourceFrame - Source texture frame (includes offset and dimensions)\n     * @param {GD8Symmetry} rotation - The groupD8 rotation value\n     * @param {Rectangle} out - Rectangle to store the result\n     * @returns {Rectangle} Transformed coordinates (includes source frame offset)\n     */\n    transformRectCoords: (\n        rect: RectangleLike,\n        sourceFrame: RectangleLike,\n        rotation: GD8Symmetry,\n        out: Rectangle\n    ): Rectangle =>\n    {\n        const { x, y, width, height } = rect;\n        const { x: frameX, y: frameY, width: frameWidth, height: frameHeight } = sourceFrame;\n\n        if (rotation === groupD8.E)\n        {\n            // No rotation\n            out.set(x + frameX, y + frameY, width, height);\n\n            return out;\n        }\n        else if (rotation === groupD8.S)\n        {\n            // 90° clockwise rotation\n            return out.set(\n                (frameWidth - y - height) + frameX,\n                x + frameY,\n                height,\n                width\n            );\n        }\n        else if (rotation === groupD8.W)\n        {\n            // 180° rotation\n            return out.set(\n                (frameWidth - x - width) + frameX,\n                (frameHeight - y - height) + frameY,\n                width,\n                height\n            );\n        }\n        else if (rotation === groupD8.N)\n        {\n            // 270° clockwise rotation (90° counter-clockwise)\n            return out.set(\n                y + frameX,\n                (frameHeight - x - width) + frameY,\n                height,\n                width\n            );\n        }\n\n        // For other rotations (diagonal and reflections), fall back to no rotation\n        // These are less common in typical texture atlases\n        return out.set(x + frameX, y + frameY, width, height);\n    },\n};\n"],"names":[],"mappings":";;;AAeA,MAAM,KAAK,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAA,CAAA,EAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAA,CAAA,EAAI,GAAG,CAAC,CAAA;AAChE,MAAM,KAAK,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,CAAA,EAAI,CAAA,CAAA,EAAI,CAAA,CAAA,EAAI,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAChE,MAAM,KAAK,CAAC,CAAA,EAAG,CAAA,CAAA,EAAI,CAAA,CAAA,EAAI,IAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAChE,MAAM,KAAK,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAA,CAAA,EAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AAQhE,MAAM,iBAA6B,EAAC;AAOpC,MAAM,mBAA6B,EAAC;AAGpC,MAAM,SAAS,IAAA,CAAK,IAAA;AAMpB,SAAS,IAAA,GACT;AACI,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EACxB;AACI,IAAA,MAAM,MAAgB,EAAC;AAEvB,IAAA,cAAA,CAAe,KAAK,GAAG,CAAA;AAEvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EACxB;AAEI,MAAA,MAAM,GAAA,GAAM,MAAA,CAAQ,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAM,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAE,CAAA;AACpD,MAAA,MAAM,GAAA,GAAM,MAAA,CAAQ,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAM,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAE,CAAA;AACpD,MAAA,MAAM,GAAA,GAAM,MAAA,CAAQ,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAM,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAE,CAAA;AACpD,MAAA,MAAM,GAAA,GAAM,MAAA,CAAQ,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAM,EAAA,CAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAC,CAAE,CAAA;AAGpD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EACxB;AACI,QAAA,IAAI,EAAA,CAAG,CAAC,CAAA,KAAM,GAAA,IAAO,GAAG,CAAC,CAAA,KAAM,GAAA,IACtB,EAAA,CAAG,CAAC,CAAA,KAAM,GAAA,IAAO,EAAA,CAAG,CAAC,MAAM,GAAA,EACpC;AACI,UAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,UAAA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EACxB;AACI,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,EAAO;AAEvB,IAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AACxC,IAAA,gBAAA,CAAiB,KAAK,GAAG,CAAA;AAAA,EAC7B;AACJ;AAEA,IAAA,EAAK;AAsBE,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnB,CAAA,EAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASH,EAAA,EAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,CAAA,EAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASH,EAAA,EAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,CAAA,EAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASH,EAAA,EAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASJ,CAAA,EAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASH,EAAA,EAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOJ,eAAA,EAAiB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,aAAA,EAAe,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,iBAAA,EAAmB,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnB,gBAAA,EAAkB,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQlB,EAAA,EAAI,CAAC,GAAA,KAAkC,EAAA,CAAG,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7C,EAAA,EAAI,CAAC,GAAA,KAAkC,EAAA,CAAG,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7C,EAAA,EAAI,CAAC,GAAA,KAAkC,EAAA,CAAG,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7C,EAAA,EAAI,CAAC,GAAA,KAAkC,EAAA,CAAG,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS7C,GAAA,EAAK,CAAC,QAAA,KACN;AACI,IAAA,IAAI,WAAW,CAAA,EACf;AACI,MAAA,OAAO,QAAA,GAAW,EAAA;AAAA,IACtB;AAEA,IAAA,OAAQ,CAAC,QAAA,GAAY,CAAA;AAAA,EACzB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BA,KAAK,CAAC,cAAA,EAA6B,kBAC/B,cAAA,CAAe,cAAc,EAAE,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUhD,GAAA,EAAK,CAAC,cAAA,EAA6B,aAAA,KAC/B,cAAA,CAAe,cAAc,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU7D,SAAA,EAAW,CAAC,QAAA,KAA6B,QAAA,GAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASpD,UAAA,EAAY,CAAC,QAAA,KAAA,CAAoC,QAAA,GAAW,CAAA,MAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWnE,WAAA,EAAa,CAAC,EAAA,EAAY,EAAA,KAC1B;AACI,IAAA,IAAI,IAAA,CAAK,IAAI,EAAE,CAAA,GAAI,KAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EACnC;AACI,MAAA,IAAI,MAAM,CAAA,EACV;AACI,QAAA,OAAO,OAAA,CAAQ,CAAA;AAAA,MACnB;AAEA,MAAA,OAAO,OAAA,CAAQ,CAAA;AAAA,IACnB,CAAA,MAAA,IACS,KAAK,GAAA,CAAI,EAAE,IAAI,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EACxC;AACI,MAAA,IAAI,KAAK,CAAA,EACT;AACI,QAAA,OAAO,OAAA,CAAQ,CAAA;AAAA,MACnB;AAEA,MAAA,OAAO,OAAA,CAAQ,CAAA;AAAA,IACnB,CAAA,MAAA,IACS,KAAK,CAAA,EACd;AACI,MAAA,IAAI,KAAK,CAAA,EACT;AACI,QAAA,OAAO,OAAA,CAAQ,EAAA;AAAA,MACnB;AAEA,MAAA,OAAO,OAAA,CAAQ,EAAA;AAAA,IACnB,CAAA,MAAA,IACS,KAAK,CAAA,EACd;AACI,MAAA,OAAO,OAAA,CAAQ,EAAA;AAAA,IACnB;AAEA,IAAA,OAAO,OAAA,CAAQ,EAAA;AAAA,EACnB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,uBAAA,EAAyB,CAAC,MAAA,EAAgB,QAAA,EAAuB,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,KAC9F;AAEI,IAAA,MAAM,GAAA,GAAc,gBAAA,CAAiB,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAC,CAAA;AAE1D,IAAA,MAAM,IAAI,GAAA,CAAI,CAAA;AACd,IAAA,MAAM,IAAI,GAAA,CAAI,CAAA;AACd,IAAA,MAAM,IAAI,GAAA,CAAI,CAAA;AACd,IAAA,MAAM,IAAI,GAAA,CAAI,CAAA;AAEd,IAAA,MAAM,OAAA,GAAU,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAA,EAAK,CAAA,GAAI,EAAA,GAAO,CAAA,GAAI,EAAG,CAAA;AACpE,IAAA,MAAM,OAAA,GAAU,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAA,EAAK,CAAA,GAAI,EAAA,GAAO,CAAA,GAAI,EAAG,CAAA;AAEpE,IAAA,MAAM,KAAK,MAAA,CAAO,CAAA;AAClB,IAAA,MAAM,KAAK,MAAA,CAAO,CAAA;AAClB,IAAA,MAAM,KAAK,MAAA,CAAO,CAAA;AAClB,IAAA,MAAM,KAAK,MAAA,CAAO,CAAA;AAElB,IAAA,MAAA,CAAO,CAAA,GAAK,CAAA,GAAI,EAAA,GAAO,CAAA,GAAI,EAAA;AAC3B,IAAA,MAAA,CAAO,CAAA,GAAK,CAAA,GAAI,EAAA,GAAO,CAAA,GAAI,EAAA;AAC3B,IAAA,MAAA,CAAO,CAAA,GAAK,CAAA,GAAI,EAAA,GAAO,CAAA,GAAI,EAAA;AAC3B,IAAA,MAAA,CAAO,CAAA,GAAK,CAAA,GAAI,EAAA,GAAO,CAAA,GAAI,EAAA;AAE3B,IAAA,MAAA,CAAO,EAAA,GAAM,OAAA,GAAU,EAAA,GAAO,OAAA,GAAU,KAAM,MAAA,CAAO,EAAA;AACrD,IAAA,MAAA,CAAO,EAAA,GAAM,OAAA,GAAU,EAAA,GAAO,OAAA,GAAU,KAAM,MAAA,CAAO,EAAA;AAAA,EACzD,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,mBAAA,EAAqB,CACjB,IAAA,EACA,WAAA,EACA,UACA,GAAA,KAEJ;AACI,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAO,GAAI,IAAA;AAChC,IAAA,MAAM,EAAE,GAAG,MAAA,EAAQ,CAAA,EAAG,QAAQ,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,WAAA,EAAY,GAAI,WAAA;AAEzE,IAAA,IAAI,QAAA,KAAa,QAAQ,CAAA,EACzB;AAEI,MAAA,GAAA,CAAI,IAAI,CAAA,GAAI,MAAA,EAAQ,CAAA,GAAI,MAAA,EAAQ,OAAO,MAAM,CAAA;AAE7C,MAAA,OAAO,GAAA;AAAA,IACX,CAAA,MAAA,IACS,QAAA,KAAa,OAAA,CAAQ,CAAA,EAC9B;AAEI,MAAA,OAAO,GAAA,CAAI,GAAA;AAAA,QACN,UAAA,GAAa,IAAI,MAAA,GAAU,MAAA;AAAA,QAC5B,CAAA,GAAI,MAAA;AAAA,QACJ,MAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ,CAAA,MAAA,IACS,QAAA,KAAa,OAAA,CAAQ,CAAA,EAC9B;AAEI,MAAA,OAAO,GAAA,CAAI,GAAA;AAAA,QACN,UAAA,GAAa,IAAI,KAAA,GAAS,MAAA;AAAA,QAC1B,WAAA,GAAc,IAAI,MAAA,GAAU,MAAA;AAAA,QAC7B,KAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ,CAAA,MAAA,IACS,QAAA,KAAa,OAAA,CAAQ,CAAA,EAC9B;AAEI,MAAA,OAAO,GAAA,CAAI,GAAA;AAAA,QACP,CAAA,GAAI,MAAA;AAAA,QACH,WAAA,GAAc,IAAI,KAAA,GAAS,MAAA;AAAA,QAC5B,MAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AAIA,IAAA,OAAO,IAAI,GAAA,CAAI,CAAA,GAAI,QAAQ,CAAA,GAAI,MAAA,EAAQ,OAAO,MAAM,CAAA;AAAA,EACxD;AACJ;;;;"}