Merge pull request #28988 from overleaf/bg-add-file-info-to-performance-logs

add latexmk fdb file info to performance logs

GitOrigin-RevId: 3cc5709cd10fd55c2cd8aff7754fb7868aacdf0c
This commit is contained in:
Brian Gough
2025-10-13 08:05:23 +00:00
committed by Copybot
parent da3f366643
commit 58094ebcd6
6 changed files with 439 additions and 2 deletions
+30 -1
View File
@@ -24,7 +24,8 @@ const {
downloadOutputDotSynctexFromCompileCache,
} = require('./CLSICacheHandler')
const StatsManager = require('./StatsManager')
const { enableLatexMkMetrics } = require('./LatexMetrics')
const SafeReader = require('./SafeReader')
const { enableLatexMkMetrics, addLatexFdbMetrics } = require('./LatexMetrics')
const { callbackifyMultiResult } = require('@overleaf/promise-utils')
const COMPILE_TIME_BUCKETS = [
@@ -339,6 +340,19 @@ async function doCompile(request, stats, timings) {
// Record compile performance for a subset of users
if (recordPerformanceMetrics) {
// Add fdb metrics if available
try {
const fdbFileContent = await _readFdbFile(compileDir)
if (fdbFileContent) {
addLatexFdbMetrics(fdbFileContent, stats)
}
} catch (err) {
// ignore errors reading fdb file
logger.warn(
{ err, projectId, userId },
'error reading fdb file for performance metrics'
)
}
logger.info(
{
userId: request.user_id,
@@ -390,6 +404,21 @@ async function _saveOutputFiles({
return { outputFiles, allEntries, buildId }
}
// Set a maximum size for reading output.fdb_latexmk files
// This limit is chosen to prevent excessive memory usage and ensure performance,
// as fdb files are typically much smaller and only metrics are extracted from them.
const MAX_FDB_FILE_SIZE = 1024 * 1024 // 1 MB
async function _readFdbFile(compileDir) {
const fdbFile = Path.join(compileDir, 'output.fdb_latexmk')
const { result } = await SafeReader.promises.readFile(
fdbFile,
MAX_FDB_FILE_SIZE,
'utf8'
)
return result
}
async function stopCompile(projectId, userId) {
const compileName = getCompileName(projectId, userId)
await LatexRunner.promises.killLatex(compileName)
+138 -1
View File
@@ -132,4 +132,141 @@ function enableLatexMkMetrics(stats) {
})
}
module.exports = { enableLatexMkMetrics, addLatexMkMetrics }
/**
* Parses the content of a latexmk .fdb file to extract and record metrics
* about the files used during compilation.
*
* It categorizes files into 'system' (paths starting with '/') and 'user'
* files. For each category, it aggregates the count and total size of files
* grouped by their extension. The results are added to the provided stats
* object under `stats.latexmk['fdb-file-types']`.
*
* Each file is counted only once, even if it appears multiple times in the
* .fdb content. Files without a valid extension are counted as 'other'.
*
* @param {string | null | undefined} fdbContent - The content of the .fdb_latexmk file.
* @param {object} stats - The statistics object to be populated. The metrics will be added to `stats.latexmk`.
* @returns {void}
*/
function addLatexFdbMetrics(fdbContent, stats) {
if (!fdbContent) {
return
}
const { systemFileTypes, userFileTypes } = parseFdbContent(fdbContent)
if (
Object.keys(systemFileTypes).length === 0 &&
Object.keys(userFileTypes).length === 0
) {
return
}
const userSummary = summarizeFileTypes(userFileTypes)
const systemSummary = summarizeFileTypes(systemFileTypes)
stats.latexmk['fdb-file-types'] = {
total: {
systemFileCount: systemSummary.total.count,
systemFileSize: systemSummary.total.size,
imageFileCount: userSummary.image.count,
imageFileSize: userSummary.image.size,
textFileCount: userSummary.text.count,
textFileSize: userSummary.text.size,
fontFileCount: userSummary.font.count,
fontFileSize: userSummary.font.size,
otherFileCount: userSummary.other.count,
otherFileSize: userSummary.other.size,
},
system: convertToArray(systemFileTypes),
user: convertToArray(userFileTypes),
}
}
function parseFdbContent(fdbContent) {
const systemFileTypes = {}
const userFileTypes = {}
const seenFiles = new Set()
// Extract the file path and size from lines like:
// FILENAME TIMESTAMP SIZE CHECKSUM ...
// "main.tex" 1760016467 6147 9da336eb1132ecb1d61cd1f5a70cfa62 ""
// The timestamp can be an integer or a float
const lineRegex = /^\s*"([^"]+)"\s+\d+(?:\.\d*)?\s+(\d+)/gm
for (const match of fdbContent.matchAll(lineRegex)) {
// strip leading /compile/ from paths
const filePath = match[1].replace(/^\/compile\//, '')
if (seenFiles.has(filePath)) {
continue
}
const fileSize = parseInt(match[2], 10)
const isSystemFile = filePath.startsWith('/')
const extMatch = filePath.match(/\.([a-z]{1,4})$/i)
const ext = extMatch ? extMatch[1].toLowerCase() : 'other'
const fileTypes = isSystemFile ? systemFileTypes : userFileTypes
if (!fileTypes[ext]) {
fileTypes[ext] = { count: 0, size: 0 }
}
fileTypes[ext].count++
fileTypes[ext].size += fileSize
seenFiles.add(filePath)
}
return { systemFileTypes, userFileTypes }
}
function getFileTypeCategory(ext) {
switch (ext) {
case 'png':
case 'jpg':
case 'jpeg':
case 'tif':
case 'tiff':
case 'bmp':
case 'gif':
case 'svg':
case 'eps':
return 'image'
case 'tex':
case 'sty':
case 'cls':
case 'bib':
return 'text'
case 'ttf':
case 'otf':
case 'pfb':
return 'font'
default:
return 'other'
}
}
function summarizeFileTypes(fileTypes) {
const summary = {
image: { count: 0, size: 0 },
text: { count: 0, size: 0 },
font: { count: 0, size: 0 },
other: { count: 0, size: 0 },
total: { count: 0, size: 0 },
}
for (const [ext, info] of Object.entries(fileTypes)) {
const category = getFileTypeCategory(ext)
summary[category].count += info.count
summary[category].size += info.size
summary.total.count += info.count
summary.total.size += info.size
}
return summary
}
function convertToArray(object) {
return Object.entries(object)
.map(([ext, value]) => ({
ext,
count: value.count,
size: value.size,
}))
.sort((a, b) => b.size - a.size) // sort by size descending
}
module.exports = { enableLatexMkMetrics, addLatexMkMetrics, addLatexFdbMetrics }
+5
View File
@@ -14,6 +14,7 @@
let SafeReader
const fs = require('node:fs')
const logger = require('@overleaf/logger')
const { promisifyMultiResult } = require('@overleaf/promise-utils')
module.exports = SafeReader = {
// safely read up to size bytes from a file and return result as a
@@ -60,3 +61,7 @@ module.exports = SafeReader = {
})
},
}
module.exports.promises = {
readFile: promisifyMultiResult(SafeReader.readFile, ['result', 'bytesRead']),
}
@@ -0,0 +1,112 @@
const fs = require('node:fs')
const path = require('node:path')
const { expect } = require('chai')
const { addLatexFdbMetrics } = require('../../../app/js/LatexMetrics')
describe('LatexMetrics', function () {
describe('addLatexFdbMetrics', function () {
beforeEach(function () {
this.stats = {}
Object.defineProperty(this.stats, 'latexmk', {
value: {},
enumerable: false,
})
})
it('should do nothing if fdbContent is null or empty', function () {
addLatexFdbMetrics(null, this.stats)
expect(this.stats.latexmk).to.deep.equal({})
addLatexFdbMetrics('', this.stats)
expect(this.stats.latexmk).to.deep.equal({})
})
it('should parse v3 fdb content and add to stats', function () {
const fdbContent = fs.readFileSync(
path.join(__dirname, 'fixtures', 'v3.fdb_latexmk'),
'utf8'
)
addLatexFdbMetrics(fdbContent, this.stats)
expect(this.stats.latexmk['fdb-file-types']).to.deep.equal({
system: [
{ ext: 'fmt', count: 1, size: 3847283 },
{ ext: 'map', count: 2, size: 1644257 },
{ ext: 'pfb', count: 12, size: 404691 },
{ ext: 'sty', count: 19, size: 209868 },
{ ext: 'mkii', count: 1, size: 71627 },
{ ext: 'def', count: 1, size: 55368 },
{ ext: 'cnf', count: 2, size: 32268 },
{ ext: 'bst', count: 1, size: 24635 },
{ ext: 'tfm', count: 16, size: 20608 },
{ ext: 'cls', count: 1, size: 20496 },
{ ext: 'clo', count: 1, size: 8967 },
{ ext: 'cfg', count: 2, size: 4241 },
{ ext: 'fd', count: 2, size: 4089 },
],
user: [
{ ext: 'png', count: 2, size: 3886031 },
{ ext: 'tex', count: 1, size: 6147 },
{ ext: 'aux', count: 1, size: 1080 },
{ ext: 'bib', count: 1, size: 230 },
{ ext: 'bbl', count: 1, size: 203 },
],
total: {
fontFileCount: 0,
fontFileSize: 0,
imageFileCount: 2,
imageFileSize: 3886031,
otherFileCount: 2,
otherFileSize: 1283,
systemFileCount: 61,
systemFileSize: 6348398,
textFileCount: 2,
textFileSize: 6377,
},
})
})
it('should parse v4 fdb content and add to stats', function () {
const fdbContent = fs.readFileSync(
path.join(__dirname, 'fixtures', 'v4.fdb_latexmk'),
'utf8'
)
addLatexFdbMetrics(fdbContent, this.stats)
expect(this.stats.latexmk['fdb-file-types']).to.deep.equal({
system: [
{ ext: 'fmt', count: 1, size: 8172536 },
{ ext: 'map', count: 2, size: 4652176 },
{ ext: 'pfb', count: 13, size: 542949 },
{ ext: 'sty', count: 9, size: 100959 },
{ ext: 'mkii', count: 1, size: 71627 },
{ ext: 'def', count: 2, size: 49388 },
{ ext: 'cnf', count: 2, size: 41037 },
{ ext: 'bst', count: 1, size: 24635 },
{ ext: 'tfm', count: 17, size: 22144 },
{ ext: 'cls', count: 1, size: 20144 },
{ ext: 'clo', count: 1, size: 8448 },
{ ext: 'enc', count: 1, size: 2900 },
{ ext: 'fd', count: 1, size: 2470 },
{ ext: 'cfg', count: 2, size: 1902 },
],
user: [
{ ext: 'png', count: 2, size: 3886031 },
{ ext: 'tex', count: 1, size: 6147 },
{ ext: 'aux', count: 1, size: 1382 },
{ ext: 'bib', count: 1, size: 230 },
{ ext: 'bbl', count: 1, size: 203 },
],
total: {
fontFileCount: 0,
fontFileSize: 0,
imageFileCount: 2,
imageFileSize: 3886031,
otherFileCount: 2,
otherFileSize: 1585,
systemFileCount: 54,
systemFileSize: 13713315,
textFileCount: 2,
textFileSize: 6377,
},
})
})
})
})
@@ -0,0 +1,81 @@
# Fdb version 3
["bibtex output"] 1760016711 "output.aux" "output.bbl" "output" 1760016711
"/usr/local/texlive/2014/texmf-dist/bibtex/bst/base/apalike.bst" 1292289607 24635 604dafcc79f521a11ea73e506e1fbd98 ""
"output.aux" 1760016711 1080 1120b2c4bfc950ce767f3b27e61c9eab ""
"output.bcf" 0 -1 0 ""
"references.bib" 1760016710 230 a9ffc0446ebf8fd522116ce4ffea9c00 ""
(generated)
"output.bbl"
["pdflatex"] 1760016711 "main.tex" "/compile/output.pdf" "output" 1760016711
"/compile/output.aux" 1760016711 1080 1120b2c4bfc950ce767f3b27e61c9eab ""
"/usr/local/texlive/2014/texmf-dist/fonts/map/fontname/texfonts.map" 1272929888 3287 e6b82fe08f5336d4d5ebc73fb1152e87 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmbx10.tfm" 1136768653 1328 c834bbb027764024c09d3d2bf908b5f0 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmbx12.tfm" 1136768653 1324 c910af8c371558dc20f2d7822f66fe64 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmbx9.tfm" 1136768653 1328 5442e22a7072966dbaf88ca900acf3f0 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm" 1136768653 1524 4414a8315f39513458b80dfc63bff03a ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm" 1136768653 1512 f21f83efb36853c0b70002322c1ab3ad ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm" 1136768653 1520 eccf95517727cb11801f4f1aee3a21b4 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1136768653 1288 655e228510b4c2a1abe905c368440826 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmr17.tfm" 1136768653 1292 296a67155bdbfc32aa9c636f21e91433 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmr6.tfm" 1136768653 1300 b62933e007d01cfd073f79b963c01526 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmr8.tfm" 1136768653 1292 21c1c5bfeaebccffdb478fd231a0997d ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmr9.tfm" 1136768653 1292 6b21b9c2c7bebb38aa2273f7ca0fb3af ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1136768653 1124 6c73e740cf17375f03eec0ee63599741 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm" 1136768653 1116 933a60c408fc0a863a92debe84b2d294 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm" 1136768653 1120 8b7d695260f3cff42e636090a8002094 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmti10.tfm" 1136768653 1480 aa8e34af0eb6a2941b776984cf1dfdc4 ""
"/usr/local/texlive/2014/texmf-dist/fonts/tfm/public/cm/cmtt10.tfm" 1136768653 768 1321e9409b4137d6fb428ac9dc956269 ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb" 1248133631 34811 78b52f49e893bcba91bd7581cdc144c0 ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb" 1248133631 32080 340ef9bf63678554ee606688e7b5339d ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx9.pfb" 1248133631 32298 c6d25bb16d1eac01ebdc6d7084126a1e ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb" 1248133631 36299 5f9df58c2139e7edcf37c8fca4bd384d ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb" 1248133631 35752 024fb6c41858982481f6968b5fc26508 ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb" 1248133631 32722 d7379af29a190c3f453aba36302ff5a9 ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmr17.pfb" 1248133631 32362 179c33bbf43f19adbb3825bb4e36e57a ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb" 1248133631 32762 224316ccc9ad3ca0423a14971cfa7fc1 ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmr9.pfb" 1248133631 33993 9b89b85fd2d9df0482bd47194d1d3bf3 ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb" 1248133631 32569 5e5ddc8df908dea60932f3c484a54c0d ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb" 1248133631 37944 359e864bd06cde3b1cf57bb20757fb06 ""
"/usr/local/texlive/2014/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb" 1248133631 31099 c85edf1dd5b9e826d67c9c7293b6786c ""
"/usr/local/texlive/2014/texmf-dist/tex/context/base/supp-pdf.mkii" 1337017135 71627 94eb9990bed73c364d7f53f960cc8c5b ""
"/usr/local/texlive/2014/texmf-dist/tex/generic/ifxetex/ifxetex.sty" 1284331290 1458 43ab4710dc82f3edeabecd0d099626b2 ""
"/usr/local/texlive/2014/texmf-dist/tex/generic/oberdiek/etexcmds.sty" 1335995445 7612 c47308d923ec19888707b0f1792b326a ""
"/usr/local/texlive/2014/texmf-dist/tex/generic/oberdiek/ifluatex.sty" 1303254447 7324 11d14f318d865f420e692d4e6c9c18c3 ""
"/usr/local/texlive/2014/texmf-dist/tex/generic/oberdiek/ifpdf.sty" 1303254447 7140 ece2cc23d9f20e1f53975ac167f42d3e ""
"/usr/local/texlive/2014/texmf-dist/tex/generic/oberdiek/ifvtex.sty" 1335995445 6797 68c89f65e01894df882dd523d3fc0a8f ""
"/usr/local/texlive/2014/texmf-dist/tex/generic/oberdiek/infwarerr.sty" 1335995445 8253 3bdedc8409aa5d290a2339be6f09af03 ""
"/usr/local/texlive/2014/texmf-dist/tex/generic/oberdiek/kvdefinekeys.sty" 1335995445 5152 387d9200f396b498d5fd679ae44ed898 ""
"/usr/local/texlive/2014/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty" 1335995445 14040 8de9f47fabc4ca3bd69b6d795e32751c ""
"/usr/local/texlive/2014/texmf-dist/tex/generic/oberdiek/ltxcmds.sty" 1335995445 18425 775b341047ce304520cc7c11ca41392e ""
"/usr/local/texlive/2014/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty" 1335995445 19987 01cb2f3c1d21e5f05711b7fd50b17f2a ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/base/article.cls" 1415144112 20496 25b54d5a19c40eb011a68431975d83fe ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/base/omlcmr.fd" 1415144112 2045 283939c750107d9977e7c396d3f2e00d ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/base/omscmr.fd" 1415144112 2044 0c5bdb386a9131ba14472afc2c48653d ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/base/size10.clo" 1415144112 8967 2708205432f6a3ece9206e1f8d1214fb ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/geometry/geometry.sty" 1284422013 40502 e003406220954b0716679d7928aedd8a ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/graphics/graphics.sty" 1415923035 14189 66438d186cddf9823e0cb45858daca8c ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/graphics/graphicx.sty" 1415923035 7911 1cba3b04e7ab1f8ace99b431fca372ac ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/graphics/keyval.sty" 1415923035 2317 f0bb266f9d8a4fb51671d02627254c73 ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/graphics/trig.sty" 1156702488 3153 c50e6bd54d2dd3933fc52bcf369bec4a ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1279039959 678 4792914a8f45be57bb98413425e4c7af ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/latexconfig/graphics.cfg" 1278958963 3563 d35e897cae3b8c6848f6677b73370b54 ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty" 1303254447 12029 04d7fdf76e0464c23b5aa3a727952d7c ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/oberdiek/grfext.sty" 1335995445 7075 bd0c34fbf1ae8fd1debd2a554e41b2d5 ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/oberdiek/kvoptions.sty" 1335995445 22417 c74ff4af6a1aa2b65d1924020edbbe11 ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/pdftex-def/pdftex.def" 1306616590 55368 3c8a0d99822330f2dfabc0dfb09ce897 ""
"/usr/local/texlive/2014/texmf-dist/tex/latex/placeins/placeins.sty" 1137110565 4087 636308456f60d2b31cbf97867db5708d ""
"/usr/local/texlive/2014/texmf-dist/web2c/texmf.cnf" 1427202111 31813 278f393fac9aa1fe43accdd16bd9ad2b ""
"/usr/local/texlive/2014/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1427192307 1640970 6e9d9b9d0fb86fadb6e255a8bafce781 ""
"/usr/local/texlive/2014/texmf-var/web2c/pdftex/pdflatex.fmt" 1427192373 3847283 624656363f426539ed06bf4eb69090e1 ""
"/usr/local/texlive/2014/texmf.cnf" 1414518529 455 5b996dcaa0eb4ef14a83b026bc0a008c ""
"duck.png" 1760016710 1810070 a0706053cc7bbc4a9ba9f3143a935fa9 ""
"ducklings.png" 1760016710 2075961 c3f28212a57be365eeaaeb6dcf19e87c ""
"main.tex" 1760016710 6147 9da336eb1132ecb1d61cd1f5a70cfa62 ""
"output.aux" 1760016711 1080 1120b2c4bfc950ce767f3b27e61c9eab ""
"output.bbl" 1760016711 203 3852f6dfe7c9bace75cac514ada6c2e1 "bibtex output"
(generated)
"/compile/output.log"
"output.aux"
"output.pdf"
"output.log"
"/compile/output.pdf"
@@ -0,0 +1,73 @@
# Fdb version 4
["bibtex output"] 1760016358 "output.aux" "output.bbl" "output" 1760016467 0
"./references.bib" 1760016467 230 a9ffc0446ebf8fd522116ce4ffea9c00 ""
"/usr/local/texlive/2023/texmf-dist/bibtex/bst/base/apalike.bst" 1292289607 24635 604dafcc79f521a11ea73e506e1fbd98 ""
"output.aux" 1760016467 1382 704134ab1925e12d496665950786c3bf "pdflatex"
(generated)
"output.bbl"
"output.blg"
(rewritten before read)
["pdflatex"] 1760016467 "main.tex" "output.pdf" "output" 1760016467 0
"/usr/local/texlive/2023/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc" 1136849721 2900 1537cc8184ad1792082cd229ecc269f4 ""
"/usr/local/texlive/2023/texmf-dist/fonts/map/fontname/texfonts.map" 1577235249 3524 cb3e574dea2d1052e39280babc910dc8 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/jknappen/ec/tcrm1000.tfm" 1136768653 1536 e07581a4bb3136ece9eeb4c3ffab8233 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmbx10.tfm" 1136768653 1328 c834bbb027764024c09d3d2bf908b5f0 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmbx12.tfm" 1136768653 1324 c910af8c371558dc20f2d7822f66fe64 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmbx9.tfm" 1136768653 1328 5442e22a7072966dbaf88ca900acf3f0 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm" 1136768653 1524 4414a8315f39513458b80dfc63bff03a ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm" 1136768653 1512 f21f83efb36853c0b70002322c1ab3ad ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm" 1136768653 1520 eccf95517727cb11801f4f1aee3a21b4 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1136768653 1288 655e228510b4c2a1abe905c368440826 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmr17.tfm" 1136768653 1292 296a67155bdbfc32aa9c636f21e91433 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmr6.tfm" 1136768653 1300 b62933e007d01cfd073f79b963c01526 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmr8.tfm" 1136768653 1292 21c1c5bfeaebccffdb478fd231a0997d ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmr9.tfm" 1136768653 1292 6b21b9c2c7bebb38aa2273f7ca0fb3af ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1136768653 1124 6c73e740cf17375f03eec0ee63599741 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm" 1136768653 1116 933a60c408fc0a863a92debe84b2d294 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm" 1136768653 1120 8b7d695260f3cff42e636090a8002094 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmti10.tfm" 1136768653 1480 aa8e34af0eb6a2941b776984cf1dfdc4 ""
"/usr/local/texlive/2023/texmf-dist/fonts/tfm/public/cm/cmtt10.tfm" 1136768653 768 1321e9409b4137d6fb428ac9dc956269 ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb" 1248133631 34811 78b52f49e893bcba91bd7581cdc144c0 ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx12.pfb" 1248133631 32080 340ef9bf63678554ee606688e7b5339d ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx9.pfb" 1248133631 32298 c6d25bb16d1eac01ebdc6d7084126a1e ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb" 1248133631 36299 5f9df58c2139e7edcf37c8fca4bd384d ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb" 1248133631 35752 024fb6c41858982481f6968b5fc26508 ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmr12.pfb" 1248133631 32722 d7379af29a190c3f453aba36302ff5a9 ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmr17.pfb" 1248133631 32362 179c33bbf43f19adbb3825bb4e36e57a ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmr7.pfb" 1248133631 32762 224316ccc9ad3ca0423a14971cfa7fc1 ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmr9.pfb" 1248133631 33993 9b89b85fd2d9df0482bd47194d1d3bf3 ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10.pfb" 1248133631 32569 5e5ddc8df908dea60932f3c484a54c0d ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb" 1248133631 37944 359e864bd06cde3b1cf57bb20757fb06 ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb" 1248133631 31099 c85edf1dd5b9e826d67c9c7293b6786c ""
"/usr/local/texlive/2023/texmf-dist/fonts/type1/public/cm-super/sfrm1000.pfb" 1215737283 138258 6525c253f16cededa14c7fd0da7f67b2 ""
"/usr/local/texlive/2023/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1461363279 71627 94eb9990bed73c364d7f53f960cc8c5b ""
"/usr/local/texlive/2023/texmf-dist/tex/generic/iftex/iftex.sty" 1644112042 7237 bdd120a32c8fdb4b433cf9ca2e7cd98a ""
"/usr/local/texlive/2023/texmf-dist/tex/generic/iftex/ifvtex.sty" 1572645307 1057 525c2192b5febbd8c1f662c9468335bb ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/base/article.cls" 1686341992 20144 fbcf51733730d8f1a62143512ff5b1fe ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/base/omlcmr.fd" 1686341992 2470 6599b13c7da0906c887a7e3cfca75f4e ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/base/size10.clo" 1686341992 8448 74078c4a887f2cdcd57c3ec111622740 ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1579991033 13886 d1306dcf79a944f6988e688c1785f9ce ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/geometry/geometry.sty" 1578002852 41601 9cf6c5257b1bc7af01a58859749dd37a ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1465944070 1224 978390e9c2234eab29404bc21b268d1e ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/graphics-def/pdftex.def" 1663965824 19448 1e988b341dda20961a6b931bcde55519 ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphics.sty" 1654720880 18387 8f900a490197ebaf93c02ae9476d4b09 ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/graphicx.sty" 1654720880 8010 a8d949cbdbc5c983593827c9eec252e1 ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/keyval.sty" 1654720880 2671 7e67d78d9b88c845599a85b2d41f2e39 ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/graphics/trig.sty" 1654720880 4023 293ea1c16429fc0c4cf605f4da1791a9 ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def" 1681935207 29940 9473d58112bc8a88f5505b823a053dde ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1279039959 678 4792914a8f45be57bb98413425e4c7af ""
"/usr/local/texlive/2023/texmf-dist/tex/latex/placeins/placeins.sty" 1137110565 4087 636308456f60d2b31cbf97867db5708d ""
"/usr/local/texlive/2023/texmf-dist/web2c/texmf.cnf" 1681165822 40967 d940221f8762fd5848760382d97d1226 ""
"/usr/local/texlive/2023/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1691423502 4648652 0564963f60f2444ccc86ab709ed5cd6d ""
"/usr/local/texlive/2023/texmf-var/web2c/pdftex/pdflatex.fmt" 1693258675 8172536 79a4224afd68f9742750f1cc18a81fb8 ""
"/usr/local/texlive/2023/texmf.cnf" 1686916785 70 5459fb59cf354c6f7234715ba9bfff91 ""
"duck.png" 1760016467 1810070 a0706053cc7bbc4a9ba9f3143a935fa9 ""
"ducklings.png" 1760016467 2075961 c3f28212a57be365eeaaeb6dcf19e87c ""
"main.tex" 1760016467 6147 9da336eb1132ecb1d61cd1f5a70cfa62 ""
"output.aux" 1760016467 1382 704134ab1925e12d496665950786c3bf "pdflatex"
"output.bbl" 1760016359 203 3852f6dfe7c9bace75cac514ada6c2e1 "bibtex output"
(generated)
"output.aux"
"output.log"
"output.pdf"
(rewritten before read)