@pdfme/generator 2.2.0 → 3.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -36
- package/dist/cjs/__tests__/assets/templates/index.js +2 -0
- package/dist/cjs/__tests__/assets/templates/index.js.map +1 -1
- package/dist/cjs/__tests__/generate.test.js +52 -25
- package/dist/cjs/__tests__/generate.test.js.map +1 -1
- package/dist/cjs/src/builtInRenderer.js +6 -0
- package/dist/cjs/src/builtInRenderer.js.map +1 -0
- package/dist/cjs/src/generate.js +33 -33
- package/dist/cjs/src/generate.js.map +1 -1
- package/dist/cjs/src/index.js +1 -13
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/pdfUtils.js +45 -0
- package/dist/cjs/src/pdfUtils.js.map +1 -0
- package/dist/cjs/src/types.js +3 -0
- package/dist/cjs/src/types.js.map +1 -0
- package/dist/esm/__tests__/assets/templates/index.js +2 -0
- package/dist/esm/__tests__/assets/templates/index.js.map +1 -1
- package/dist/esm/__tests__/generate.test.js +52 -25
- package/dist/esm/__tests__/generate.test.js.map +1 -1
- package/dist/esm/src/builtInRenderer.js +4 -0
- package/dist/esm/src/builtInRenderer.js.map +1 -0
- package/dist/esm/src/generate.js +27 -30
- package/dist/esm/src/generate.js.map +1 -1
- package/dist/esm/src/index.js +1 -2
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/pdfUtils.js +40 -0
- package/dist/esm/src/pdfUtils.js.map +1 -0
- package/dist/esm/src/types.js +2 -0
- package/dist/esm/src/types.js.map +1 -0
- package/dist/types/__tests__/assets/templates/index.d.ts +725 -1804
- package/dist/types/src/builtInRenderer.d.ts +3 -0
- package/dist/types/src/index.d.ts +1 -4
- package/dist/types/src/pdfUtils.d.ts +15 -0
- package/dist/types/src/types.d.ts +25 -0
- package/package.json +6 -9
- package/src/builtInRenderer.ts +5 -0
- package/src/generate.ts +39 -49
- package/src/index.ts +1 -71
- package/src/pdfUtils.ts +48 -0
- package/src/types.ts +13 -0
- package/tsconfig.cjs.json +3 -2
- package/tsconfig.esm.json +3 -2
- package/tsconfig.json +3 -0
- package/dist/cjs/__tests__/helper.test.js +0 -53
- package/dist/cjs/__tests__/helper.test.js.map +0 -1
- package/dist/cjs/src/helper.js +0 -263
- package/dist/cjs/src/helper.js.map +0 -1
- package/dist/esm/__tests__/helper.test.js +0 -48
- package/dist/esm/__tests__/helper.test.js.map +0 -1
- package/dist/esm/src/helper.js +0 -252
- package/dist/esm/src/helper.js.map +0 -1
- package/dist/types/__tests__/helper.test.d.ts +0 -1
- package/dist/types/src/helper.d.ts +0 -67
- package/src/helper.ts +0 -391
@@ -1,5 +1,2 @@
|
|
1
1
|
import generate from './generate.js';
|
2
|
-
|
3
|
-
import type { Lang, Size, Alignment, SchemaType, BarCodeType, TextSchema, ImageSchema, BarcodeSchema, Schema, SchemaForUI, Font, BasePdf, Template, CommonProps, GeneratorOptions, GenerateProps, UIOptions, UIProps, PreviewProps, DesignerProps } from '@pdfme/common';
|
4
|
-
export { generate, BLANK_PDF, DEFAULT_FONT_VALUE, isTextSchema, isImageSchema, isBarcodeSchema, checkTemplate, checkUIProps, checkPreviewProps, checkDesignerProps, checkGenerateProps, validateBarcodeInput, };
|
5
|
-
export type { Lang, Size, Alignment, SchemaType, BarCodeType, TextSchema, ImageSchema, BarcodeSchema, Schema, SchemaForUI, Font, BasePdf, Template, CommonProps, GeneratorOptions, GenerateProps, UIOptions, UIProps, PreviewProps, DesignerProps, };
|
2
|
+
export { generate };
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import { PDFPage, PDFDocument, PDFEmbeddedPage } from '@pdfme/pdf-lib';
|
2
|
+
import { BasePdf } from '@pdfme/common';
|
3
|
+
import type { EmbedPdfBox } from './types';
|
4
|
+
export declare const getEmbeddedPagesAndEmbedPdfBoxes: (arg: {
|
5
|
+
pdfDoc: PDFDocument;
|
6
|
+
basePdf: BasePdf;
|
7
|
+
}) => Promise<{
|
8
|
+
embeddedPages: PDFEmbeddedPage[];
|
9
|
+
embedPdfBoxes: EmbedPdfBox[];
|
10
|
+
}>;
|
11
|
+
export declare const drawEmbeddedPage: (arg: {
|
12
|
+
page: PDFPage;
|
13
|
+
embeddedPage: PDFEmbeddedPage;
|
14
|
+
embedPdfBox: EmbedPdfBox;
|
15
|
+
}) => void;
|
@@ -0,0 +1,25 @@
|
|
1
|
+
import type { Schema, PDFRenderProps } from '@pdfme/common';
|
2
|
+
export type PDFRender = (arg: PDFRenderProps<Schema>) => Promise<void>;
|
3
|
+
export interface PDFRenderer {
|
4
|
+
[key: string]: PDFRender | undefined;
|
5
|
+
}
|
6
|
+
export type EmbedPdfBox = {
|
7
|
+
mediaBox: {
|
8
|
+
x: number;
|
9
|
+
y: number;
|
10
|
+
width: number;
|
11
|
+
height: number;
|
12
|
+
};
|
13
|
+
bleedBox: {
|
14
|
+
x: number;
|
15
|
+
y: number;
|
16
|
+
width: number;
|
17
|
+
height: number;
|
18
|
+
};
|
19
|
+
trimBox: {
|
20
|
+
x: number;
|
21
|
+
y: number;
|
22
|
+
width: number;
|
23
|
+
height: number;
|
24
|
+
};
|
25
|
+
};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@pdfme/generator",
|
3
|
-
"version": "
|
3
|
+
"version": "3.0.0-beta.1",
|
4
4
|
"sideEffects": false,
|
5
5
|
"author": "hand-dot",
|
6
6
|
"license": "MIT",
|
@@ -43,24 +43,21 @@
|
|
43
43
|
"test": "jest",
|
44
44
|
"lint:watch": "tsc -w --noEmit",
|
45
45
|
"test:watch": "jest --coverage --watch",
|
46
|
-
"prune": "ts-prune src"
|
46
|
+
"prune": "ts-prune src",
|
47
|
+
"prettier": "prettier --write 'src/**/*.ts'"
|
47
48
|
},
|
48
49
|
"dependencies": {
|
49
50
|
"@pdfme/pdf-lib": "^1.17.3",
|
50
51
|
"atob": "^2.1.2",
|
51
|
-
"bwip-js": "^3.2.2",
|
52
52
|
"fontkit": "^2.0.2"
|
53
53
|
},
|
54
54
|
"devDependencies": {
|
55
55
|
"@pdfme/common": "file:../common",
|
56
|
-
"@
|
57
|
-
"
|
58
|
-
"jsqr": "^1.4.0",
|
59
|
-
"pdf2json": "^2.0.0",
|
60
|
-
"pngjs": "^6.0.0"
|
56
|
+
"@pdfme/schemas": "file:../schemas",
|
57
|
+
"pdf2json": "^2.0.0"
|
61
58
|
},
|
62
59
|
"peerDependencies": {
|
63
|
-
"@pdfme/common": "
|
60
|
+
"@pdfme/common": "latest"
|
64
61
|
},
|
65
62
|
"jest": {
|
66
63
|
"resolver": "ts-jest-resolver",
|
package/src/generate.ts
CHANGED
@@ -1,57 +1,46 @@
|
|
1
|
-
import
|
1
|
+
import * as pdfLib from '@pdfme/pdf-lib';
|
2
2
|
import * as fontkit from 'fontkit';
|
3
|
-
import type {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
} from '
|
9
|
-
|
10
|
-
|
11
|
-
getFallbackFontName,
|
12
|
-
checkGenerateProps,
|
13
|
-
} from '@pdfme/common';
|
14
|
-
import {
|
15
|
-
getEmbeddedPagesAndEmbedPdfBoxes,
|
16
|
-
drawInputByTemplateSchema,
|
17
|
-
drawEmbeddedPage,
|
18
|
-
embedAndGetFontObj,
|
19
|
-
InputImageCache,
|
20
|
-
} from './helper.js';
|
21
|
-
import { TOOL_NAME } from './constants.js';
|
22
|
-
|
23
|
-
const preprocessing = async (arg: { inputs: SchemaInputs[]; template: Template; font: Font }) => {
|
24
|
-
const { template, font } = arg;
|
3
|
+
import type { GenerateProps, Template } from '@pdfme/common';
|
4
|
+
import { checkGenerateProps } from '@pdfme/common';
|
5
|
+
import type { PDFRenderer } from './types';
|
6
|
+
import builtInRenderer from './builtInRenderer';
|
7
|
+
import { drawEmbeddedPage, getEmbeddedPagesAndEmbedPdfBoxes } from './pdfUtils';
|
8
|
+
import { TOOL_NAME } from './constants';
|
9
|
+
|
10
|
+
const preprocessing = async ({ template }: { template: Template }) => {
|
25
11
|
const { basePdf } = template;
|
26
|
-
const fallbackFontName = getFallbackFontName(font);
|
27
12
|
|
28
|
-
const pdfDoc = await PDFDocument.create();
|
13
|
+
const pdfDoc = await pdfLib.PDFDocument.create();
|
29
14
|
// @ts-ignore
|
30
15
|
pdfDoc.registerFontkit(fontkit);
|
31
16
|
|
32
|
-
const pdfFontObj = await embedAndGetFontObj({ pdfDoc, font });
|
33
|
-
|
34
17
|
const pagesAndBoxes = await getEmbeddedPagesAndEmbedPdfBoxes({ pdfDoc, basePdf });
|
35
18
|
const { embeddedPages, embedPdfBoxes } = pagesAndBoxes;
|
36
19
|
|
37
|
-
return { pdfDoc,
|
20
|
+
return { pdfDoc, embeddedPages, embedPdfBoxes };
|
38
21
|
};
|
39
22
|
|
40
|
-
const postProcessing = (pdfDoc: PDFDocument) => {
|
23
|
+
const postProcessing = ({ pdfDoc }: { pdfDoc: pdfLib.PDFDocument }) => {
|
41
24
|
pdfDoc.setProducer(TOOL_NAME);
|
42
25
|
pdfDoc.setCreator(TOOL_NAME);
|
43
26
|
};
|
44
27
|
|
45
28
|
const generate = async (props: GenerateProps) => {
|
46
29
|
checkGenerateProps(props);
|
47
|
-
const { inputs, template, options = {} } = props;
|
48
|
-
|
49
|
-
const {
|
30
|
+
const { inputs, template, options = {}, plugins = {} } = props;
|
31
|
+
|
32
|
+
const { pdfDoc, embeddedPages, embedPdfBoxes } = await preprocessing({ template });
|
33
|
+
|
34
|
+
const customRenderer = Object.entries(plugins).reduce(
|
35
|
+
(acc, [key, { pdf }]) => Object.assign(acc, { [key]: pdf }),
|
36
|
+
{} as PDFRenderer
|
37
|
+
);
|
50
38
|
|
51
|
-
const
|
52
|
-
|
39
|
+
const rendererRegistry: PDFRenderer =
|
40
|
+
Object.keys(customRenderer).length > 0 ? customRenderer : builtInRenderer;
|
41
|
+
|
42
|
+
const _cache = new Map();
|
53
43
|
|
54
|
-
const inputImageCache: InputImageCache = {};
|
55
44
|
for (let i = 0; i < inputs.length; i += 1) {
|
56
45
|
const inputObj = inputs[i];
|
57
46
|
const keys = Object.keys(inputObj);
|
@@ -65,24 +54,25 @@ const generate = async (props: GenerateProps) => {
|
|
65
54
|
drawEmbeddedPage({ page, embeddedPage, embedPdfBox });
|
66
55
|
for (let l = 0; l < keys.length; l += 1) {
|
67
56
|
const key = keys[l];
|
68
|
-
const
|
69
|
-
const
|
70
|
-
const
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
}
|
57
|
+
const schemaObj = template.schemas[j];
|
58
|
+
const schema = schemaObj[key];
|
59
|
+
const value = inputObj[key];
|
60
|
+
|
61
|
+
if (!schema || !value) {
|
62
|
+
continue;
|
63
|
+
}
|
64
|
+
|
65
|
+
const render = rendererRegistry[schema.type];
|
66
|
+
if (!render) {
|
67
|
+
throw new Error(`[@pdfme/generator] Renderer for type ${schema.type} not found.
|
68
|
+
Check this document: https://pdfme.com/docs/custom-schemas`);
|
69
|
+
}
|
70
|
+
await render({ value, schema, pdfLib, pdfDoc, page, options, _cache });
|
81
71
|
}
|
82
72
|
}
|
83
73
|
}
|
84
74
|
|
85
|
-
postProcessing(pdfDoc);
|
75
|
+
postProcessing({ pdfDoc });
|
86
76
|
|
87
77
|
return pdfDoc.save();
|
88
78
|
};
|
package/src/index.ts
CHANGED
@@ -1,73 +1,3 @@
|
|
1
1
|
import generate from './generate.js';
|
2
|
-
import {
|
3
|
-
BLANK_PDF,
|
4
|
-
DEFAULT_FONT_VALUE,
|
5
|
-
isTextSchema,
|
6
|
-
isImageSchema,
|
7
|
-
isBarcodeSchema,
|
8
|
-
checkTemplate,
|
9
|
-
checkUIProps,
|
10
|
-
checkPreviewProps,
|
11
|
-
checkDesignerProps,
|
12
|
-
checkGenerateProps,
|
13
|
-
validateBarcodeInput,
|
14
|
-
} from '@pdfme/common';
|
15
|
-
import type {
|
16
|
-
Lang,
|
17
|
-
Size,
|
18
|
-
Alignment,
|
19
|
-
SchemaType,
|
20
|
-
BarCodeType,
|
21
|
-
TextSchema,
|
22
|
-
ImageSchema,
|
23
|
-
BarcodeSchema,
|
24
|
-
Schema,
|
25
|
-
SchemaForUI,
|
26
|
-
Font,
|
27
|
-
BasePdf,
|
28
|
-
Template,
|
29
|
-
CommonProps,
|
30
|
-
GeneratorOptions,
|
31
|
-
GenerateProps,
|
32
|
-
UIOptions,
|
33
|
-
UIProps,
|
34
|
-
PreviewProps,
|
35
|
-
DesignerProps,
|
36
|
-
} from '@pdfme/common';
|
37
2
|
|
38
|
-
export {
|
39
|
-
generate,
|
40
|
-
BLANK_PDF,
|
41
|
-
DEFAULT_FONT_VALUE,
|
42
|
-
isTextSchema,
|
43
|
-
isImageSchema,
|
44
|
-
isBarcodeSchema,
|
45
|
-
checkTemplate,
|
46
|
-
checkUIProps,
|
47
|
-
checkPreviewProps,
|
48
|
-
checkDesignerProps,
|
49
|
-
checkGenerateProps,
|
50
|
-
validateBarcodeInput,
|
51
|
-
};
|
52
|
-
export type {
|
53
|
-
Lang,
|
54
|
-
Size,
|
55
|
-
Alignment,
|
56
|
-
SchemaType,
|
57
|
-
BarCodeType,
|
58
|
-
TextSchema,
|
59
|
-
ImageSchema,
|
60
|
-
BarcodeSchema,
|
61
|
-
Schema,
|
62
|
-
SchemaForUI,
|
63
|
-
Font,
|
64
|
-
BasePdf,
|
65
|
-
Template,
|
66
|
-
CommonProps,
|
67
|
-
GeneratorOptions,
|
68
|
-
GenerateProps,
|
69
|
-
UIOptions,
|
70
|
-
UIProps,
|
71
|
-
PreviewProps,
|
72
|
-
DesignerProps,
|
73
|
-
};
|
3
|
+
export { generate };
|
package/src/pdfUtils.ts
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
import { PDFPage, PDFDocument, PDFEmbeddedPage, TransformationMatrix } from '@pdfme/pdf-lib';
|
2
|
+
import { getB64BasePdf, BasePdf } from '@pdfme/common';
|
3
|
+
import type { EmbedPdfBox } from './types';
|
4
|
+
|
5
|
+
export const getEmbeddedPagesAndEmbedPdfBoxes = async (arg: {
|
6
|
+
pdfDoc: PDFDocument;
|
7
|
+
basePdf: BasePdf;
|
8
|
+
}) => {
|
9
|
+
const { pdfDoc, basePdf } = arg;
|
10
|
+
let embeddedPages: PDFEmbeddedPage[] = [];
|
11
|
+
let embedPdfBoxes: EmbedPdfBox[] = [];
|
12
|
+
const willLoadPdf = typeof basePdf === 'string' ? await getB64BasePdf(basePdf) : basePdf;
|
13
|
+
const embedPdf = await PDFDocument.load(willLoadPdf);
|
14
|
+
const embedPdfPages = embedPdf.getPages();
|
15
|
+
|
16
|
+
embedPdfBoxes = embedPdfPages.map((p) => ({
|
17
|
+
mediaBox: p.getMediaBox(),
|
18
|
+
bleedBox: p.getBleedBox(),
|
19
|
+
trimBox: p.getTrimBox(),
|
20
|
+
}));
|
21
|
+
|
22
|
+
const boundingBoxes = embedPdfPages.map((p) => {
|
23
|
+
const { x, y, width, height } = p.getMediaBox();
|
24
|
+
|
25
|
+
return { left: x, bottom: y, right: width, top: height + y };
|
26
|
+
});
|
27
|
+
|
28
|
+
const transformationMatrices = embedPdfPages.map(
|
29
|
+
() => [1, 0, 0, 1, 0, 0] as TransformationMatrix
|
30
|
+
);
|
31
|
+
|
32
|
+
embeddedPages = await pdfDoc.embedPages(embedPdfPages, boundingBoxes, transformationMatrices);
|
33
|
+
|
34
|
+
return { embeddedPages, embedPdfBoxes };
|
35
|
+
};
|
36
|
+
|
37
|
+
export const drawEmbeddedPage = (arg: {
|
38
|
+
page: PDFPage;
|
39
|
+
embeddedPage: PDFEmbeddedPage;
|
40
|
+
embedPdfBox: EmbedPdfBox;
|
41
|
+
}) => {
|
42
|
+
const { page, embeddedPage, embedPdfBox } = arg;
|
43
|
+
page.drawPage(embeddedPage);
|
44
|
+
const { mediaBox: mb, bleedBox: bb, trimBox: tb } = embedPdfBox;
|
45
|
+
page.setMediaBox(mb.x, mb.y, mb.width, mb.height);
|
46
|
+
page.setBleedBox(bb.x, bb.y, bb.width, bb.height);
|
47
|
+
page.setTrimBox(tb.x, tb.y, tb.width, tb.height);
|
48
|
+
};
|
package/src/types.ts
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
import type { Schema, PDFRenderProps } from '@pdfme/common';
|
2
|
+
|
3
|
+
export type PDFRender = (arg: PDFRenderProps<Schema>) => Promise<void>;
|
4
|
+
|
5
|
+
export interface PDFRenderer {
|
6
|
+
[key: string]: PDFRender | undefined;
|
7
|
+
}
|
8
|
+
|
9
|
+
export type EmbedPdfBox = {
|
10
|
+
mediaBox: { x: number; y: number; width: number; height: number };
|
11
|
+
bleedBox: { x: number; y: number; width: number; height: number };
|
12
|
+
trimBox: { x: number; y: number; width: number; height: number };
|
13
|
+
};
|
package/tsconfig.cjs.json
CHANGED
package/tsconfig.esm.json
CHANGED
package/tsconfig.json
CHANGED
@@ -1,53 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
|
-
});
|
10
|
-
};
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
|
-
};
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
-
const helper_1 = require("../src/helper");
|
16
|
-
const jsqr_1 = __importDefault(require("jsqr"));
|
17
|
-
const pngjs_1 = require("pngjs");
|
18
|
-
/**
|
19
|
-
* 生成したQRコード(png)画像から入力データが正常に読み取れるかをテスト
|
20
|
-
*/
|
21
|
-
describe('createBarCode', () => {
|
22
|
-
describe('qrcode', () => {
|
23
|
-
// テスト名, input, expected
|
24
|
-
const tests = [
|
25
|
-
['URL', 'https://www.google.com/', 'https://www.google.com/'],
|
26
|
-
['ひらがな', 'てすとです', 'てすとです'],
|
27
|
-
['ひらがな2', 'あいうえおあいうえお2', 'あいうえおあいうえお2'],
|
28
|
-
['カタカナ', 'テストです', 'テストです'],
|
29
|
-
['漢字', 'お正月', 'お正月'],
|
30
|
-
['中国語', '新年快乐', '新年快乐'],
|
31
|
-
['タイ語', 'สวัสดีปีใหม่', 'สวัสดีปีใหม่'],
|
32
|
-
];
|
33
|
-
for (const t of tests) {
|
34
|
-
// eslint-disable-next-line no-loop-func
|
35
|
-
test(`${t[0]}: ${t[1]}`, () => __awaiter(void 0, void 0, void 0, function* () {
|
36
|
-
const buffer = (yield (0, helper_1.createBarCode)({
|
37
|
-
type: 'qrcode',
|
38
|
-
input: t[1],
|
39
|
-
width: 10,
|
40
|
-
height: 10,
|
41
|
-
backgroundColor: '00000000', // 背景色を指定しないとjsQRでうまく解析できない
|
42
|
-
}));
|
43
|
-
const png = pngjs_1.PNG.sync.read(buffer);
|
44
|
-
const pngData = new Uint8ClampedArray(png.data);
|
45
|
-
const qr = (0, jsqr_1.default)(pngData, png.width, png.height);
|
46
|
-
expect(qr).not.toBeNull();
|
47
|
-
const dataBuffer = Buffer.from(qr.binaryData);
|
48
|
-
expect(dataBuffer.toString('utf8')).toEqual(t[2]);
|
49
|
-
}));
|
50
|
-
}
|
51
|
-
});
|
52
|
-
});
|
53
|
-
//# sourceMappingURL=helper.test.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"helper.test.js","sourceRoot":"","sources":["../../../__tests__/helper.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,0CAA8C;AAC9C,gDAAoC;AACpC,iCAA4B;AAE5B;;GAEG;AACH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,wBAAwB;QACxB,MAAM,KAAK,GAAG;YACZ,CAAC,KAAK,EAAE,yBAAyB,EAAE,yBAAyB,CAAC;YAC7D,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;YAC1B,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,CAAC;YACvC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;YAC1B,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;YACpB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;YACvB,CAAC,KAAK,EAAE,cAAc,EAAE,cAAc,CAAC;SACxC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;YACrB,wCAAwC;YACxC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAS,EAAE;gBAClC,MAAM,MAAM,GAAG,CAAC,MAAM,IAAA,sBAAa,EAAC;oBAClC,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;oBACX,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAE;oBACV,eAAe,EAAE,UAAU,EAAE,2BAA2B;iBACzD,CAAC,CAAW,CAAC;gBACd,MAAM,GAAG,GAAG,WAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAChD,MAAM,EAAE,GAAG,IAAA,cAAI,EAAC,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAW,CAAC;gBAC1D,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;gBAC9C,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,CAAC,CAAA,CAAC,CAAC;SACJ;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|