// All the possible operations for an operator list.
const OPS = {
	dependency: 1,
	setLineWidth: 2,
	setLineCap: 3,
	setLineJoin: 4,
	setMiterLimit: 5,
	setDash: 6,
	setRenderingIntent: 7,
	setFlatness: 8,
	setGState: 9,
	save: 10,
	restore: 11,
	transform: 12,
	moveTo: 13,
	lineTo: 14,
	curveTo: 15,
	curveTo2: 16,
	curveTo3: 17,
	closePath: 18,
	rectangle: 19,
	stroke: 20,
	closeStroke: 21,
	fill: 22,
	eoFill: 23,
	fillStroke: 24,
	eoFillStroke: 25,
	closeFillStroke: 26,
	closeEOFillStroke: 27,
	endPath: 28,
	clip: 29,
	eoClip: 30,
	beginText: 31,
	endText: 32,
	setCharSpacing: 33,
	setWordSpacing: 34,
	setHScale: 35,
	setLeading: 36,
	setFont: 37,
	setTextRenderingMode: 38,
	setTextRise: 39,
	moveText: 40,
	setLeadingMoveText: 41,
	setTextMatrix: 42,
	nextLine: 43,
	showText: 44,
	showSpacedText: 45,
	nextLineShowText: 46,
	nextLineSetSpacingShowText: 47,
	setCharWidth: 48,
	setCharWidthAndBounds: 49,
	setStrokeColorSpace: 50,
	setFillColorSpace: 51,
	setStrokeColor: 52,
	setStrokeColorN: 53,
	setFillColor: 54,
	setFillColorN: 55,
	setStrokeGray: 56,
	setFillGray: 57,
	setStrokeRGBColor: 58,
	setFillRGBColor: 59,
	setStrokeCMYKColor: 60,
	setFillCMYKColor: 61,
	shadingFill: 62,
	beginInlineImage: 63,
	beginImageData: 64,
	endInlineImage: 65,
	paintXObject: 66,
	markPoint: 67,
	markPointProps: 68,
	beginMarkedContent: 69,
	beginMarkedContentProps: 70,
	endMarkedContent: 71,
	beginCompat: 72,
	endCompat: 73,
	paintFormXObjectBegin: 74,
	paintFormXObjectEnd: 75,
	beginGroup: 76,
	endGroup: 77,
	// beginAnnotations: 78,
	// endAnnotations: 79,
	beginAnnotation: 80,
	endAnnotation: 81,
	// paintJpegXObject: 82,
	paintImageMaskXObject: 83,
	paintImageMaskXObjectGroup: 84,
	paintImageXObject: 85,
	paintInlineImageXObject: 86,
	paintInlineImageXObjectGroup: 87,
	paintImageXObjectRepeat: 88,
	paintImageMaskXObjectRepeat: 89,
	paintSolidColorImageMask: 90,
	constructPath: 91,
	setStrokeTransparent: 92,
	setFillTransparent: 93
};


const opMap = {
	// Graphic state
	w: { id: OPS.setLineWidth, numArgs: 1, variableArgs: false },
	J: { id: OPS.setLineCap, numArgs: 1, variableArgs: false },
	j: { id: OPS.setLineJoin, numArgs: 1, variableArgs: false },
	M: { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false },
	d: { id: OPS.setDash, numArgs: 2, variableArgs: false },
	ri: { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false },
	i: { id: OPS.setFlatness, numArgs: 1, variableArgs: false },
	gs: { id: OPS.setGState, numArgs: 1, variableArgs: false },
	q: { id: OPS.save, numArgs: 0, variableArgs: false },
	Q: { id: OPS.restore, numArgs: 0, variableArgs: false },
	cm: { id: OPS.transform, numArgs: 6, variableArgs: false },

	// Path
	m: { id: OPS.moveTo, numArgs: 2, variableArgs: false },
	l: { id: OPS.lineTo, numArgs: 2, variableArgs: false },
	c: { id: OPS.curveTo, numArgs: 6, variableArgs: false },
	v: { id: OPS.curveTo2, numArgs: 4, variableArgs: false },
	y: { id: OPS.curveTo3, numArgs: 4, variableArgs: false },
	h: { id: OPS.closePath, numArgs: 0, variableArgs: false },
	re: { id: OPS.rectangle, numArgs: 4, variableArgs: false },
	S: { id: OPS.stroke, numArgs: 0, variableArgs: false },
	s: { id: OPS.closeStroke, numArgs: 0, variableArgs: false },
	f: { id: OPS.fill, numArgs: 0, variableArgs: false },
	F: { id: OPS.fill, numArgs: 0, variableArgs: false },
	'f*': { id: OPS.eoFill, numArgs: 0, variableArgs: false },
	B: { id: OPS.fillStroke, numArgs: 0, variableArgs: false },
	'B*': { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false },
	b: { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false },
	'b*': { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false },
	n: { id: OPS.endPath, numArgs: 0, variableArgs: false },

	// Clipping
	W: { id: OPS.clip, numArgs: 0, variableArgs: false },
	'W*': { id: OPS.eoClip, numArgs: 0, variableArgs: false },

	// Text
	BT: { id: OPS.beginText, numArgs: 0, variableArgs: false },
	ET: { id: OPS.endText, numArgs: 0, variableArgs: false },
	Tc: { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false },
	Tw: { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false },
	Tz: { id: OPS.setHScale, numArgs: 1, variableArgs: false },
	TL: { id: OPS.setLeading, numArgs: 1, variableArgs: false },
	Tf: { id: OPS.setFont, numArgs: 2, variableArgs: false },
	Tr: { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false },
	Ts: { id: OPS.setTextRise, numArgs: 1, variableArgs: false },
	Td: { id: OPS.moveText, numArgs: 2, variableArgs: false },
	TD: { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false },
	Tm: { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false },
	'T*': { id: OPS.nextLine, numArgs: 0, variableArgs: false },
	Tj: { id: OPS.showText, numArgs: 1, variableArgs: false },
	TJ: { id: OPS.showSpacedText, numArgs: 1, variableArgs: false },
	'\'': { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false },
	'"': {
		id: OPS.nextLineSetSpacingShowText,
		numArgs: 3,
		variableArgs: false
	},

	// Type3 fonts
	d0: { id: OPS.setCharWidth, numArgs: 2, variableArgs: false },
	d1: {
		id: OPS.setCharWidthAndBounds,
		numArgs: 6,
		variableArgs: false
	},

	// Color
	CS: { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false },
	cs: { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false },
	SC: { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true },
	SCN: { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true },
	sc: { id: OPS.setFillColor, numArgs: 4, variableArgs: true },
	scn: { id: OPS.setFillColorN, numArgs: 33, variableArgs: true },
	G: { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false },
	g: { id: OPS.setFillGray, numArgs: 1, variableArgs: false },
	RG: { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false },
	rg: { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false },
	K: { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false },
	k: { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false },

	// Shading
	sh: { id: OPS.shadingFill, numArgs: 1, variableArgs: false },

	// Images
	BI: { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false },
	ID: { id: OPS.beginImageData, numArgs: 0, variableArgs: false },
	EI: { id: OPS.endInlineImage, numArgs: 1, variableArgs: false },

	// XObjects
	Do: { id: OPS.paintXObject, numArgs: 1, variableArgs: false },
	MP: { id: OPS.markPoint, numArgs: 1, variableArgs: false },
	DP: { id: OPS.markPointProps, numArgs: 2, variableArgs: false },
	BMC: { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false },
	BDC: {
		id: OPS.beginMarkedContentProps,
		numArgs: 2,
		variableArgs: false
	},
	EMC: { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false },

	// Compatibility
	BX: { id: OPS.beginCompat, numArgs: 0, variableArgs: false },
	EX: { id: OPS.endCompat, numArgs: 0, variableArgs: false }
};

const invertedOPS = Object.entries(OPS).reduce((acc, [key, value]) => {
	acc[value] = {
		name: key,
		keyword: Object.entries(opMap).find(([_, op]) => op.id === value)?.[0] || null,
		description: getOperatorDescription(key),
		...(opMap[Object.entries(opMap).find(([_, op]) => op.id === value)?.[0]] || {})
	};
	return acc;
}, {});

function getOperatorDescription(opName) {
	const descriptions = {
		setLineWidth: 'Sets the line width in the graphics state',
		setLineCap: 'Sets the line cap style in the graphics state (0=butt, 1=round, 2=square)',
		setLineJoin: 'Sets the line join style in the graphics state (0=miter, 1=round, 2=bevel)',
		setMiterLimit: 'Sets the miter limit in the graphics state',
		setDash: 'Sets the line dash pattern in the graphics state',
		setRenderingIntent: 'Sets the color rendering intent in the graphics state',
		setFlatness: 'Sets the flatness tolerance in the graphics state',
		setGState: 'Sets the specified parameters in the graphics state',
		save: 'Pushes a copy of the current graphics state onto the graphics state stack',
		restore: 'Restores the graphics state by popping it from the stack',
		transform: 'Modifies the current transformation matrix (CTM)',
		moveTo: 'Begins a new subpath by moving to coordinates (x, y)',
		lineTo: 'Adds a straight line segment to the current path',
		curveTo: 'Adds a Bézier curve segment to the current path using two control points',
		curveTo2: 'Adds a Bézier curve segment to the current path using one control point',
		curveTo3: 'Adds a Bézier curve segment to the current path using one control point',
		closePath: 'Closes the current subpath',
		rectangle: 'Adds a rectangle to the current path',
		stroke: 'Strokes the current path',
		closeStroke: 'Closes and strokes the current path',
		fill: 'Fills the current path using nonzero winding number rule',
		eoFill: 'Fills the current path using even-odd rule',
		fillStroke: 'Fills and strokes the current path using nonzero winding number rule',
		eoFillStroke: 'Fills and strokes the current path using even-odd rule',
		closeFillStroke: 'Closes, fills, and strokes the current path using nonzero winding number rule',
		closeEOFillStroke: 'Closes, fills, and strokes the current path using even-odd rule',
		endPath: 'Ends the current path without filling or stroking',
		clip: 'Sets the current path as the clipping path using nonzero winding number rule',
		eoClip: 'Sets the current path as the clipping path using even-odd rule',
		beginText: 'Begins a text object',
		endText: 'Ends a text object',
		setCharSpacing: 'Sets the character spacing',
		setWordSpacing: 'Sets the word spacing',
		setHScale: 'Sets the horizontal scaling',
		setLeading: 'Sets the text leading',
		setFont: 'Sets the text font and size',
		setTextRenderingMode: 'Sets the text rendering mode',
		setTextRise: 'Sets the text rise',
		moveText: 'Moves to the start of the next line using offset coordinates',
		setLeadingMoveText: 'Sets the text leading and moves to the next line',
		setTextMatrix: 'Sets the text matrix and text line matrix',
		nextLine: 'Moves to the start of the next line',
		showText: 'Shows a text string',
		showSpacedText: 'Shows a text string with individual glyph positioning',
		nextLineShowText: 'Moves to the next line and shows a text string',
		nextLineSetSpacingShowText: 'Sets word and character spacing, moves to next line, and shows text',
		setCharWidth: 'Sets the character width information for Type 3 fonts',
		setCharWidthAndBounds: 'Sets the character width and bounding box for Type 3 fonts',
		setStrokeColorSpace: 'Sets the color space for stroking operations',
		setFillColorSpace: 'Sets the color space for nonstroking operations',
		setStrokeColor: 'Sets the color for stroking operations',
		setStrokeColorN: 'Sets the color for stroking operations (ICCBased and special color spaces)',
		setFillColor: 'Sets the color for nonstroking operations',
		setFillColorN: 'Sets the color for nonstroking operations (ICCBased and special color spaces)',
		setStrokeGray: 'Sets the gray level for stroking operations',
		setFillGray: 'Sets the gray level for nonstroking operations',
		setStrokeRGBColor: 'Sets the RGB color for stroking operations',
		setFillRGBColor: 'Sets the RGB color for nonstroking operations',
		setStrokeCMYKColor: 'Sets the CMYK color for stroking operations',
		setFillCMYKColor: 'Sets the CMYK color for nonstroking operations',
		shadingFill: 'Fills the current path using a shading pattern',
		beginInlineImage: 'Begins an inline image object',
		beginImageData: 'Begins the inline image data',
		endInlineImage: 'Ends an inline image object',
		paintXObject: 'Paints the specified XObject',
		markPoint: 'Marks a point in the content stream',
		markPointProps: 'Marks a point in the content stream with properties',
		beginMarkedContent: 'Begins a marked-content sequence',
		beginMarkedContentProps: 'Begins a marked-content sequence with properties',
		endMarkedContent: 'Ends a marked-content sequence',
		beginCompat: 'Begins a compatibility section',
		endCompat: 'Ends a compatibility section',
		paintFormXObjectBegin: 'Begins painting a form XObject',
		paintFormXObjectEnd: 'Ends painting a form XObject',
		beginGroup: 'Begins a transparency group',
		endGroup: 'Ends a transparency group',
		beginAnnotation: 'Begins an annotation',
		endAnnotation: 'Ends an annotation',
		paintImageMaskXObject: 'Paints an image mask XObject',
		paintImageMaskXObjectGroup: 'Paints an image mask XObject group',
		paintImageXObject: 'Paints an image XObject',
		paintInlineImageXObject: 'Paints an inline image XObject',
		paintInlineImageXObjectGroup: 'Paints an inline image XObject group',
		paintImageXObjectRepeat: 'Paints a repeated image XObject',
		paintImageMaskXObjectRepeat: 'Paints a repeated image mask XObject',
		paintSolidColorImageMask: 'Paints a solid color image mask',
		constructPath: 'Constructs a path from the specified segments',
		setStrokeTransparent: 'Sets the stroke transparency',
		setFillTransparent: 'Sets the fill transparency',
		dependency: 'Marks a resource dependency'
	};

	return descriptions[opName] || 'No description available';
}

const opLookup = {
	'1': {
		name: 'dependency',
		keyword: "Do",
		description: 'Marks a resource dependency',
		numArgs: 0,
		variableArgs: false
	},
	'2': {
		name: 'setLineWidth',
		keyword: 'w',
		description: 'Sets the line width in the graphics state',
		numArgs: 1,
		variableArgs: false
	},
	'3': {
		name: 'setLineCap',
		keyword: 'J',
		description: 'Sets the line cap style in the graphics state (0=butt, 1=round, 2=square)',
		numArgs: 1,
		variableArgs: false
	},
	'4': {
		name: 'setLineJoin',
		keyword: 'j',
		description: 'Sets the line join style in the graphics state (0=miter, 1=round, 2=bevel)',
		numArgs: 1,
		variableArgs: false
	},
	'5': {
		name: 'setMiterLimit',
		keyword: 'M',
		description: 'Sets the miter limit in the graphics state',
		numArgs: 1,
		variableArgs: false
	},
	'6': {
		name: 'setDash',
		keyword: 'd',
		description: 'Sets the line dash pattern in the graphics state',
		numArgs: 2,
		variableArgs: false
	},
	'7': {
		name: 'setRenderingIntent',
		keyword: 'ri',
		description: 'Sets the color rendering intent in the graphics state',
		numArgs: 1,
		variableArgs: false
	},
	'8': {
		name: 'setFlatness',
		keyword: 'i',
		description: 'Sets the flatness tolerance in the graphics state',
		numArgs: 1,
		variableArgs: false
	},
	'9': {
		name: 'setGState',
		keyword: 'gs',
		description: 'Sets the specified parameters in the graphics state',
		numArgs: 1,
		variableArgs: false
	},
	'10': {
		name: 'save',
		keyword: 'q',
		description: 'Pushes a copy of the current graphics state onto the graphics state stack',
		numArgs: 0,
		variableArgs: false
	},
	'11': {
		name: 'restore',
		keyword: 'Q',
		description: 'Restores the graphics state by popping it from the stack',
		numArgs: 0,
		variableArgs: false
	},
	'12': {
		name: 'transform',
		keyword: 'cm',
		description: 'Modifies the current transformation matrix (CTM)',
		numArgs: 6,
		variableArgs: false
	},
	'13': {
		name: 'moveTo',
		keyword: 'm',
		description: 'Begins a new subpath by moving to coordinates (x, y)',
		numArgs: 2,
		variableArgs: false
	},
	'14': {
		name: 'lineTo',
		keyword: 'l',
		description: 'Adds a straight line segment to the current path',
		numArgs: 2,
		variableArgs: false
	},
	'15': {
		name: 'curveTo',
		keyword: 'c',
		description: 'Adds a Bézier curve segment to the current path using two control points',
		numArgs: 6,
		variableArgs: false
	},
	'16': {
		name: 'curveTo2',
		keyword: 'v',
		description: 'Adds a Bézier curve segment to the current path using one control point',
		numArgs: 4,
		variableArgs: false
	},
	'17': {
		name: 'curveTo3',
		keyword: 'y',
		description: 'Adds a Bézier curve segment to the current path using one control point',
		numArgs: 4,
		variableArgs: false
	},
	'18': {
		name: 'closePath',
		keyword: 'h',
		description: 'Closes the current subpath',
		numArgs: 0,
		variableArgs: false
	},
	'19': {
		name: 'rectangle',
		keyword: 're',
		description: 'Adds a rectangle to the current path',
		numArgs: 4,
		variableArgs: false
	},
	'20': {
		name: 'stroke',
		keyword: 'S',
		description: 'Strokes the current path',
		numArgs: 0,
		variableArgs: false
	},
	'21': {
		name: 'closeStroke',
		keyword: 's',
		description: 'Closes and strokes the current path',
		numArgs: 0,
		variableArgs: false
	},
	'22': {
		name: 'fill',
		keyword: 'f',
		description: 'Fills the current path using nonzero winding number rule',
		numArgs: 0,
		variableArgs: false
	},
	'23': {
		name: 'eoFill',
		keyword: 'f*',
		description: 'Fills the current path using even-odd rule',
		numArgs: 0,
		variableArgs: false
	},
	'24': {
		name: 'fillStroke',
		keyword: 'B',
		description: 'Fills and strokes the current path using nonzero winding number rule',
		numArgs: 0,
		variableArgs: false
	},
	'25': {
		name: 'eoFillStroke',
		keyword: 'B*',
		description: 'Fills and strokes the current path using even-odd rule',
		numArgs: 0,
		variableArgs: false
	},
	'26': {
		name: 'closeFillStroke',
		keyword: 'b',
		description: 'Closes, fills, and strokes the current path using nonzero winding number rule',
		numArgs: 0,
		variableArgs: false
	},
	'27': {
		name: 'closeEOFillStroke',
		keyword: 'b*',
		description: 'Closes, fills, and strokes the current path using even-odd rule',
		numArgs: 0,
		variableArgs: false
	},
	'28': {
		name: 'endPath',
		keyword: 'n',
		description: 'Ends the current path without filling or stroking',
		numArgs: 0,
		variableArgs: false
	},
	'29': {
		name: 'clip',
		keyword: 'W',
		description: 'Sets the current path as the clipping path using nonzero winding number rule',
		numArgs: 0,
		variableArgs: false
	},
	'30': {
		name: 'eoClip',
		keyword: 'W*',
		description: 'Sets the current path as the clipping path using even-odd rule',
		numArgs: 0,
		variableArgs: false
	},
	'31': {
		name: 'beginText',
		keyword: 'BT',
		description: 'Begins a text object',
		numArgs: 0,
		variableArgs: false
	},
	'32': {
		name: 'endText',
		keyword: 'ET',
		description: 'Ends a text object',
		numArgs: 0,
		variableArgs: false
	},
	'33': {
		name: 'setCharSpacing',
		keyword: 'Tc',
		description: 'Sets the character spacing',
		numArgs: 1,
		variableArgs: false
	},
	'34': {
		name: 'setWordSpacing',
		keyword: 'Tw',
		description: 'Sets the word spacing',
		numArgs: 1,
		variableArgs: false
	},
	'35': {
		name: 'setHScale',
		keyword: 'Tz',
		description: 'Sets the horizontal scaling',
		numArgs: 1,
		variableArgs: false
	},
	'36': {
		name: 'setLeading',
		keyword: 'TL',
		description: 'Sets the text leading',
		numArgs: 1,
		variableArgs: false
	},
	'37': {
		name: 'setFont',
		keyword: 'Tf',
		description: 'Sets the text font and size',
		numArgs: 2,
		variableArgs: false
	},
	'38': {
		name: 'setTextRenderingMode',
		keyword: 'Tr',
		description: 'Sets the text rendering mode',
		numArgs: 1,
		variableArgs: false
	},
	'39': {
		name: 'setTextRise',
		keyword: 'Ts',
		description: 'Sets the text rise',
		numArgs: 1,
		variableArgs: false
	},
	'40': {
		name: 'moveText',
		keyword: 'Td',
		description: 'Moves to the start of the next line using offset coordinates',
		numArgs: 2,
		variableArgs: false
	},
	'41': {
		name: 'setLeadingMoveText',
		keyword: 'TD',
		description: 'Sets the text leading and moves to the next line',
		numArgs: 2,
		variableArgs: false
	},
	'42': {
		name: 'setTextMatrix',
		keyword: 'Tm',
		description: 'Sets the text matrix and text line matrix',
		numArgs: 6,
		variableArgs: false
	},
	'43': {
		name: 'nextLine',
		keyword: 'T*',
		description: 'Moves to the start of the next line',
		numArgs: 0,
		variableArgs: false
	},
	'44': {
		name: 'showText',
		keyword: 'Tj',
		description: 'Shows a text string',
		numArgs: 1,
		variableArgs: false
	},
	'45': {
		name: 'showSpacedText',
		keyword: 'TJ',
		description: 'Shows a text string with individual glyph positioning',
		numArgs: 1,
		variableArgs: false
	},
	'46': {
		name: 'nextLineShowText',
		keyword: '\'',
		description: 'Moves to the next line and shows a text string',
		numArgs: 1,
		variableArgs: false
	},
	'47': {
		name: 'nextLineSetSpacingShowText',
		keyword: '"',
		description: 'Sets word and character spacing, moves to next line, and shows text',
		numArgs: 3,
		variableArgs: false
	},
	'48': {
		name: 'setCharWidth',
		keyword: 'd0',
		description: 'Sets the character width information for Type 3 fonts',
		numArgs: 2,
		variableArgs: false
	},
	'49': {
		name: 'setCharWidthAndBounds',
		keyword: 'd1',
		description: 'Sets the character width and bounding box for Type 3 fonts',
		numArgs: 6,
		variableArgs: false
	},
	'50': {
		name: 'setStrokeColorSpace',
		keyword: 'CS',
		description: 'Sets the color space for stroking operations',
		numArgs: 1,
		variableArgs: false
	},
	'51': {
		name: 'setFillColorSpace',
		keyword: 'cs',
		description: 'Sets the color space for nonstroking operations',
		numArgs: 1,
		variableArgs: false
	},
	'52': {
		name: 'setStrokeColor',
		keyword: 'SC',
		description: 'Sets the color for stroking operations',
		numArgs: 4,
		variableArgs: true
	},
	'53': {
		name: 'setStrokeColorN',
		keyword: 'SCN',
		description: 'Sets the color for stroking operations (ICCBased and special color spaces)',
		numArgs: 33,
		variableArgs: true
	},
	'54': {
		name: 'setFillColor',
		keyword: 'sc',
		description: 'Sets the color for nonstroking operations',
		numArgs: 4,
		variableArgs: true
	},
	'55': {
		name: 'setFillColorN',
		keyword: 'scn',
		description: 'Sets the color for nonstroking operations (ICCBased and special color spaces)',
		numArgs: 33,
		variableArgs: true
	},
	'56': {
		name: 'setStrokeGray',
		keyword: 'G',
		description: 'Sets the gray level for stroking operations',
		numArgs: 1,
		variableArgs: false
	},
	'57': {
		name: 'setFillGray',
		keyword: 'g',
		description: 'Sets the gray level for nonstroking operations',
		numArgs: 1,
		variableArgs: false
	},
	'58': {
		name: 'setStrokeRGBColor',
		keyword: 'RG',
		description: 'Sets the RGB color for stroking operations',
		numArgs: 3,
		variableArgs: false
	},
	'59': {
		name: 'setFillRGBColor',
		keyword: 'rg',
		description: 'Sets the RGB color for nonstroking operations',
		numArgs: 3,
		variableArgs: false
	},
	'60': {
		name: 'setStrokeCMYKColor',
		keyword: 'K',
		description: 'Sets the CMYK color for stroking operations',
		numArgs: 4,
		variableArgs: false
	},
	'61': {
		name: 'setFillCMYKColor',
		keyword: 'k',
		description: 'Sets the CMYK color for nonstroking operations',
		numArgs: 4,
		variableArgs: false
	},
	'62': {
		name: 'shadingFill',
		keyword: 'sh',
		description: 'Fills the current path using a shading pattern',
		numArgs: 1,
		variableArgs: false
	},
	'63': {
		name: 'beginInlineImage',
		keyword: 'BI',
		description: 'Begins an inline image object',
		numArgs: 0,
		variableArgs: false
	},
	'64': {
		name: 'beginImageData',
		keyword: 'ID',
		description: 'Begins the inline image data',
		numArgs: 0,
		variableArgs: false
	},
	'65': {
		name: 'endInlineImage',
		keyword: 'EI',
		description: 'Ends an inline image object',
		numArgs: 1,
		variableArgs: false
	},
	'66': {
		name: 'paintXObject',
		keyword: 'Do',
		description: 'Paints the specified XObject',
		numArgs: 1,
		variableArgs: false
	},
	'67': {
		name: 'markPoint',
		keyword: 'MP',
		description: 'Marks a point in the content stream',
		numArgs: 1,
		variableArgs: false
	},
	'68': {
		name: 'markPointProps',
		keyword: 'DP',
		description: 'Marks a point in the content stream with properties',
		numArgs: 2,
		variableArgs: false
	},
	'69': {
		name: 'beginMarkedContent',
		keyword: 'BMC',
		description: 'Begins a marked-content sequence',
		numArgs: 1,
		variableArgs: false
	},
	'70': {
		name: 'beginMarkedContentProps',
		keyword: 'BDC',
		description: 'Begins a marked-content sequence with properties',
		numArgs: 2,
		variableArgs: false
	},
	'71': {
		name: 'endMarkedContent',
		keyword: 'EMC',
		description: 'Ends a marked-content sequence',
		numArgs: 0,
		variableArgs: false
	},
	'72': {
		name: 'beginCompat',
		keyword: 'BX',
		description: 'Begins a compatibility section',
		numArgs: 0,
		variableArgs: false
	},
	'73': {
		name: 'endCompat',
		keyword: 'EX',
		description: 'Ends a compatibility section',
		numArgs: 0,
		variableArgs: false
	},
	'74': {
		name: 'paintFormXObjectBegin',
		keyword: null,
		description: 'Begins painting a form XObject'
	},
	'75': {
		name: 'paintFormXObjectEnd',
		keyword: null,
		description: 'Ends painting a form XObject'
	},
	'76': {
		name: 'beginGroup',
		keyword: null,
		description: 'Begins a transparency group'
	},
	'77': {
		name: 'endGroup',
		keyword: null,
		description: 'Ends a transparency group'
	},
	'80': {
		name: 'beginAnnotation',
		keyword: null,
		description: 'Begins an annotation'
	},
	'81': {
		name: 'endAnnotation',
		keyword: null,
		description: 'Ends an annotation'
	},
	'83': {
		name: 'paintImageMaskXObject',
		keyword: null,
		description: 'Paints an image mask XObject'
	},
	'84': {
		name: 'paintImageMaskXObjectGroup',
		keyword: null,
		description: 'Paints an image mask XObject group'
	},
	'85': {
		name: 'paintImageXObject',
		keyword: null,
		description: 'Paints an image XObject'
	},
	'86': {
		name: 'paintInlineImageXObject',
		keyword: null,
		description: 'Paints an inline image XObject'
	},
	'87': {
		name: 'paintInlineImageXObjectGroup',
		keyword: null,
		description: 'Paints an inline image XObject group'
	},
	'88': {
		name: 'paintImageXObjectRepeat',
		keyword: null,
		description: 'Paints a repeated image XObject'
	},
	'89': {
		name: 'paintImageMaskXObjectRepeat',
		keyword: null,
		description: 'Paints a repeated image mask XObject'
	},
	'90': {
		name: 'paintSolidColorImageMask',
		keyword: null,
		description: 'Paints a solid color image mask'
	},
	'91': {
		name: 'constructPath',
		keyword: null,
		description: 'Constructs a path from the specified segments'
	},
	'92': {
		name: 'setStrokeTransparent',
		keyword: null,
		description: 'Sets the stroke transparency'
	},
	'93': {
		name: 'setFillTransparent',
		keyword: null,
		description: 'Sets the fill transparency'
	}
};

console.log(opLookup[2]); // Example output for OpCode 2 (setLineWidth)