@f-o-t/pdf 0.1.0
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 +39 -0
- package/dist/generation/index.d.ts +268 -0
- package/dist/generation/index.js +26 -0
- package/dist/index.d.ts +808 -0
- package/dist/index.js +111 -0
- package/dist/parsing/index.d.ts +234 -0
- package/dist/parsing/index.js +16 -0
- package/dist/shared/chunk-10ftnz45.js +572 -0
- package/dist/shared/chunk-37mjkw9w.js +492 -0
- package/dist/shared/chunk-6dengthp.js +48 -0
- package/package.json +88 -0
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createArray,
|
|
3
|
+
createDictionary,
|
|
4
|
+
createName,
|
|
5
|
+
createRef,
|
|
6
|
+
createStream
|
|
7
|
+
} from "./chunk-6dengthp.js";
|
|
8
|
+
|
|
9
|
+
// src/schemas.ts
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
var PDFRefSchema = z.object({
|
|
12
|
+
objectNumber: z.number().int().positive(),
|
|
13
|
+
generation: z.number().int().nonnegative()
|
|
14
|
+
});
|
|
15
|
+
var PDFNameSchema = z.object({
|
|
16
|
+
type: z.literal("name"),
|
|
17
|
+
value: z.string()
|
|
18
|
+
});
|
|
19
|
+
var PageSizeSchema = z.union([
|
|
20
|
+
z.enum(["A4", "Letter", "Legal", "A3", "A5", "Tabloid"]),
|
|
21
|
+
z.object({
|
|
22
|
+
width: z.number().positive(),
|
|
23
|
+
height: z.number().positive()
|
|
24
|
+
})
|
|
25
|
+
]);
|
|
26
|
+
var RGBColorSchema = z.object({
|
|
27
|
+
type: z.literal("rgb"),
|
|
28
|
+
r: z.number().min(0).max(1),
|
|
29
|
+
g: z.number().min(0).max(1),
|
|
30
|
+
b: z.number().min(0).max(1)
|
|
31
|
+
});
|
|
32
|
+
var CMYKColorSchema = z.object({
|
|
33
|
+
type: z.literal("cmyk"),
|
|
34
|
+
c: z.number().min(0).max(1),
|
|
35
|
+
m: z.number().min(0).max(1),
|
|
36
|
+
y: z.number().min(0).max(1),
|
|
37
|
+
k: z.number().min(0).max(1)
|
|
38
|
+
});
|
|
39
|
+
var GrayColorSchema = z.object({
|
|
40
|
+
type: z.literal("gray"),
|
|
41
|
+
gray: z.number().min(0).max(1)
|
|
42
|
+
});
|
|
43
|
+
var PDFColorSchema = z.union([
|
|
44
|
+
RGBColorSchema,
|
|
45
|
+
CMYKColorSchema,
|
|
46
|
+
GrayColorSchema
|
|
47
|
+
]);
|
|
48
|
+
var TextOptionsSchema = z.object({
|
|
49
|
+
x: z.number(),
|
|
50
|
+
y: z.number(),
|
|
51
|
+
size: z.number().positive().optional(),
|
|
52
|
+
font: z.string().optional(),
|
|
53
|
+
color: PDFColorSchema.optional(),
|
|
54
|
+
align: z.enum(["left", "center", "right"]).optional()
|
|
55
|
+
});
|
|
56
|
+
var RectOptionsSchema = z.object({
|
|
57
|
+
x: z.number(),
|
|
58
|
+
y: z.number(),
|
|
59
|
+
width: z.number().positive(),
|
|
60
|
+
height: z.number().positive(),
|
|
61
|
+
fill: PDFColorSchema.optional(),
|
|
62
|
+
stroke: PDFColorSchema.optional(),
|
|
63
|
+
lineWidth: z.number().positive().optional()
|
|
64
|
+
});
|
|
65
|
+
var LineOptionsSchema = z.object({
|
|
66
|
+
x1: z.number(),
|
|
67
|
+
y1: z.number(),
|
|
68
|
+
x2: z.number(),
|
|
69
|
+
y2: z.number(),
|
|
70
|
+
color: PDFColorSchema.optional(),
|
|
71
|
+
lineWidth: z.number().positive().optional()
|
|
72
|
+
});
|
|
73
|
+
var PDFMetadataSchema = z.object({
|
|
74
|
+
title: z.string().optional(),
|
|
75
|
+
author: z.string().optional(),
|
|
76
|
+
subject: z.string().optional(),
|
|
77
|
+
keywords: z.array(z.string()).optional(),
|
|
78
|
+
creator: z.string().optional(),
|
|
79
|
+
producer: z.string().optional(),
|
|
80
|
+
creationDate: z.date().optional(),
|
|
81
|
+
modificationDate: z.date().optional()
|
|
82
|
+
});
|
|
83
|
+
var PDFDictionarySchema = z.lazy(() => z.record(z.string(), PDFValueSchema));
|
|
84
|
+
var PDFArraySchema = z.lazy(() => z.array(PDFValueSchema));
|
|
85
|
+
var PDFStreamSchema = z.object({
|
|
86
|
+
dictionary: PDFDictionarySchema,
|
|
87
|
+
data: z.instanceof(Uint8Array)
|
|
88
|
+
});
|
|
89
|
+
var PDFValueSchema = z.lazy(() => z.union([
|
|
90
|
+
z.boolean(),
|
|
91
|
+
z.number(),
|
|
92
|
+
z.string(),
|
|
93
|
+
PDFNameSchema,
|
|
94
|
+
PDFArraySchema,
|
|
95
|
+
PDFDictionarySchema,
|
|
96
|
+
PDFStreamSchema,
|
|
97
|
+
z.null(),
|
|
98
|
+
PDFRefSchema
|
|
99
|
+
]));
|
|
100
|
+
var PDFIndirectObjectSchema = z.object({
|
|
101
|
+
ref: PDFRefSchema,
|
|
102
|
+
value: PDFValueSchema
|
|
103
|
+
});
|
|
104
|
+
var PDFObjectTypeSchema = z.enum([
|
|
105
|
+
"boolean",
|
|
106
|
+
"number",
|
|
107
|
+
"string",
|
|
108
|
+
"name",
|
|
109
|
+
"array",
|
|
110
|
+
"dictionary",
|
|
111
|
+
"stream",
|
|
112
|
+
"null",
|
|
113
|
+
"indirect"
|
|
114
|
+
]);
|
|
115
|
+
var PDFVersionSchema = z.enum(["1.4", "1.5", "1.6", "1.7"]);
|
|
116
|
+
|
|
117
|
+
// src/generation/fonts.ts
|
|
118
|
+
var STANDARD_FONTS = {
|
|
119
|
+
"Times-Roman": "Times-Roman",
|
|
120
|
+
"Times-Bold": "Times-Bold",
|
|
121
|
+
"Times-Italic": "Times-Italic",
|
|
122
|
+
"Times-BoldItalic": "Times-BoldItalic",
|
|
123
|
+
Helvetica: "Helvetica",
|
|
124
|
+
"Helvetica-Bold": "Helvetica-Bold",
|
|
125
|
+
"Helvetica-Oblique": "Helvetica-Oblique",
|
|
126
|
+
"Helvetica-BoldOblique": "Helvetica-BoldOblique",
|
|
127
|
+
Courier: "Courier",
|
|
128
|
+
"Courier-Bold": "Courier-Bold",
|
|
129
|
+
"Courier-Oblique": "Courier-Oblique",
|
|
130
|
+
"Courier-BoldOblique": "Courier-BoldOblique",
|
|
131
|
+
Symbol: "Symbol",
|
|
132
|
+
ZapfDingbats: "ZapfDingbats"
|
|
133
|
+
};
|
|
134
|
+
var FONT_FAMILIES = {
|
|
135
|
+
times: {
|
|
136
|
+
regular: "Times-Roman",
|
|
137
|
+
bold: "Times-Bold",
|
|
138
|
+
italic: "Times-Italic",
|
|
139
|
+
boldItalic: "Times-BoldItalic"
|
|
140
|
+
},
|
|
141
|
+
helvetica: {
|
|
142
|
+
regular: "Helvetica",
|
|
143
|
+
bold: "Helvetica-Bold",
|
|
144
|
+
oblique: "Helvetica-Oblique",
|
|
145
|
+
boldOblique: "Helvetica-BoldOblique"
|
|
146
|
+
},
|
|
147
|
+
courier: {
|
|
148
|
+
regular: "Courier",
|
|
149
|
+
bold: "Courier-Bold",
|
|
150
|
+
oblique: "Courier-Oblique",
|
|
151
|
+
boldOblique: "Courier-BoldOblique"
|
|
152
|
+
},
|
|
153
|
+
symbol: {
|
|
154
|
+
regular: "Symbol"
|
|
155
|
+
},
|
|
156
|
+
zapfDingbats: {
|
|
157
|
+
regular: "ZapfDingbats"
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
function isStandardFont(font) {
|
|
161
|
+
return font in STANDARD_FONTS;
|
|
162
|
+
}
|
|
163
|
+
function getFontRefName(font) {
|
|
164
|
+
return `F${Object.keys(STANDARD_FONTS).indexOf(font) + 1}`;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// src/generation/page.ts
|
|
168
|
+
var PAGE_SIZES = {
|
|
169
|
+
A4: { width: 595, height: 842 },
|
|
170
|
+
Letter: { width: 612, height: 792 },
|
|
171
|
+
Legal: { width: 612, height: 1008 },
|
|
172
|
+
A3: { width: 842, height: 1191 },
|
|
173
|
+
A5: { width: 420, height: 595 },
|
|
174
|
+
Tabloid: { width: 792, height: 1224 }
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
class PDFPage {
|
|
178
|
+
ref;
|
|
179
|
+
size;
|
|
180
|
+
parent;
|
|
181
|
+
contentStream = [];
|
|
182
|
+
resources;
|
|
183
|
+
constructor(ref, options = {}) {
|
|
184
|
+
this.ref = ref;
|
|
185
|
+
this.size = PageSizeSchema.parse(options.size ?? "A4");
|
|
186
|
+
this.parent = options.parent;
|
|
187
|
+
this.resources = createDictionary({
|
|
188
|
+
Font: createDictionary()
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
getDimensions() {
|
|
192
|
+
if (typeof this.size === "string") {
|
|
193
|
+
return PAGE_SIZES[this.size];
|
|
194
|
+
}
|
|
195
|
+
return this.size;
|
|
196
|
+
}
|
|
197
|
+
setFillColor(color) {
|
|
198
|
+
if (color.type === "rgb") {
|
|
199
|
+
this.contentStream.push(`${color.r} ${color.g} ${color.b} rg`);
|
|
200
|
+
} else if (color.type === "cmyk") {
|
|
201
|
+
this.contentStream.push(`${color.c} ${color.m} ${color.y} ${color.k} k`);
|
|
202
|
+
} else if (color.type === "gray") {
|
|
203
|
+
this.contentStream.push(`${color.gray} g`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
setStrokeColor(color) {
|
|
207
|
+
if (color.type === "rgb") {
|
|
208
|
+
this.contentStream.push(`${color.r} ${color.g} ${color.b} RG`);
|
|
209
|
+
} else if (color.type === "cmyk") {
|
|
210
|
+
this.contentStream.push(`${color.c} ${color.m} ${color.y} ${color.k} K`);
|
|
211
|
+
} else if (color.type === "gray") {
|
|
212
|
+
this.contentStream.push(`${color.gray} G`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
drawText(text, options) {
|
|
216
|
+
const validOptions = TextOptionsSchema.parse(options);
|
|
217
|
+
const { x, y, size = 12, font = "Helvetica", color, align = "left" } = validOptions;
|
|
218
|
+
const fontName = font || "Helvetica";
|
|
219
|
+
if (!isStandardFont(fontName)) {
|
|
220
|
+
throw new Error(`Font "${fontName}" is not a standard PDF font. Use one of: ${Object.keys(STANDARD_FONTS).join(", ")}`);
|
|
221
|
+
}
|
|
222
|
+
const fontRefName = getFontRefName(fontName);
|
|
223
|
+
const fontDict = this.resources.Font;
|
|
224
|
+
if (!fontDict[fontRefName]) {
|
|
225
|
+
const fontObj = createDictionary({
|
|
226
|
+
Type: createName("Font"),
|
|
227
|
+
Subtype: createName("Type1"),
|
|
228
|
+
BaseFont: createName(fontName)
|
|
229
|
+
});
|
|
230
|
+
fontDict[fontRefName] = fontObj;
|
|
231
|
+
}
|
|
232
|
+
let xPos = x;
|
|
233
|
+
if (align === "center") {
|
|
234
|
+
xPos = x - text.length * size * 0.3;
|
|
235
|
+
} else if (align === "right") {
|
|
236
|
+
xPos = x - text.length * size * 0.6;
|
|
237
|
+
}
|
|
238
|
+
if (color) {
|
|
239
|
+
this.setFillColor(color);
|
|
240
|
+
}
|
|
241
|
+
this.contentStream.push("BT");
|
|
242
|
+
this.contentStream.push(`/${fontRefName} ${size} Tf`);
|
|
243
|
+
this.contentStream.push(`${xPos} ${y} Td`);
|
|
244
|
+
const escapedText = text.replace(/\\/g, "\\\\").replace(/\(/g, "\\(").replace(/\)/g, "\\)");
|
|
245
|
+
this.contentStream.push(`(${escapedText}) Tj`);
|
|
246
|
+
this.contentStream.push("ET");
|
|
247
|
+
}
|
|
248
|
+
drawRectangle(options) {
|
|
249
|
+
const validOptions = RectOptionsSchema.parse(options);
|
|
250
|
+
const { x, y, width, height, fill, stroke, lineWidth = 1 } = validOptions;
|
|
251
|
+
if (lineWidth && stroke) {
|
|
252
|
+
this.contentStream.push(`${lineWidth} w`);
|
|
253
|
+
}
|
|
254
|
+
if (fill) {
|
|
255
|
+
this.setFillColor(fill);
|
|
256
|
+
}
|
|
257
|
+
if (stroke) {
|
|
258
|
+
this.setStrokeColor(stroke);
|
|
259
|
+
}
|
|
260
|
+
this.contentStream.push(`${x} ${y} ${width} ${height} re`);
|
|
261
|
+
if (fill && stroke) {
|
|
262
|
+
this.contentStream.push("B");
|
|
263
|
+
} else if (fill) {
|
|
264
|
+
this.contentStream.push("f");
|
|
265
|
+
} else if (stroke) {
|
|
266
|
+
this.contentStream.push("S");
|
|
267
|
+
} else {
|
|
268
|
+
this.contentStream.push("S");
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
drawLine(options) {
|
|
272
|
+
const validOptions = LineOptionsSchema.parse(options);
|
|
273
|
+
const { x1, y1, x2, y2, color, lineWidth = 1 } = validOptions;
|
|
274
|
+
if (lineWidth) {
|
|
275
|
+
this.contentStream.push(`${lineWidth} w`);
|
|
276
|
+
}
|
|
277
|
+
if (color) {
|
|
278
|
+
this.setStrokeColor(color);
|
|
279
|
+
}
|
|
280
|
+
this.contentStream.push(`${x1} ${y1} m`);
|
|
281
|
+
this.contentStream.push(`${x2} ${y2} l`);
|
|
282
|
+
this.contentStream.push("S");
|
|
283
|
+
}
|
|
284
|
+
getContentStreamRef() {
|
|
285
|
+
return createRef(this.ref.objectNumber + 1, 0);
|
|
286
|
+
}
|
|
287
|
+
toContentStream() {
|
|
288
|
+
const content = this.contentStream.join(`
|
|
289
|
+
`);
|
|
290
|
+
const data = new TextEncoder().encode(content);
|
|
291
|
+
const dict = createDictionary({
|
|
292
|
+
Length: data.length
|
|
293
|
+
});
|
|
294
|
+
return createStream(data, dict);
|
|
295
|
+
}
|
|
296
|
+
toDictionary() {
|
|
297
|
+
const dims = this.getDimensions();
|
|
298
|
+
const dict = createDictionary({
|
|
299
|
+
Type: createName("Page"),
|
|
300
|
+
MediaBox: createArray([0, 0, dims.width, dims.height]),
|
|
301
|
+
Contents: this.getContentStreamRef(),
|
|
302
|
+
Resources: this.resources
|
|
303
|
+
});
|
|
304
|
+
if (this.parent) {
|
|
305
|
+
dict.Parent = this.parent;
|
|
306
|
+
}
|
|
307
|
+
return dict;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// src/generation/writer.ts
|
|
312
|
+
function serializeValue(value) {
|
|
313
|
+
if (value === null) {
|
|
314
|
+
return "null";
|
|
315
|
+
}
|
|
316
|
+
if (typeof value === "boolean") {
|
|
317
|
+
return value ? "true" : "false";
|
|
318
|
+
}
|
|
319
|
+
if (typeof value === "number") {
|
|
320
|
+
return value.toString();
|
|
321
|
+
}
|
|
322
|
+
if (typeof value === "string") {
|
|
323
|
+
const escaped = value.replace(/\\/g, "\\\\").replace(/\(/g, "\\(").replace(/\)/g, "\\)");
|
|
324
|
+
return `(${escaped})`;
|
|
325
|
+
}
|
|
326
|
+
if (isName(value)) {
|
|
327
|
+
return `/${value.value}`;
|
|
328
|
+
}
|
|
329
|
+
if (isRef(value)) {
|
|
330
|
+
return `${value.objectNumber} ${value.generation} R`;
|
|
331
|
+
}
|
|
332
|
+
if (Array.isArray(value)) {
|
|
333
|
+
return `[${value.map(serializeValue).join(" ")}]`;
|
|
334
|
+
}
|
|
335
|
+
if (typeof value === "object" && !Array.isArray(value)) {
|
|
336
|
+
const dict = value;
|
|
337
|
+
const entries = Object.entries(dict).map(([key, val]) => `/${key} ${serializeValue(val)}`).join(`
|
|
338
|
+
`);
|
|
339
|
+
return `<<
|
|
340
|
+
${entries}
|
|
341
|
+
>>`;
|
|
342
|
+
}
|
|
343
|
+
return "";
|
|
344
|
+
}
|
|
345
|
+
function serializeStream(stream) {
|
|
346
|
+
const dictStr = serializeValue(stream.dictionary);
|
|
347
|
+
const header = new TextEncoder().encode(`${dictStr}
|
|
348
|
+
stream
|
|
349
|
+
`);
|
|
350
|
+
const footer = new TextEncoder().encode(`
|
|
351
|
+
endstream`);
|
|
352
|
+
const result = new Uint8Array(header.length + stream.data.length + footer.length);
|
|
353
|
+
result.set(header, 0);
|
|
354
|
+
result.set(stream.data, header.length);
|
|
355
|
+
result.set(footer, header.length + stream.data.length);
|
|
356
|
+
return result;
|
|
357
|
+
}
|
|
358
|
+
function serializeObject(objectNumber, generation, value) {
|
|
359
|
+
const header = `${objectNumber} ${generation} obj
|
|
360
|
+
`;
|
|
361
|
+
let body;
|
|
362
|
+
if (isStream(value)) {
|
|
363
|
+
body = serializeStream(value);
|
|
364
|
+
} else {
|
|
365
|
+
body = new TextEncoder().encode(serializeValue(value));
|
|
366
|
+
}
|
|
367
|
+
const footer = new TextEncoder().encode(`
|
|
368
|
+
endobj
|
|
369
|
+
`);
|
|
370
|
+
const result = new Uint8Array(header.length + body.length + footer.length);
|
|
371
|
+
result.set(new TextEncoder().encode(header), 0);
|
|
372
|
+
result.set(body, header.length);
|
|
373
|
+
result.set(footer, header.length + body.length);
|
|
374
|
+
return result;
|
|
375
|
+
}
|
|
376
|
+
function isName(value) {
|
|
377
|
+
return typeof value === "object" && value !== null && value.type === "name";
|
|
378
|
+
}
|
|
379
|
+
function isRef(value) {
|
|
380
|
+
return typeof value === "object" && value !== null && "objectNumber" in value && "generation" in value;
|
|
381
|
+
}
|
|
382
|
+
function isStream(value) {
|
|
383
|
+
return typeof value === "object" && value !== null && "data" in value && value.data instanceof Uint8Array;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// src/generation/document.ts
|
|
387
|
+
class PDFDocument {
|
|
388
|
+
version;
|
|
389
|
+
metadata;
|
|
390
|
+
objects = new Map;
|
|
391
|
+
nextObjectNumber = 1;
|
|
392
|
+
catalog;
|
|
393
|
+
pages;
|
|
394
|
+
pagesArray = [];
|
|
395
|
+
constructor(options = {}) {
|
|
396
|
+
this.version = PDFVersionSchema.parse(options.version ?? "1.7");
|
|
397
|
+
this.metadata = PDFMetadataSchema.parse(options.metadata ?? {});
|
|
398
|
+
this.catalog = this.allocateRef();
|
|
399
|
+
this.pages = this.allocateRef();
|
|
400
|
+
const catalogDict = createDictionary({
|
|
401
|
+
Type: createName("Catalog"),
|
|
402
|
+
Pages: this.pages
|
|
403
|
+
});
|
|
404
|
+
this.objects.set(this.catalog.objectNumber, catalogDict);
|
|
405
|
+
const pagesDict = createDictionary({
|
|
406
|
+
Type: createName("Pages"),
|
|
407
|
+
Kids: createArray([]),
|
|
408
|
+
Count: 0
|
|
409
|
+
});
|
|
410
|
+
this.objects.set(this.pages.objectNumber, pagesDict);
|
|
411
|
+
if (Object.keys(this.metadata).length > 0) {
|
|
412
|
+
const infoRef = this.allocateRef();
|
|
413
|
+
const infoDict = createDictionary({ ...this.metadata });
|
|
414
|
+
this.objects.set(infoRef.objectNumber, infoDict);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
allocateRef() {
|
|
418
|
+
return createRef(this.nextObjectNumber++, 0);
|
|
419
|
+
}
|
|
420
|
+
addPage(options) {
|
|
421
|
+
const pageRef = this.allocateRef();
|
|
422
|
+
const contentStreamRef = this.allocateRef();
|
|
423
|
+
const page = new PDFPage(pageRef, { ...options, parent: this.pages });
|
|
424
|
+
this.pagesArray.push(page);
|
|
425
|
+
const pagesDict = this.objects.get(this.pages.objectNumber);
|
|
426
|
+
const kids = pagesDict.Kids;
|
|
427
|
+
kids.push(pageRef);
|
|
428
|
+
pagesDict.Count = pagesDict.Count + 1;
|
|
429
|
+
this.objects.set(pageRef.objectNumber, page.toDictionary());
|
|
430
|
+
this.objects.set(contentStreamRef.objectNumber, page.toContentStream());
|
|
431
|
+
return page;
|
|
432
|
+
}
|
|
433
|
+
save() {
|
|
434
|
+
for (const page of this.pagesArray) {
|
|
435
|
+
this.objects.set(page.ref.objectNumber, page.toDictionary());
|
|
436
|
+
const contentStreamRef = page.getContentStreamRef();
|
|
437
|
+
this.objects.set(contentStreamRef.objectNumber, page.toContentStream());
|
|
438
|
+
}
|
|
439
|
+
const parts = [];
|
|
440
|
+
const header = new TextEncoder().encode(`%PDF-${this.version}
|
|
441
|
+
%âãÏÓ
|
|
442
|
+
`);
|
|
443
|
+
parts.push(header);
|
|
444
|
+
const offsets = [0];
|
|
445
|
+
let currentOffset = header.length;
|
|
446
|
+
const objectNumbers = Array.from(this.objects.keys()).sort((a, b) => a - b);
|
|
447
|
+
for (const objNum of objectNumbers) {
|
|
448
|
+
const obj = this.objects.get(objNum);
|
|
449
|
+
const objBytes = serializeObject(objNum, 0, obj);
|
|
450
|
+
parts.push(objBytes);
|
|
451
|
+
offsets[objNum] = currentOffset;
|
|
452
|
+
currentOffset += objBytes.length;
|
|
453
|
+
}
|
|
454
|
+
const xrefStart = currentOffset;
|
|
455
|
+
const xrefLines = [`xref
|
|
456
|
+
0 ${offsets.length}
|
|
457
|
+
`];
|
|
458
|
+
xrefLines.push(`0000000000 65535 f
|
|
459
|
+
`);
|
|
460
|
+
for (let i = 1;i < offsets.length; i++) {
|
|
461
|
+
const offset = offsets[i] || 0;
|
|
462
|
+
const offsetStr = offset.toString().padStart(10, "0");
|
|
463
|
+
xrefLines.push(`${offsetStr} 00000 n
|
|
464
|
+
`);
|
|
465
|
+
}
|
|
466
|
+
const xref = new TextEncoder().encode(xrefLines.join(""));
|
|
467
|
+
parts.push(xref);
|
|
468
|
+
const trailerDict = serializeValue(createDictionary({
|
|
469
|
+
Size: offsets.length,
|
|
470
|
+
Root: this.catalog
|
|
471
|
+
}));
|
|
472
|
+
const trailer = new TextEncoder().encode(`trailer
|
|
473
|
+
${trailerDict}
|
|
474
|
+
startxref
|
|
475
|
+
${xrefStart}
|
|
476
|
+
%%EOF
|
|
477
|
+
`);
|
|
478
|
+
parts.push(trailer);
|
|
479
|
+
const totalLength = parts.reduce((sum, part) => sum + part.length, 0);
|
|
480
|
+
const result = new Uint8Array(totalLength);
|
|
481
|
+
let position = 0;
|
|
482
|
+
for (const part of parts) {
|
|
483
|
+
result.set(part, position);
|
|
484
|
+
position += part.length;
|
|
485
|
+
}
|
|
486
|
+
return result;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
export { PDFRefSchema, PDFNameSchema, PageSizeSchema, RGBColorSchema, CMYKColorSchema, GrayColorSchema, PDFColorSchema, TextOptionsSchema, RectOptionsSchema, LineOptionsSchema, PDFMetadataSchema, PDFDictionarySchema, PDFArraySchema, PDFStreamSchema, PDFValueSchema, PDFIndirectObjectSchema, PDFObjectTypeSchema, PDFVersionSchema, STANDARD_FONTS, FONT_FAMILIES, isStandardFont, getFontRefName, PDFPage, serializeValue, serializeStream, serializeObject, PDFDocument };
|
|
490
|
+
|
|
491
|
+
//# debugId=D1F9D9F23EC0B1AD64756E2164756E21
|
|
492
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3NjaGVtYXMudHMiLCAic3JjL2dlbmVyYXRpb24vZm9udHMudHMiLCAic3JjL2dlbmVyYXRpb24vcGFnZS50cyIsICJzcmMvZ2VuZXJhdGlvbi93cml0ZXIudHMiLCAic3JjL2dlbmVyYXRpb24vZG9jdW1lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLyoqXG4gKiBQREYgUmVmZXJlbmNlIHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgUERGUmVmU2NoZW1hID0gei5vYmplY3Qoe1xuICAgb2JqZWN0TnVtYmVyOiB6Lm51bWJlcigpLmludCgpLnBvc2l0aXZlKCksXG4gICBnZW5lcmF0aW9uOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG59KTtcblxuLyoqXG4gKiBQREYgTmFtZSBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFBERk5hbWVTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICB0eXBlOiB6LmxpdGVyYWwoXCJuYW1lXCIpLFxuICAgdmFsdWU6IHouc3RyaW5nKCksXG59KTtcblxuLyoqXG4gKiBQYWdlIHNpemUgc2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBQYWdlU2l6ZVNjaGVtYSA9IHoudW5pb24oW1xuICAgei5lbnVtKFtcIkE0XCIsIFwiTGV0dGVyXCIsIFwiTGVnYWxcIiwgXCJBM1wiLCBcIkE1XCIsIFwiVGFibG9pZFwiXSksXG4gICB6Lm9iamVjdCh7XG4gICAgICB3aWR0aDogei5udW1iZXIoKS5wb3NpdGl2ZSgpLFxuICAgICAgaGVpZ2h0OiB6Lm51bWJlcigpLnBvc2l0aXZlKCksXG4gICB9KSxcbl0pO1xuXG4vKipcbiAqIFJHQiBjb2xvciBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFJHQkNvbG9yU2NoZW1hID0gei5vYmplY3Qoe1xuICAgdHlwZTogei5saXRlcmFsKFwicmdiXCIpLFxuICAgcjogei5udW1iZXIoKS5taW4oMCkubWF4KDEpLFxuICAgZzogei5udW1iZXIoKS5taW4oMCkubWF4KDEpLFxuICAgYjogei5udW1iZXIoKS5taW4oMCkubWF4KDEpLFxufSk7XG5cbi8qKlxuICogQ01ZSyBjb2xvciBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IENNWUtDb2xvclNjaGVtYSA9IHoub2JqZWN0KHtcbiAgIHR5cGU6IHoubGl0ZXJhbChcImNteWtcIiksXG4gICBjOiB6Lm51bWJlcigpLm1pbigwKS5tYXgoMSksXG4gICBtOiB6Lm51bWJlcigpLm1pbigwKS5tYXgoMSksXG4gICB5OiB6Lm51bWJlcigpLm1pbigwKS5tYXgoMSksXG4gICBrOiB6Lm51bWJlcigpLm1pbigwKS5tYXgoMSksXG59KTtcblxuLyoqXG4gKiBHcmF5IGNvbG9yIHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgR3JheUNvbG9yU2NoZW1hID0gei5vYmplY3Qoe1xuICAgdHlwZTogei5saXRlcmFsKFwiZ3JheVwiKSxcbiAgIGdyYXk6IHoubnVtYmVyKCkubWluKDApLm1heCgxKSxcbn0pO1xuXG4vKipcbiAqIFBERiBDb2xvciBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFBERkNvbG9yU2NoZW1hID0gei51bmlvbihbXG4gICBSR0JDb2xvclNjaGVtYSxcbiAgIENNWUtDb2xvclNjaGVtYSxcbiAgIEdyYXlDb2xvclNjaGVtYSxcbl0pO1xuXG4vKipcbiAqIFRleHQgb3B0aW9ucyBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFRleHRPcHRpb25zU2NoZW1hID0gei5vYmplY3Qoe1xuICAgeDogei5udW1iZXIoKSxcbiAgIHk6IHoubnVtYmVyKCksXG4gICBzaXplOiB6Lm51bWJlcigpLnBvc2l0aXZlKCkub3B0aW9uYWwoKSxcbiAgIGZvbnQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgIGNvbG9yOiBQREZDb2xvclNjaGVtYS5vcHRpb25hbCgpLFxuICAgYWxpZ246IHouZW51bShbXCJsZWZ0XCIsIFwiY2VudGVyXCIsIFwicmlnaHRcIl0pLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBSZWN0YW5nbGUgb3B0aW9ucyBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFJlY3RPcHRpb25zU2NoZW1hID0gei5vYmplY3Qoe1xuICAgeDogei5udW1iZXIoKSxcbiAgIHk6IHoubnVtYmVyKCksXG4gICB3aWR0aDogei5udW1iZXIoKS5wb3NpdGl2ZSgpLFxuICAgaGVpZ2h0OiB6Lm51bWJlcigpLnBvc2l0aXZlKCksXG4gICBmaWxsOiBQREZDb2xvclNjaGVtYS5vcHRpb25hbCgpLFxuICAgc3Ryb2tlOiBQREZDb2xvclNjaGVtYS5vcHRpb25hbCgpLFxuICAgbGluZVdpZHRoOiB6Lm51bWJlcigpLnBvc2l0aXZlKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIExpbmUgb3B0aW9ucyBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IExpbmVPcHRpb25zU2NoZW1hID0gei5vYmplY3Qoe1xuICAgeDE6IHoubnVtYmVyKCksXG4gICB5MTogei5udW1iZXIoKSxcbiAgIHgyOiB6Lm51bWJlcigpLFxuICAgeTI6IHoubnVtYmVyKCksXG4gICBjb2xvcjogUERGQ29sb3JTY2hlbWEub3B0aW9uYWwoKSxcbiAgIGxpbmVXaWR0aDogei5udW1iZXIoKS5wb3NpdGl2ZSgpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBQREYgbWV0YWRhdGEgc2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBQREZNZXRhZGF0YVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgIHRpdGxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICBhdXRob3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgIHN1YmplY3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgIGtleXdvcmRzOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICBjcmVhdG9yOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICBwcm9kdWNlcjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgY3JlYXRpb25EYXRlOiB6LmRhdGUoKS5vcHRpb25hbCgpLFxuICAgbW9kaWZpY2F0aW9uRGF0ZTogei5kYXRlKCkub3B0aW9uYWwoKSxcbn0pO1xuXG4vKipcbiAqIFBERiBEaWN0aW9uYXJ5IHNjaGVtYSAocmVjdXJzaXZlKVxuICovXG5leHBvcnQgY29uc3QgUERGRGljdGlvbmFyeVNjaGVtYTogei5ab2RUeXBlPFJlY29yZDxzdHJpbmcsIGFueT4+ID0gei5sYXp5KCgpID0+XG4gICB6LnJlY29yZCh6LnN0cmluZygpLCBQREZWYWx1ZVNjaGVtYSksXG4pO1xuXG4vKipcbiAqIFBERiBBcnJheSBzY2hlbWEgKHJlY3Vyc2l2ZSlcbiAqL1xuZXhwb3J0IGNvbnN0IFBERkFycmF5U2NoZW1hOiB6LlpvZFR5cGU8YW55W10+ID0gei5sYXp5KCgpID0+XG4gICB6LmFycmF5KFBERlZhbHVlU2NoZW1hKSxcbik7XG5cbi8qKlxuICogUERGIFN0cmVhbSBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFBERlN0cmVhbVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgIGRpY3Rpb25hcnk6IFBERkRpY3Rpb25hcnlTY2hlbWEsXG4gICBkYXRhOiB6Lmluc3RhbmNlb2YoVWludDhBcnJheSksXG59KTtcblxuLyoqXG4gKiBQREYgVmFsdWUgc2NoZW1hIChyZWN1cnNpdmUgdW5pb24pXG4gKi9cbmV4cG9ydCBjb25zdCBQREZWYWx1ZVNjaGVtYTogei5ab2RUeXBlPGFueT4gPSB6LmxhenkoKCkgPT5cbiAgIHoudW5pb24oW1xuICAgICAgei5ib29sZWFuKCksXG4gICAgICB6Lm51bWJlcigpLFxuICAgICAgei5zdHJpbmcoKSxcbiAgICAgIFBERk5hbWVTY2hlbWEsXG4gICAgICBQREZBcnJheVNjaGVtYSxcbiAgICAgIFBERkRpY3Rpb25hcnlTY2hlbWEsXG4gICAgICBQREZTdHJlYW1TY2hlbWEsXG4gICAgICB6Lm51bGwoKSxcbiAgICAgIFBERlJlZlNjaGVtYSxcbiAgIF0pLFxuKTtcblxuLyoqXG4gKiBQREYgSW5kaXJlY3QgT2JqZWN0IHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgUERGSW5kaXJlY3RPYmplY3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICByZWY6IFBERlJlZlNjaGVtYSxcbiAgIHZhbHVlOiBQREZWYWx1ZVNjaGVtYSxcbn0pO1xuXG4vKipcbiAqIFBERiBPYmplY3QgVHlwZSBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFBERk9iamVjdFR5cGVTY2hlbWEgPSB6LmVudW0oW1xuICAgXCJib29sZWFuXCIsXG4gICBcIm51bWJlclwiLFxuICAgXCJzdHJpbmdcIixcbiAgIFwibmFtZVwiLFxuICAgXCJhcnJheVwiLFxuICAgXCJkaWN0aW9uYXJ5XCIsXG4gICBcInN0cmVhbVwiLFxuICAgXCJudWxsXCIsXG4gICBcImluZGlyZWN0XCIsXG5dKTtcblxuLyoqXG4gKiBQREYgdmVyc2lvbiBzY2hlbWFcbiAqL1xuZXhwb3J0IGNvbnN0IFBERlZlcnNpb25TY2hlbWEgPSB6LmVudW0oW1wiMS40XCIsIFwiMS41XCIsIFwiMS42XCIsIFwiMS43XCJdKTtcbiIsCiAgICAiLyoqXG4gKiBQREYgU3RhbmRhcmQgMTQgRm9udHNcbiAqIFRoZXNlIGZvbnRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGF2YWlsYWJsZSBpbiBhbGwgUERGIHJlYWRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFNUQU5EQVJEX0ZPTlRTID0ge1xuICAgLy8gU2VyaWYgZm9udHNcbiAgIFwiVGltZXMtUm9tYW5cIjogXCJUaW1lcy1Sb21hblwiLFxuICAgXCJUaW1lcy1Cb2xkXCI6IFwiVGltZXMtQm9sZFwiLFxuICAgXCJUaW1lcy1JdGFsaWNcIjogXCJUaW1lcy1JdGFsaWNcIixcbiAgIFwiVGltZXMtQm9sZEl0YWxpY1wiOiBcIlRpbWVzLUJvbGRJdGFsaWNcIixcblxuICAgLy8gU2Fucy1zZXJpZiBmb250c1xuICAgSGVsdmV0aWNhOiBcIkhlbHZldGljYVwiLFxuICAgXCJIZWx2ZXRpY2EtQm9sZFwiOiBcIkhlbHZldGljYS1Cb2xkXCIsXG4gICBcIkhlbHZldGljYS1PYmxpcXVlXCI6IFwiSGVsdmV0aWNhLU9ibGlxdWVcIixcbiAgIFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCI6IFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCIsXG5cbiAgIC8vIE1vbm9zcGFjZSBmb250c1xuICAgQ291cmllcjogXCJDb3VyaWVyXCIsXG4gICBcIkNvdXJpZXItQm9sZFwiOiBcIkNvdXJpZXItQm9sZFwiLFxuICAgXCJDb3VyaWVyLU9ibGlxdWVcIjogXCJDb3VyaWVyLU9ibGlxdWVcIixcbiAgIFwiQ291cmllci1Cb2xkT2JsaXF1ZVwiOiBcIkNvdXJpZXItQm9sZE9ibGlxdWVcIixcblxuICAgLy8gU3ltYm9sIGZvbnRzXG4gICBTeW1ib2w6IFwiU3ltYm9sXCIsXG4gICBaYXBmRGluZ2JhdHM6IFwiWmFwZkRpbmdiYXRzXCIsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTdGFuZGFyZEZvbnQgPSBrZXlvZiB0eXBlb2YgU1RBTkRBUkRfRk9OVFM7XG5cbi8qKlxuICogRm9udCBmYW1pbGllcyBmb3IgY29udmVuaWVuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IEZPTlRfRkFNSUxJRVMgPSB7XG4gICB0aW1lczoge1xuICAgICAgcmVndWxhcjogXCJUaW1lcy1Sb21hblwiIGFzIFN0YW5kYXJkRm9udCxcbiAgICAgIGJvbGQ6IFwiVGltZXMtQm9sZFwiIGFzIFN0YW5kYXJkRm9udCxcbiAgICAgIGl0YWxpYzogXCJUaW1lcy1JdGFsaWNcIiBhcyBTdGFuZGFyZEZvbnQsXG4gICAgICBib2xkSXRhbGljOiBcIlRpbWVzLUJvbGRJdGFsaWNcIiBhcyBTdGFuZGFyZEZvbnQsXG4gICB9LFxuICAgaGVsdmV0aWNhOiB7XG4gICAgICByZWd1bGFyOiBcIkhlbHZldGljYVwiIGFzIFN0YW5kYXJkRm9udCxcbiAgICAgIGJvbGQ6IFwiSGVsdmV0aWNhLUJvbGRcIiBhcyBTdGFuZGFyZEZvbnQsXG4gICAgICBvYmxpcXVlOiBcIkhlbHZldGljYS1PYmxpcXVlXCIgYXMgU3RhbmRhcmRGb250LFxuICAgICAgYm9sZE9ibGlxdWU6IFwiSGVsdmV0aWNhLUJvbGRPYmxpcXVlXCIgYXMgU3RhbmRhcmRGb250LFxuICAgfSxcbiAgIGNvdXJpZXI6IHtcbiAgICAgIHJlZ3VsYXI6IFwiQ291cmllclwiIGFzIFN0YW5kYXJkRm9udCxcbiAgICAgIGJvbGQ6IFwiQ291cmllci1Cb2xkXCIgYXMgU3RhbmRhcmRGb250LFxuICAgICAgb2JsaXF1ZTogXCJDb3VyaWVyLU9ibGlxdWVcIiBhcyBTdGFuZGFyZEZvbnQsXG4gICAgICBib2xkT2JsaXF1ZTogXCJDb3VyaWVyLUJvbGRPYmxpcXVlXCIgYXMgU3RhbmRhcmRGb250LFxuICAgfSxcbiAgIHN5bWJvbDoge1xuICAgICAgcmVndWxhcjogXCJTeW1ib2xcIiBhcyBTdGFuZGFyZEZvbnQsXG4gICB9LFxuICAgemFwZkRpbmdiYXRzOiB7XG4gICAgICByZWd1bGFyOiBcIlphcGZEaW5nYmF0c1wiIGFzIFN0YW5kYXJkRm9udCxcbiAgIH0sXG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGEgZm9udCBpcyBhIHN0YW5kYXJkIFBERiBmb250XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0YW5kYXJkRm9udChmb250OiBzdHJpbmcpOiBmb250IGlzIFN0YW5kYXJkRm9udCB7XG4gICByZXR1cm4gZm9udCBpbiBTVEFOREFSRF9GT05UUztcbn1cblxuLyoqXG4gKiBHZXQgZm9udCBvYmplY3QgcmVmZXJlbmNlIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvbnRSZWZOYW1lKGZvbnQ6IFN0YW5kYXJkRm9udCk6IHN0cmluZyB7XG4gICByZXR1cm4gYEYke09iamVjdC5rZXlzKFNUQU5EQVJEX0ZPTlRTKS5pbmRleE9mKGZvbnQpICsgMX1gO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFBERlJlZiwgUERGRGljdGlvbmFyeSwgUGFnZVNpemUsIFRleHRPcHRpb25zLCBSZWN0T3B0aW9ucywgTGluZU9wdGlvbnMsIFBERkNvbG9yLCBQREZTdHJlYW0gfSBmcm9tIFwiLi4vdHlwZXMudHNcIjtcbmltcG9ydCB7XG4gICBjcmVhdGVEaWN0aW9uYXJ5LFxuICAgY3JlYXRlTmFtZSxcbiAgIGNyZWF0ZUFycmF5LFxuICAgY3JlYXRlUmVmLFxuICAgY3JlYXRlU3RyZWFtLFxufSBmcm9tIFwiLi4vY29yZS9vYmplY3RzLnRzXCI7XG5pbXBvcnQgeyBQYWdlU2l6ZVNjaGVtYSwgVGV4dE9wdGlvbnNTY2hlbWEsIFJlY3RPcHRpb25zU2NoZW1hLCBMaW5lT3B0aW9uc1NjaGVtYSB9IGZyb20gXCIuLi9zY2hlbWFzLnRzXCI7XG5pbXBvcnQgeyBTVEFOREFSRF9GT05UUywgaXNTdGFuZGFyZEZvbnQsIGdldEZvbnRSZWZOYW1lLCB0eXBlIFN0YW5kYXJkRm9udCB9IGZyb20gXCIuL2ZvbnRzLnRzXCI7XG5cbmV4cG9ydCB0eXBlIFBERlBhZ2VPcHRpb25zID0ge1xuICAgc2l6ZT86IFBhZ2VTaXplO1xuICAgcGFyZW50PzogUERGUmVmO1xufTtcblxuLy8gU3RhbmRhcmQgcGFnZSBzaXplcyBpbiBwb2ludHMgKDEvNzIgaW5jaClcbmNvbnN0IFBBR0VfU0laRVMgPSB7XG4gICBBNDogeyB3aWR0aDogNTk1LCBoZWlnaHQ6IDg0MiB9LFxuICAgTGV0dGVyOiB7IHdpZHRoOiA2MTIsIGhlaWdodDogNzkyIH0sXG4gICBMZWdhbDogeyB3aWR0aDogNjEyLCBoZWlnaHQ6IDEwMDggfSxcbiAgIEEzOiB7IHdpZHRoOiA4NDIsIGhlaWdodDogMTE5MSB9LFxuICAgQTU6IHsgd2lkdGg6IDQyMCwgaGVpZ2h0OiA1OTUgfSxcbiAgIFRhYmxvaWQ6IHsgd2lkdGg6IDc5MiwgaGVpZ2h0OiAxMjI0IH0sXG59O1xuXG4vKipcbiAqIFBERiBQYWdlIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBQREZQYWdlIHtcbiAgIHJlZjogUERGUmVmO1xuICAgc2l6ZTogUGFnZVNpemU7XG4gICBwYXJlbnQ/OiBQREZSZWY7XG4gICBjb250ZW50U3RyZWFtOiBzdHJpbmdbXSA9IFtdO1xuICAgcHJpdmF0ZSByZXNvdXJjZXM6IFBERkRpY3Rpb25hcnk7XG5cbiAgIGNvbnN0cnVjdG9yKHJlZjogUERGUmVmLCBvcHRpb25zOiBQREZQYWdlT3B0aW9ucyA9IHt9KSB7XG4gICAgICB0aGlzLnJlZiA9IHJlZjtcbiAgICAgIHRoaXMuc2l6ZSA9IFBhZ2VTaXplU2NoZW1hLnBhcnNlKG9wdGlvbnMuc2l6ZSA/PyBcIkE0XCIpO1xuICAgICAgdGhpcy5wYXJlbnQgPSBvcHRpb25zLnBhcmVudDtcbiAgICAgIHRoaXMucmVzb3VyY2VzID0gY3JlYXRlRGljdGlvbmFyeSh7XG4gICAgICAgICBGb250OiBjcmVhdGVEaWN0aW9uYXJ5KCksXG4gICAgICB9KTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBHZXQgcGFnZSBkaW1lbnNpb25zIGluIHBvaW50c1xuICAgICovXG4gICBnZXREaW1lbnNpb25zKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuc2l6ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgcmV0dXJuIFBBR0VfU0laRVNbdGhpcy5zaXplXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICB9XG5cbiAgIC8qKlxuICAgICogU2V0IGZpbGwgY29sb3JcbiAgICAqL1xuICAgcHJpdmF0ZSBzZXRGaWxsQ29sb3IoY29sb3I6IFBERkNvbG9yKTogdm9pZCB7XG4gICAgICBpZiAoY29sb3IudHlwZSA9PT0gXCJyZ2JcIikge1xuICAgICAgICAgdGhpcy5jb250ZW50U3RyZWFtLnB1c2goYCR7Y29sb3Iucn0gJHtjb2xvci5nfSAke2NvbG9yLmJ9IHJnYCk7XG4gICAgICB9IGVsc2UgaWYgKGNvbG9yLnR5cGUgPT09IFwiY215a1wiKSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChcbiAgICAgICAgICAgIGAke2NvbG9yLmN9ICR7Y29sb3IubX0gJHtjb2xvci55fSAke2NvbG9yLmt9IGtgLFxuICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sb3IudHlwZSA9PT0gXCJncmF5XCIpIHtcbiAgICAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKGAke2NvbG9yLmdyYXl9IGdgKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLyoqXG4gICAgKiBTZXQgc3Ryb2tlIGNvbG9yXG4gICAgKi9cbiAgIHByaXZhdGUgc2V0U3Ryb2tlQ29sb3IoY29sb3I6IFBERkNvbG9yKTogdm9pZCB7XG4gICAgICBpZiAoY29sb3IudHlwZSA9PT0gXCJyZ2JcIikge1xuICAgICAgICAgdGhpcy5jb250ZW50U3RyZWFtLnB1c2goYCR7Y29sb3Iucn0gJHtjb2xvci5nfSAke2NvbG9yLmJ9IFJHYCk7XG4gICAgICB9IGVsc2UgaWYgKGNvbG9yLnR5cGUgPT09IFwiY215a1wiKSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChcbiAgICAgICAgICAgIGAke2NvbG9yLmN9ICR7Y29sb3IubX0gJHtjb2xvci55fSAke2NvbG9yLmt9IEtgLFxuICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoY29sb3IudHlwZSA9PT0gXCJncmF5XCIpIHtcbiAgICAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKGAke2NvbG9yLmdyYXl9IEdgKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLyoqXG4gICAgKiBEcmF3IHRleHQgb24gdGhlIHBhZ2VcbiAgICAqL1xuICAgZHJhd1RleHQodGV4dDogc3RyaW5nLCBvcHRpb25zOiBUZXh0T3B0aW9ucyk6IHZvaWQge1xuICAgICAgY29uc3QgdmFsaWRPcHRpb25zID0gVGV4dE9wdGlvbnNTY2hlbWEucGFyc2Uob3B0aW9ucyk7XG4gICAgICBjb25zdCB7IHgsIHksIHNpemUgPSAxMiwgZm9udCA9IFwiSGVsdmV0aWNhXCIsIGNvbG9yLCBhbGlnbiA9IFwibGVmdFwiIH0gPSB2YWxpZE9wdGlvbnM7XG5cbiAgICAgIC8vIFJlZ2lzdGVyIGZvbnQgaW4gcmVzb3VyY2VzXG4gICAgICBjb25zdCBmb250TmFtZSA9IGZvbnQgfHwgXCJIZWx2ZXRpY2FcIjtcbiAgICAgIGlmICghaXNTdGFuZGFyZEZvbnQoZm9udE5hbWUpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRm9udCBcIiR7Zm9udE5hbWV9XCIgaXMgbm90IGEgc3RhbmRhcmQgUERGIGZvbnQuIFVzZSBvbmUgb2Y6ICR7T2JqZWN0LmtleXMoU1RBTkRBUkRfRk9OVFMpLmpvaW4oXCIsIFwiKX1gLFxuICAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9udFJlZk5hbWUgPSBnZXRGb250UmVmTmFtZShmb250TmFtZSk7XG4gICAgICBjb25zdCBmb250RGljdCA9IHRoaXMucmVzb3VyY2VzLkZvbnQgYXMgUERGRGljdGlvbmFyeTtcbiAgICAgIGlmICghZm9udERpY3RbZm9udFJlZk5hbWVdKSB7XG4gICAgICAgICAvLyBDcmVhdGUgZm9udCBvYmplY3RcbiAgICAgICAgIGNvbnN0IGZvbnRPYmogPSBjcmVhdGVEaWN0aW9uYXJ5KHtcbiAgICAgICAgICAgIFR5cGU6IGNyZWF0ZU5hbWUoXCJGb250XCIpLFxuICAgICAgICAgICAgU3VidHlwZTogY3JlYXRlTmFtZShcIlR5cGUxXCIpLFxuICAgICAgICAgICAgQmFzZUZvbnQ6IGNyZWF0ZU5hbWUoZm9udE5hbWUpLFxuICAgICAgICAgfSk7XG4gICAgICAgICBmb250RGljdFtmb250UmVmTmFtZV0gPSBmb250T2JqO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxjdWxhdGUgdGV4dCBwb3NpdGlvbiBiYXNlZCBvbiBhbGlnbm1lbnRcbiAgICAgIGxldCB4UG9zID0geDtcbiAgICAgIGlmIChhbGlnbiA9PT0gXCJjZW50ZXJcIikge1xuICAgICAgICAgLy8gQXBwcm94aW1hdGUgY2VudGVyaW5nIChwcm9wZXIgY2FsY3VsYXRpb24gbmVlZHMgZm9udCBtZXRyaWNzKVxuICAgICAgICAgeFBvcyA9IHggLSB0ZXh0Lmxlbmd0aCAqIHNpemUgKiAwLjM7XG4gICAgICB9IGVsc2UgaWYgKGFsaWduID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgIHhQb3MgPSB4IC0gdGV4dC5sZW5ndGggKiBzaXplICogMC42O1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgY29sb3IgaWYgcHJvdmlkZWRcbiAgICAgIGlmIChjb2xvcikge1xuICAgICAgICAgdGhpcy5zZXRGaWxsQ29sb3IoY29sb3IpO1xuICAgICAgfVxuXG4gICAgICAvLyBEcmF3IHRleHRcbiAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKFwiQlRcIik7IC8vIEJlZ2luIHRleHRcbiAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKGAvJHtmb250UmVmTmFtZX0gJHtzaXplfSBUZmApOyAvLyBTZXQgZm9udCBhbmQgc2l6ZVxuICAgICAgdGhpcy5jb250ZW50U3RyZWFtLnB1c2goYCR7eFBvc30gJHt5fSBUZGApOyAvLyBQb3NpdGlvblxuXG4gICAgICAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRleHRcbiAgICAgIGNvbnN0IGVzY2FwZWRUZXh0ID0gdGV4dFxuICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKVxuICAgICAgICAgLnJlcGxhY2UoL1xcKC9nLCBcIlxcXFwoXCIpXG4gICAgICAgICAucmVwbGFjZSgvXFwpL2csIFwiXFxcXClcIik7XG4gICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChgKCR7ZXNjYXBlZFRleHR9KSBUamApOyAvLyBTaG93IHRleHRcbiAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKFwiRVRcIik7IC8vIEVuZCB0ZXh0XG4gICB9XG5cbiAgIC8qKlxuICAgICogRHJhdyBhIHJlY3RhbmdsZVxuICAgICovXG4gICBkcmF3UmVjdGFuZ2xlKG9wdGlvbnM6IFJlY3RPcHRpb25zKTogdm9pZCB7XG4gICAgICBjb25zdCB2YWxpZE9wdGlvbnMgPSBSZWN0T3B0aW9uc1NjaGVtYS5wYXJzZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCwgZmlsbCwgc3Ryb2tlLCBsaW5lV2lkdGggPSAxIH0gPSB2YWxpZE9wdGlvbnM7XG5cbiAgICAgIC8vIFNldCBncmFwaGljcyBzdGF0ZVxuICAgICAgaWYgKGxpbmVXaWR0aCAmJiBzdHJva2UpIHtcbiAgICAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKGAke2xpbmVXaWR0aH0gd2ApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsbCkge1xuICAgICAgICAgdGhpcy5zZXRGaWxsQ29sb3IoZmlsbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdHJva2UpIHtcbiAgICAgICAgIHRoaXMuc2V0U3Ryb2tlQ29sb3Ioc3Ryb2tlKTtcbiAgICAgIH1cblxuICAgICAgLy8gRHJhdyByZWN0YW5nbGVcbiAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKGAke3h9ICR7eX0gJHt3aWR0aH0gJHtoZWlnaHR9IHJlYCk7XG5cbiAgICAgIC8vIEZpbGwsIHN0cm9rZSwgb3IgYm90aFxuICAgICAgaWYgKGZpbGwgJiYgc3Ryb2tlKSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChcIkJcIik7IC8vIEZpbGwgYW5kIHN0cm9rZVxuICAgICAgfSBlbHNlIGlmIChmaWxsKSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChcImZcIik7IC8vIEZpbGwgb25seVxuICAgICAgfSBlbHNlIGlmIChzdHJva2UpIHtcbiAgICAgICAgIHRoaXMuY29udGVudFN0cmVhbS5wdXNoKFwiU1wiKTsgLy8gU3Ryb2tlIG9ubHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChcIlNcIik7IC8vIERlZmF1bHQgdG8gc3Ryb2tlXG4gICAgICB9XG4gICB9XG5cbiAgIC8qKlxuICAgICogRHJhdyBhIGxpbmVcbiAgICAqL1xuICAgZHJhd0xpbmUob3B0aW9uczogTGluZU9wdGlvbnMpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHZhbGlkT3B0aW9ucyA9IExpbmVPcHRpb25zU2NoZW1hLnBhcnNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgeyB4MSwgeTEsIHgyLCB5MiwgY29sb3IsIGxpbmVXaWR0aCA9IDEgfSA9IHZhbGlkT3B0aW9ucztcblxuICAgICAgLy8gU2V0IGdyYXBoaWNzIHN0YXRlXG4gICAgICBpZiAobGluZVdpZHRoKSB7XG4gICAgICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChgJHtsaW5lV2lkdGh9IHdgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgICB0aGlzLnNldFN0cm9rZUNvbG9yKGNvbG9yKTtcbiAgICAgIH1cblxuICAgICAgLy8gRHJhdyBsaW5lXG4gICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChgJHt4MX0gJHt5MX0gbWApOyAvLyBNb3ZlIHRvIHN0YXJ0XG4gICAgICB0aGlzLmNvbnRlbnRTdHJlYW0ucHVzaChgJHt4Mn0gJHt5Mn0gbGApOyAvLyBMaW5lIHRvIGVuZFxuICAgICAgdGhpcy5jb250ZW50U3RyZWFtLnB1c2goXCJTXCIpOyAvLyBTdHJva2VcbiAgIH1cblxuICAgLyoqXG4gICAgKiBHZXQgY29udGVudCBzdHJlYW0gcmVmZXJlbmNlXG4gICAgKi9cbiAgIGdldENvbnRlbnRTdHJlYW1SZWYoKTogUERGUmVmIHtcbiAgICAgIC8vIENvbnRlbnQgc3RyZWFtIHJlZiBpcyBwYWdlIHJlZiArIDFcbiAgICAgIHJldHVybiBjcmVhdGVSZWYodGhpcy5yZWYub2JqZWN0TnVtYmVyICsgMSwgMCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogR2VuZXJhdGUgY29udGVudCBzdHJlYW0gYXMgUERGU3RyZWFtXG4gICAgKi9cbiAgIHRvQ29udGVudFN0cmVhbSgpOiBQREZTdHJlYW0ge1xuICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuY29udGVudFN0cmVhbS5qb2luKFwiXFxuXCIpO1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShjb250ZW50KTtcbiAgICAgIFxuICAgICAgY29uc3QgZGljdCA9IGNyZWF0ZURpY3Rpb25hcnkoe1xuICAgICAgICAgTGVuZ3RoOiBkYXRhLmxlbmd0aCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gY3JlYXRlU3RyZWFtKGRhdGEsIGRpY3QpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIENvbnZlcnQgcGFnZSB0byBQREYgZGljdGlvbmFyeVxuICAgICovXG4gICB0b0RpY3Rpb25hcnkoKTogUERGRGljdGlvbmFyeSB7XG4gICAgICBjb25zdCBkaW1zID0gdGhpcy5nZXREaW1lbnNpb25zKCk7XG4gICAgICBjb25zdCBkaWN0ID0gY3JlYXRlRGljdGlvbmFyeSh7XG4gICAgICAgICBUeXBlOiBjcmVhdGVOYW1lKFwiUGFnZVwiKSxcbiAgICAgICAgIE1lZGlhQm94OiBjcmVhdGVBcnJheShbMCwgMCwgZGltcy53aWR0aCwgZGltcy5oZWlnaHRdKSxcbiAgICAgICAgIENvbnRlbnRzOiB0aGlzLmdldENvbnRlbnRTdHJlYW1SZWYoKSxcbiAgICAgICAgIFJlc291cmNlczogdGhpcy5yZXNvdXJjZXMsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICBkaWN0LlBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGljdDtcbiAgIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBQREZWYWx1ZSwgUERGRGljdGlvbmFyeSwgUERGUmVmLCBQREZTdHJlYW0sIFBERkFycmF5LCBQREZOYW1lIH0gZnJvbSBcIi4uL3R5cGVzLnRzXCI7XG5cbi8qKlxuICogU2VyaWFsaXplIGEgUERGIHZhbHVlIHRvIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplVmFsdWUodmFsdWU6IFBERlZhbHVlKTogc3RyaW5nIHtcbiAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgfVxuICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiO1xuICAgfVxuICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICB9XG4gICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgICBjb25zdCBlc2NhcGVkID0gdmFsdWUucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1xcKC9nLCBcIlxcXFwoXCIpLnJlcGxhY2UoL1xcKS9nLCBcIlxcXFwpXCIpO1xuICAgICAgcmV0dXJuIGAoJHtlc2NhcGVkfSlgO1xuICAgfVxuICAgaWYgKGlzTmFtZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgLyR7dmFsdWUudmFsdWV9YDtcbiAgIH1cbiAgIGlmIChpc1JlZih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgJHt2YWx1ZS5vYmplY3ROdW1iZXJ9ICR7dmFsdWUuZ2VuZXJhdGlvbn0gUmA7XG4gICB9XG4gICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBgWyR7dmFsdWUubWFwKHNlcmlhbGl6ZVZhbHVlKS5qb2luKFwiIFwiKX1dYDtcbiAgIH1cbiAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBEaWN0aW9uYXJ5XG4gICAgICBjb25zdCBkaWN0ID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgUERGVmFsdWU+O1xuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGRpY3QpXG4gICAgICAgICAubWFwKChba2V5LCB2YWxdKSA9PiBgLyR7a2V5fSAke3NlcmlhbGl6ZVZhbHVlKHZhbCl9YClcbiAgICAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGA8PFxcbiR7ZW50cmllc31cXG4+PmA7XG4gICB9XG4gICByZXR1cm4gXCJcIjtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemUgYSBQREYgc3RyZWFtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVTdHJlYW0oc3RyZWFtOiBQREZTdHJlYW0pOiBVaW50OEFycmF5IHtcbiAgIGNvbnN0IGRpY3RTdHIgPSBzZXJpYWxpemVWYWx1ZShzdHJlYW0uZGljdGlvbmFyeSk7XG4gICBjb25zdCBoZWFkZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoYCR7ZGljdFN0cn1cXG5zdHJlYW1cXG5gKTtcbiAgIGNvbnN0IGZvb3RlciA9IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShcIlxcbmVuZHN0cmVhbVwiKTtcblxuICAgLy8gQ29tYmluZSBoZWFkZXIsIGRhdGEsIGZvb3RlclxuICAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoaGVhZGVyLmxlbmd0aCArIHN0cmVhbS5kYXRhLmxlbmd0aCArIGZvb3Rlci5sZW5ndGgpO1xuICAgcmVzdWx0LnNldChoZWFkZXIsIDApO1xuICAgcmVzdWx0LnNldChzdHJlYW0uZGF0YSwgaGVhZGVyLmxlbmd0aCk7XG4gICByZXN1bHQuc2V0KGZvb3RlciwgaGVhZGVyLmxlbmd0aCArIHN0cmVhbS5kYXRhLmxlbmd0aCk7XG5cbiAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGFuIGluZGlyZWN0IG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplT2JqZWN0KG9iamVjdE51bWJlcjogbnVtYmVyLCBnZW5lcmF0aW9uOiBudW1iZXIsIHZhbHVlOiBhbnkpOiBVaW50OEFycmF5IHtcbiAgIGNvbnN0IGhlYWRlciA9IGAke29iamVjdE51bWJlcn0gJHtnZW5lcmF0aW9ufSBvYmpcXG5gO1xuICAgbGV0IGJvZHk6IFVpbnQ4QXJyYXk7XG5cbiAgIGlmIChpc1N0cmVhbSh2YWx1ZSkpIHtcbiAgICAgIGJvZHkgPSBzZXJpYWxpemVTdHJlYW0odmFsdWUpO1xuICAgfSBlbHNlIHtcbiAgICAgIGJvZHkgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoc2VyaWFsaXplVmFsdWUodmFsdWUpKTtcbiAgIH1cblxuICAgY29uc3QgZm9vdGVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFwiXFxuZW5kb2JqXFxuXCIpO1xuXG4gICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShoZWFkZXIubGVuZ3RoICsgYm9keS5sZW5ndGggKyBmb290ZXIubGVuZ3RoKTtcbiAgIHJlc3VsdC5zZXQobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGhlYWRlciksIDApO1xuICAgcmVzdWx0LnNldChib2R5LCBoZWFkZXIubGVuZ3RoKTtcbiAgIHJlc3VsdC5zZXQoZm9vdGVyLCBoZWFkZXIubGVuZ3RoICsgYm9keS5sZW5ndGgpO1xuXG4gICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyBUeXBlIGd1YXJkc1xuZnVuY3Rpb24gaXNOYW1lKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBQREZOYW1lIHtcbiAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUudHlwZSA9PT0gXCJuYW1lXCI7XG59XG5cbmZ1bmN0aW9uIGlzUmVmKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBQREZSZWYge1xuICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBcIm9iamVjdE51bWJlclwiIGluIHZhbHVlICYmIFwiZ2VuZXJhdGlvblwiIGluIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBpc1N0cmVhbSh2YWx1ZTogYW55KTogdmFsdWUgaXMgUERGU3RyZWFtIHtcbiAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgXCJkYXRhXCIgaW4gdmFsdWUgJiYgdmFsdWUuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk7XG59XG4iLAogICAgImltcG9ydCB7XG4gICBjcmVhdGVBcnJheSxcbiAgIGNyZWF0ZURpY3Rpb25hcnksXG4gICBjcmVhdGVOYW1lLFxuICAgY3JlYXRlUmVmLFxufSBmcm9tIFwiLi4vY29yZS9vYmplY3RzLnRzXCI7XG5pbXBvcnQgeyBQREZNZXRhZGF0YVNjaGVtYSwgUERGVmVyc2lvblNjaGVtYSB9IGZyb20gXCIuLi9zY2hlbWFzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFBERk1ldGFkYXRhLCBQREZSZWYsIFBERlZlcnNpb24gfSBmcm9tIFwiLi4vdHlwZXMudHNcIjtcbmltcG9ydCB7IFBERlBhZ2UgfSBmcm9tIFwiLi9wYWdlLnRzXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVWYWx1ZSwgc2VyaWFsaXplT2JqZWN0IH0gZnJvbSBcIi4vd3JpdGVyLnRzXCI7XG5cbmV4cG9ydCB0eXBlIFBERkRvY3VtZW50T3B0aW9ucyA9IHtcbiAgIHZlcnNpb24/OiBQREZWZXJzaW9uO1xuICAgbWV0YWRhdGE/OiBQREZNZXRhZGF0YTtcbn07XG5cbmV4cG9ydCB0eXBlIHsgUERGUGFnZU9wdGlvbnMgfSBmcm9tIFwiLi9wYWdlLnRzXCI7XG5cbi8qKlxuICogTWFpbiBQREYgRG9jdW1lbnQgY2xhc3MgZm9yIGdlbmVyYXRpb25cbiAqXG4gKiBAcHJvcGVydHkgdmVyc2lvbiAtIFBERiB2ZXJzaW9uICgxLjQsIDEuNSwgMS42LCBvciAxLjcpXG4gKiBAcHJvcGVydHkgbWV0YWRhdGEgLSBEb2N1bWVudCBtZXRhZGF0YSAodGl0bGUsIGF1dGhvciwgZXRjLilcbiAqIEBwcm9wZXJ0eSBjYXRhbG9nIC0gUmVmZXJlbmNlIHRvIHRoZSBkb2N1bWVudCBjYXRhbG9nXG4gKiBAcHJvcGVydHkgcGFnZXMgLSBSZWZlcmVuY2UgdG8gdGhlIHBhZ2VzIHRyZWUgcm9vdFxuICovXG5leHBvcnQgY2xhc3MgUERGRG9jdW1lbnQge1xuICAgdmVyc2lvbjogUERGVmVyc2lvbjtcbiAgIG1ldGFkYXRhOiBQREZNZXRhZGF0YTtcbiAgIHByaXZhdGUgb2JqZWN0czogTWFwPG51bWJlciwgUERGRGljdGlvbmFyeT4gPSBuZXcgTWFwKCk7XG4gICBwcml2YXRlIG5leHRPYmplY3ROdW1iZXIgPSAxO1xuXG4gICBjYXRhbG9nOiBQREZSZWY7XG4gICBwYWdlczogUERGUmVmO1xuICAgcHJpdmF0ZSBwYWdlc0FycmF5OiBQREZQYWdlW10gPSBbXTtcblxuICAgY29uc3RydWN0b3Iob3B0aW9uczogUERGRG9jdW1lbnRPcHRpb25zID0ge30pIHtcbiAgICAgIHRoaXMudmVyc2lvbiA9IFBERlZlcnNpb25TY2hlbWEucGFyc2Uob3B0aW9ucy52ZXJzaW9uID8/IFwiMS43XCIpO1xuICAgICAgdGhpcy5tZXRhZGF0YSA9IFBERk1ldGFkYXRhU2NoZW1hLnBhcnNlKG9wdGlvbnMubWV0YWRhdGEgPz8ge30pO1xuXG4gICAgICAvLyBDcmVhdGUgY2F0YWxvZ1xuICAgICAgdGhpcy5jYXRhbG9nID0gdGhpcy5hbGxvY2F0ZVJlZigpO1xuXG4gICAgICAvLyBDcmVhdGUgcGFnZXMgdHJlZVxuICAgICAgdGhpcy5wYWdlcyA9IHRoaXMuYWxsb2NhdGVSZWYoKTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBjYXRhbG9nIGRpY3Rpb25hcnlcbiAgICAgIGNvbnN0IGNhdGFsb2dEaWN0ID0gY3JlYXRlRGljdGlvbmFyeSh7XG4gICAgICAgICBUeXBlOiBjcmVhdGVOYW1lKFwiQ2F0YWxvZ1wiKSxcbiAgICAgICAgIFBhZ2VzOiB0aGlzLnBhZ2VzLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm9iamVjdHMuc2V0KHRoaXMuY2F0YWxvZy5vYmplY3ROdW1iZXIsIGNhdGFsb2dEaWN0KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBwYWdlcyBkaWN0aW9uYXJ5XG4gICAgICBjb25zdCBwYWdlc0RpY3QgPSBjcmVhdGVEaWN0aW9uYXJ5KHtcbiAgICAgICAgIFR5cGU6IGNyZWF0ZU5hbWUoXCJQYWdlc1wiKSxcbiAgICAgICAgIEtpZHM6IGNyZWF0ZUFycmF5KFtdKSxcbiAgICAgICAgIENvdW50OiAwLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm9iamVjdHMuc2V0KHRoaXMucGFnZXMub2JqZWN0TnVtYmVyLCBwYWdlc0RpY3QpO1xuXG4gICAgICAvLyBTdG9yZSBtZXRhZGF0YSBpZiBwcm92aWRlZCAod2lsbCBiZSBzZXJpYWxpemVkIGluIGZ1dHVyZSB0YXNrcylcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm1ldGFkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICBjb25zdCBpbmZvUmVmID0gdGhpcy5hbGxvY2F0ZVJlZigpO1xuICAgICAgICAgY29uc3QgaW5mb0RpY3QgPSBjcmVhdGVEaWN0aW9uYXJ5KHsgLi4udGhpcy5tZXRhZGF0YSB9KTtcbiAgICAgICAgIHRoaXMub2JqZWN0cy5zZXQoaW5mb1JlZi5vYmplY3ROdW1iZXIsIGluZm9EaWN0KTtcbiAgICAgIH1cbiAgIH1cblxuICAgLyoqXG4gICAgKiBBbGxvY2F0ZSBhIG5ldyBvYmplY3QgcmVmZXJlbmNlXG4gICAgKi9cbiAgIHByaXZhdGUgYWxsb2NhdGVSZWYoKTogUERGUmVmIHtcbiAgICAgIHJldHVybiBjcmVhdGVSZWYodGhpcy5uZXh0T2JqZWN0TnVtYmVyKyssIDApO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEFkZCBhIHBhZ2UgdG8gdGhlIGRvY3VtZW50XG4gICAgKi9cbiAgIGFkZFBhZ2Uob3B0aW9ucz86IGltcG9ydChcIi4vcGFnZS50c1wiKS5QREZQYWdlT3B0aW9ucyk6IFBERlBhZ2Uge1xuICAgICAgY29uc3QgcGFnZVJlZiA9IHRoaXMuYWxsb2NhdGVSZWYoKTtcbiAgICAgIGNvbnN0IGNvbnRlbnRTdHJlYW1SZWYgPSB0aGlzLmFsbG9jYXRlUmVmKCk7IC8vIEFsbG9jYXRlIGNvbnRlbnQgc3RyZWFtIHJlZlxuICAgICAgXG4gICAgICBjb25zdCBwYWdlID0gbmV3IFBERlBhZ2UocGFnZVJlZiwgeyAuLi5vcHRpb25zLCBwYXJlbnQ6IHRoaXMucGFnZXMgfSk7XG4gICAgICB0aGlzLnBhZ2VzQXJyYXkucHVzaChwYWdlKTtcblxuICAgICAgLy8gVXBkYXRlIHBhZ2VzIGRpY3Rpb25hcnlcbiAgICAgIGNvbnN0IHBhZ2VzRGljdCA9IHRoaXMub2JqZWN0cy5nZXQoXG4gICAgICAgICB0aGlzLnBhZ2VzLm9iamVjdE51bWJlcixcbiAgICAgICkgYXMgaW1wb3J0KFwiLi4vdHlwZXMudHNcIikuUERGRGljdGlvbmFyeTtcbiAgICAgIGNvbnN0IGtpZHMgPSBwYWdlc0RpY3QuS2lkcyBhcyBQREZSZWZbXTtcbiAgICAgIGtpZHMucHVzaChwYWdlUmVmKTtcbiAgICAgIHBhZ2VzRGljdC5Db3VudCA9IChwYWdlc0RpY3QuQ291bnQgYXMgbnVtYmVyKSArIDE7XG5cbiAgICAgIC8vIFN0b3JlIHBhZ2UgZGljdGlvbmFyeVxuICAgICAgdGhpcy5vYmplY3RzLnNldChwYWdlUmVmLm9iamVjdE51bWJlciwgcGFnZS50b0RpY3Rpb25hcnkoKSk7XG5cbiAgICAgIC8vIFN0b3JlIGNvbnRlbnQgc3RyZWFtXG4gICAgICB0aGlzLm9iamVjdHMuc2V0KGNvbnRlbnRTdHJlYW1SZWYub2JqZWN0TnVtYmVyLCBwYWdlLnRvQ29udGVudFN0cmVhbSgpKTtcblxuICAgICAgcmV0dXJuIHBhZ2U7XG4gICB9XG5cbiAgIC8qKlxuICAgICogU2F2ZSBQREYgdG8gYnl0ZXNcbiAgICAqL1xuICAgc2F2ZSgpOiBVaW50OEFycmF5IHtcbiAgICAgIC8vIFJlZnJlc2ggYWxsIG9iamVjdHMgKHBhZ2VzIG1pZ2h0IGhhdmUgY2hhbmdlZClcbiAgICAgIGZvciAoY29uc3QgcGFnZSBvZiB0aGlzLnBhZ2VzQXJyYXkpIHtcbiAgICAgICAgIHRoaXMub2JqZWN0cy5zZXQocGFnZS5yZWYub2JqZWN0TnVtYmVyLCBwYWdlLnRvRGljdGlvbmFyeSgpKTtcbiAgICAgICAgIGNvbnN0IGNvbnRlbnRTdHJlYW1SZWYgPSBwYWdlLmdldENvbnRlbnRTdHJlYW1SZWYoKTtcbiAgICAgICAgIHRoaXMub2JqZWN0cy5zZXQoY29udGVudFN0cmVhbVJlZi5vYmplY3ROdW1iZXIsIHBhZ2UudG9Db250ZW50U3RyZWFtKCkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJ0czogVWludDhBcnJheVtdID0gW107XG5cbiAgICAgIC8vIDEuIFBERiBIZWFkZXIgd2l0aCBiaW5hcnkgbWFya2VyXG4gICAgICBjb25zdCBoZWFkZXIgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoYCVQREYtJHt0aGlzLnZlcnNpb259XFxuJVxceEUyXFx4RTNcXHhDRlxceEQzXFxuYCk7XG4gICAgICBwYXJ0cy5wdXNoKGhlYWRlcik7XG5cbiAgICAgIC8vIDIuIFdyaXRlIG9iamVjdHMgYW5kIHRyYWNrIGJ5dGUgb2Zmc2V0c1xuICAgICAgY29uc3Qgb2Zmc2V0czogbnVtYmVyW10gPSBbMF07IC8vIE9iamVjdCAwIGlzIGFsd2F5cyBhdCBvZmZzZXQgMFxuICAgICAgbGV0IGN1cnJlbnRPZmZzZXQgPSBoZWFkZXIubGVuZ3RoO1xuXG4gICAgICAvLyBTb3J0IG9iamVjdCBudW1iZXJzIHRvIHdyaXRlIGluIG9yZGVyXG4gICAgICBjb25zdCBvYmplY3ROdW1iZXJzID0gQXJyYXkuZnJvbSh0aGlzLm9iamVjdHMua2V5cygpKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG5cbiAgICAgIGZvciAoY29uc3Qgb2JqTnVtIG9mIG9iamVjdE51bWJlcnMpIHtcbiAgICAgICAgIGNvbnN0IG9iaiA9IHRoaXMub2JqZWN0cy5nZXQob2JqTnVtKTtcbiAgICAgICAgIGNvbnN0IG9iakJ5dGVzID0gc2VyaWFsaXplT2JqZWN0KG9iak51bSwgMCwgb2JqKTtcbiAgICAgICAgIHBhcnRzLnB1c2gob2JqQnl0ZXMpO1xuICAgICAgICAgb2Zmc2V0c1tvYmpOdW1dID0gY3VycmVudE9mZnNldDtcbiAgICAgICAgIGN1cnJlbnRPZmZzZXQgKz0gb2JqQnl0ZXMubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICAvLyAzLiBDcm9zcy1yZWZlcmVuY2UgdGFibGVcbiAgICAgIGNvbnN0IHhyZWZTdGFydCA9IGN1cnJlbnRPZmZzZXQ7XG4gICAgICBjb25zdCB4cmVmTGluZXMgPSBbYHhyZWZcXG4wICR7b2Zmc2V0cy5sZW5ndGh9XFxuYF07XG5cbiAgICAgIC8vIE9iamVjdCAwIGVudHJ5IChmcmVlKVxuICAgICAgeHJlZkxpbmVzLnB1c2goXCIwMDAwMDAwMDAwIDY1NTM1IGYgXFxuXCIpO1xuXG4gICAgICAvLyBJbi11c2Ugb2JqZWN0c1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICBjb25zdCBvZmZzZXQgPSBvZmZzZXRzW2ldIHx8IDA7XG4gICAgICAgICBjb25zdCBvZmZzZXRTdHIgPSBvZmZzZXQudG9TdHJpbmcoKS5wYWRTdGFydCgxMCwgXCIwXCIpO1xuICAgICAgICAgeHJlZkxpbmVzLnB1c2goYCR7b2Zmc2V0U3RyfSAwMDAwMCBuIFxcbmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB4cmVmID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHhyZWZMaW5lcy5qb2luKFwiXCIpKTtcbiAgICAgIHBhcnRzLnB1c2goeHJlZik7XG5cbiAgICAgIC8vIDQuIFRyYWlsZXJcbiAgICAgIGNvbnN0IHRyYWlsZXJEaWN0ID0gc2VyaWFsaXplVmFsdWUoXG4gICAgICAgICBjcmVhdGVEaWN0aW9uYXJ5KHtcbiAgICAgICAgICAgIFNpemU6IG9mZnNldHMubGVuZ3RoLFxuICAgICAgICAgICAgUm9vdDogdGhpcy5jYXRhbG9nLFxuICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBjb25zdCB0cmFpbGVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFxuICAgICAgICAgYHRyYWlsZXJcXG4ke3RyYWlsZXJEaWN0fVxcbnN0YXJ0eHJlZlxcbiR7eHJlZlN0YXJ0fVxcbiUlRU9GXFxuYFxuICAgICAgKTtcbiAgICAgIHBhcnRzLnB1c2godHJhaWxlcik7XG5cbiAgICAgIC8vIDUuIENvbWJpbmUgYWxsIHBhcnRzXG4gICAgICBjb25zdCB0b3RhbExlbmd0aCA9IHBhcnRzLnJlZHVjZSgoc3VtLCBwYXJ0KSA9PiBzdW0gKyBwYXJ0Lmxlbmd0aCwgMCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgICBsZXQgcG9zaXRpb24gPSAwO1xuICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICByZXN1bHQuc2V0KHBhcnQsIHBvc2l0aW9uKTtcbiAgICAgICAgIHBvc2l0aW9uICs9IHBhcnQubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgfVxufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7O0FBQUE7QUFLTyxJQUFNLGVBQWUsRUFBRSxPQUFPO0FBQUEsRUFDbEMsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUztBQUFBLEVBQ3hDLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVk7QUFDNUMsQ0FBQztBQUtNLElBQU0sZ0JBQWdCLEVBQUUsT0FBTztBQUFBLEVBQ25DLE1BQU0sRUFBRSxRQUFRLE1BQU07QUFBQSxFQUN0QixPQUFPLEVBQUUsT0FBTztBQUNuQixDQUFDO0FBS00sSUFBTSxpQkFBaUIsRUFBRSxNQUFNO0FBQUEsRUFDbkMsRUFBRSxLQUFLLENBQUMsTUFBTSxVQUFVLFNBQVMsTUFBTSxNQUFNLFNBQVMsQ0FBQztBQUFBLEVBQ3ZELEVBQUUsT0FBTztBQUFBLElBQ04sT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsSUFDM0IsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTO0FBQUEsRUFDL0IsQ0FBQztBQUNKLENBQUM7QUFL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UUFBUSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQztBQUFBLElBRTFFLFdBQVcsVUFBVSxlQUFlO0FBQUEsTUFDakMsTUFBTSxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU07QUFBQSxNQUNuQyxNQUFNLFdBQVcsZ0JBQWdCLFFBQVEsR0FBRyxHQUFHO0FBQUEsTUFDL0MsTUFBTSxLQUFLLFFBQVE7QUFBQSxNQUNuQixRQUFRLFVBQVU7QUFBQSxNQUNsQixpQkFBaUIsU0FBUztBQUFBLElBQzdCO0FBQUEsSUFHQSxNQUFNLFlBQVk7QUFBQSxJQUNsQixNQUFNLFlBQVksQ0FBQztBQUFBLElBQVcsUUFBUTtBQUFBLENBQVU7QUFBQSxJQUdoRCxVQUFVLEtBQUs7QUFBQSxDQUF1QjtBQUFBLElBR3RDLFNBQVMsSUFBSSxFQUFHLElBQUksUUFBUSxRQUFRLEtBQUs7QUFBQSxNQUN0QyxNQUFNLFNBQVMsUUFBUSxNQUFNO0FBQUEsTUFDN0IsTUFBTSxZQUFZLE9BQU8sU0FBUyxFQUFFLFNBQVMsSUFBSSxHQUFHO0FBQUEsTUFDcEQsVUFBVSxLQUFLLEdBQUc7QUFBQSxDQUFzQjtBQUFBLElBQzNDO0FBQUEsSUFFQSxNQUFNLE9BQU8sSUFBSSxZQUFZLEVBQUUsT0FBTyxVQUFVLEtBQUssRUFBRSxDQUFDO0FBQUEsSUFDeEQsTUFBTSxLQUFLLElBQUk7QUFBQSxJQUdmLE1BQU0sY0FBYyxlQUNqQixpQkFBaUI7QUFBQSxNQUNkLE1BQU0sUUFBUTtBQUFBLE1BQ2QsTUFBTSxLQUFLO0FBQUEsSUFDZCxDQUFDLENBQ0o7QUFBQSxJQUNBLE1BQU0sVUFBVSxJQUFJLFlBQVksRUFBRSxPQUMvQjtBQUFBLEVBQVk7QUFBQTtBQUFBLEVBQTJCO0FBQUE7QUFBQSxDQUMxQztBQUFBLElBQ0EsTUFBTSxLQUFLLE9BQU87QUFBQSxJQUdsQixNQUFNLGNBQWMsTUFBTSxPQUFPLENBQUMsS0FBSyxTQUFTLE1BQU0sS0FBSyxRQUFRLENBQUM7QUFBQSxJQUNwRSxNQUFNLFNBQVMsSUFBSSxXQUFXLFdBQVc7QUFBQSxJQUN6QyxJQUFJLFdBQVc7QUFBQSxJQUNmLFdBQVcsUUFBUSxPQUFPO0FBQUEsTUFDdkIsT0FBTyxJQUFJLE1BQU0sUUFBUTtBQUFBLE1BQ3pCLFlBQVksS0FBSztBQUFBLElBQ3BCO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFFYjsiLAogICJkZWJ1Z0lkIjogIkQxRjlEOUYyM0VDMEIxQUQ2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// src/core/objects.ts
|
|
2
|
+
function createName(value) {
|
|
3
|
+
return { type: "name", value };
|
|
4
|
+
}
|
|
5
|
+
function createRef(objectNumber, generation = 0) {
|
|
6
|
+
if (objectNumber < 1) {
|
|
7
|
+
throw new Error(`Object number must be positive, got ${objectNumber}`);
|
|
8
|
+
}
|
|
9
|
+
if (generation < 0 || generation > 65535) {
|
|
10
|
+
throw new Error(`Generation number must be between 0 and 65535, got ${generation}`);
|
|
11
|
+
}
|
|
12
|
+
return { objectNumber, generation };
|
|
13
|
+
}
|
|
14
|
+
function createDictionary(entries) {
|
|
15
|
+
if (entries) {
|
|
16
|
+
return { ...entries };
|
|
17
|
+
}
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
function createArray(values = []) {
|
|
21
|
+
return values;
|
|
22
|
+
}
|
|
23
|
+
function createStream(data, dictionary) {
|
|
24
|
+
return {
|
|
25
|
+
dictionary: dictionary ?? createDictionary(),
|
|
26
|
+
data
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function isRef(value) {
|
|
30
|
+
return typeof value === "object" && value !== null && "objectNumber" in value && "generation" in value && typeof value.objectNumber === "number" && typeof value.generation === "number";
|
|
31
|
+
}
|
|
32
|
+
function isName(value) {
|
|
33
|
+
return typeof value === "object" && value !== null && "type" in value && value.type === "name" && "value" in value && typeof value.value === "string";
|
|
34
|
+
}
|
|
35
|
+
function isDictionary(value) {
|
|
36
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) && !isRef(value) && !isName(value) && !isStream(value);
|
|
37
|
+
}
|
|
38
|
+
function isStream(value) {
|
|
39
|
+
return typeof value === "object" && value !== null && "dictionary" in value && "data" in value && typeof value.dictionary === "object" && value.dictionary !== null && value.data instanceof Uint8Array;
|
|
40
|
+
}
|
|
41
|
+
function isArray(value) {
|
|
42
|
+
return Array.isArray(value);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { createName, createRef, createDictionary, createArray, createStream, isRef, isName, isDictionary, isStream, isArray };
|
|
46
|
+
|
|
47
|
+
//# debugId=8CD2E6AB52D9F7AE64756E2164756E21
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvcmUvb2JqZWN0cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICJpbXBvcnQgdHlwZSB7XG4gICBQREZBcnJheSxcbiAgIFBERkRpY3Rpb25hcnksXG4gICBQREZOYW1lLFxuICAgUERGUmVmLFxuICAgUERGU3RyZWFtLFxuICAgUERGVmFsdWUsXG59IGZyb20gXCIuLi90eXBlcy50c1wiO1xuXG4vKipcbiAqIENyZWF0ZSBhIFBERiBOYW1lIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmFtZSh2YWx1ZTogc3RyaW5nKTogUERGTmFtZSB7XG4gICByZXR1cm4geyB0eXBlOiBcIm5hbWVcIiwgdmFsdWUgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBQREYgUmVmZXJlbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWYob2JqZWN0TnVtYmVyOiBudW1iZXIsIGdlbmVyYXRpb24gPSAwKTogUERGUmVmIHtcbiAgIGlmIChvYmplY3ROdW1iZXIgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBudW1iZXIgbXVzdCBiZSBwb3NpdGl2ZSwgZ290ICR7b2JqZWN0TnVtYmVyfWApO1xuICAgfVxuICAgaWYgKGdlbmVyYXRpb24gPCAwIHx8IGdlbmVyYXRpb24gPiA2NTUzNSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgYEdlbmVyYXRpb24gbnVtYmVyIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2NTUzNSwgZ290ICR7Z2VuZXJhdGlvbn1gLFxuICAgICAgKTtcbiAgIH1cbiAgIHJldHVybiB7IG9iamVjdE51bWJlciwgZ2VuZXJhdGlvbiB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIFBERiBEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEaWN0aW9uYXJ5KFxuICAgZW50cmllcz86IFJlY29yZDxzdHJpbmcsIFBERlZhbHVlPixcbik6IFBERkRpY3Rpb25hcnkge1xuICAgaWYgKGVudHJpZXMpIHtcbiAgICAgIHJldHVybiB7IC4uLmVudHJpZXMgfTtcbiAgIH1cbiAgIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBQREYgQXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFycmF5KHZhbHVlczogUERGVmFsdWVbXSA9IFtdKTogUERGQXJyYXkge1xuICAgcmV0dXJuIHZhbHVlcztcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBQREYgU3RyZWFtXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdHJlYW0oXG4gICBkYXRhOiBVaW50OEFycmF5LFxuICAgZGljdGlvbmFyeT86IFBERkRpY3Rpb25hcnksXG4pOiBQREZTdHJlYW0ge1xuICAgcmV0dXJuIHtcbiAgICAgIGRpY3Rpb25hcnk6IGRpY3Rpb25hcnkgPz8gY3JlYXRlRGljdGlvbmFyeSgpLFxuICAgICAgZGF0YSxcbiAgIH07XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgUERGIFJlZmVyZW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWYodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQREZSZWYge1xuICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgIFwib2JqZWN0TnVtYmVyXCIgaW4gdmFsdWUgJiZcbiAgICAgIFwiZ2VuZXJhdGlvblwiIGluIHZhbHVlICYmXG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIFBERlJlZikub2JqZWN0TnVtYmVyID09PSBcIm51bWJlclwiICYmXG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIFBERlJlZikuZ2VuZXJhdGlvbiA9PT0gXCJudW1iZXJcIlxuICAgKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBQREYgTmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOYW1lKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUERGTmFtZSB7XG4gICByZXR1cm4gKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgXCJ0eXBlXCIgaW4gdmFsdWUgJiZcbiAgICAgICh2YWx1ZSBhcyBQREZOYW1lKS50eXBlID09PSBcIm5hbWVcIiAmJlxuICAgICAgXCJ2YWx1ZVwiIGluIHZhbHVlICYmXG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIFBERk5hbWUpLnZhbHVlID09PSBcInN0cmluZ1wiXG4gICApO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIFBERiBEaWN0aW9uYXJ5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RpY3Rpb25hcnkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQREZEaWN0aW9uYXJ5IHtcbiAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICAgICFpc1JlZih2YWx1ZSkgJiZcbiAgICAgICFpc05hbWUodmFsdWUpICYmXG4gICAgICAhaXNTdHJlYW0odmFsdWUpXG4gICApO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIFBERiBTdHJlYW1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyZWFtKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUERGU3RyZWFtIHtcbiAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICBcImRpY3Rpb25hcnlcIiBpbiB2YWx1ZSAmJlxuICAgICAgXCJkYXRhXCIgaW4gdmFsdWUgJiZcbiAgICAgIHR5cGVvZiAodmFsdWUgYXMgUERGU3RyZWFtKS5kaWN0aW9uYXJ5ID09PSBcIm9iamVjdFwiICYmXG4gICAgICAodmFsdWUgYXMgUERGU3RyZWFtKS5kaWN0aW9uYXJ5ICE9PSBudWxsICYmXG4gICAgICAodmFsdWUgYXMgUERGU3RyZWFtKS5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheVxuICAgKTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBQREYgQXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQREZBcnJheSB7XG4gICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBWU8sU0FBUyxVQUFVLENBQUMsT0FBd0I7QUFBQSxFQUNoRCxPQUFPLEVBQUUsTUFBTSxRQUFRLE1BQU07QUFBQTtBQU16QixTQUFTLFNBQVMsQ0FBQyxjQUFzQixhQUFhLEdBQVc7QUFBQSxFQUNyRSxJQUFJLGVBQWUsR0FBRztBQUFBLElBQ25CLE1BQU0sSUFBSSxNQUFNLHVDQUF1QyxjQUFjO0FBQUEsRUFDeEU7QUFBQSxFQUNBLElBQUksYUFBYSxLQUFLLGFBQWEsT0FBTztBQUFBLElBQ3ZDLE1BQU0sSUFBSSxNQUNQLHNEQUFzRCxZQUN6RDtBQUFBLEVBQ0g7QUFBQSxFQUNBLE9BQU8sRUFBRSxjQUFjLFdBQVc7QUFBQTtBQU05QixTQUFTLGdCQUFnQixDQUM3QixTQUNjO0FBQUEsRUFDZCxJQUFJLFNBQVM7QUFBQSxJQUNWLE9BQU8sS0FBSyxRQUFRO0FBQUEsRUFDdkI7QUFBQSxFQUNBLE9BQU8sQ0FBQztBQUFBO0FBTUosU0FBUyxXQUFXLENBQUMsU0FBcUIsQ0FBQyxHQUFhO0FBQUEsRUFDNUQsT0FBTztBQUFBO0FBTUgsU0FBUyxZQUFZLENBQ3pCLE1BQ0EsWUFDVTtBQUFBLEVBQ1YsT0FBTztBQUFBLElBQ0osWUFBWSxjQUFjLGlCQUFpQjtBQUFBLElBQzNDO0FBQUEsRUFDSDtBQUFBO0FBTUksU0FBUyxLQUFLLENBQUMsT0FBaUM7QUFBQSxFQUNwRCxPQUNHLE9BQU8sVUFBVSxZQUNqQixVQUFVLFFBQ1Ysa0JBQWtCLFNBQ2xCLGdCQUFnQixTQUNoQixPQUFRLE1BQWlCLGlCQUFpQixZQUMxQyxPQUFRLE1BQWlCLGVBQWU7QUFBQTtBQU92QyxTQUFTLE1BQU0sQ0FBQyxPQUFrQztBQUFBLEVBQ3RELE9BQ0csT0FBTyxVQUFVLFlBQ2pCLFVBQVUsUUFDVixVQUFVLFNBQ1QsTUFBa0IsU0FBUyxVQUM1QixXQUFXLFNBQ1gsT0FBUSxNQUFrQixVQUFVO0FBQUE7QUFPbkMsU0FBUyxZQUFZLENBQUMsT0FBd0M7QUFBQSxFQUNsRSxPQUNHLE9BQU8sVUFBVSxZQUNqQixVQUFVLFFBQ1YsQ0FBQyxNQUFNLFFBQVEsS0FBSyxLQUNwQixDQUFDLE1BQU0sS0FBSyxLQUNaLENBQUMsT0FBTyxLQUFLLEtBQ2IsQ0FBQyxTQUFTLEtBQUs7QUFBQTtBQU9kLFNBQVMsUUFBUSxDQUFDLE9BQW9DO0FBQUEsRUFDMUQsT0FDRyxPQUFPLFVBQVUsWUFDakIsVUFBVSxRQUNWLGdCQUFnQixTQUNoQixVQUFVLFNBQ1YsT0FBUSxNQUFvQixlQUFlLFlBQzFDLE1BQW9CLGVBQWUsUUFDbkMsTUFBb0IsZ0JBQWdCO0FBQUE7QUFPcEMsU0FBUyxPQUFPLENBQUMsT0FBbUM7QUFBQSxFQUN4RCxPQUFPLE1BQU0sUUFBUSxLQUFLO0FBQUE7IiwKICAiZGVidWdJZCI6ICI4Q0QyRTZBQjUyRDlGN0FFNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|