diff --git a/app/api/delRecord.json b/app/api/delRecord.json
index 9c25c84..2ec9d65 100644
--- a/app/api/delRecord.json
+++ b/app/api/delRecord.json
@@ -53,8 +53,7 @@
"name": "affected",
"type": "number"
}
- ],
- "output": true
+ ]
}
}
}
\ No newline at end of file
diff --git a/app/api/insert.json b/app/api/insert.json
index 574aef4..23d4926 100644
--- a/app/api/insert.json
+++ b/app/api/insert.json
@@ -1,25 +1,39 @@
{
"meta": {
+ "options": {
+ "linkedFile": "/views/index.ejs",
+ "linkedForm": "serverconnectform1"
+ },
"$_POST": [
{
"type": "text",
+ "fieldName": "db_fullName",
"name": "db_fullName"
},
{
"type": "text",
+ "fieldName": "db_licenseNumber",
"name": "db_licenseNumber"
},
- {
- "type": "text",
- "name": "db_stateIssue"
- },
{
"type": "number",
+ "fieldName": "db_employeeID",
+ "options": {
+ "rules": {
+ "core:number": {}
+ }
+ },
"name": "db_employeeID"
},
{
"type": "text",
+ "fieldName": "owner",
"name": "owner"
+ },
+ {
+ "type": "text",
+ "fieldName": "db_stateIssue",
+ "name": "db_stateIssue"
}
]
},
@@ -110,7 +124,8 @@
"name": "affected",
"type": "number"
}
- ]
+ ],
+ "output": true
}
}
}
\ No newline at end of file
diff --git a/public/ERTSQlite.db b/public/ERTSQlite.db
index 1929344..f0c44c5 100644
Binary files a/public/ERTSQlite.db and b/public/ERTSQlite.db differ
diff --git a/public/PDF/dbMap.js b/public/PDF/dbMap.js
new file mode 100644
index 0000000..ad9b2ae
--- /dev/null
+++ b/public/PDF/dbMap.js
@@ -0,0 +1,20 @@
+// JavaScript Document
+// map to create substitution to match the Datasource field => PDF Field name
+// [DataSource Field, PDF Field]
+const map = new Map([
+ ['a', 1],
+ ['b', 2],
+ ['c', 3]
+]);
+
+map.set('key', 'value') // sets 'key' to = 'value' in Map object name map
+
+const m = map.get('key') // returns value
+
+function getValueByKey(map, key) {
+ const entry = [...map].find(([k, v]) => k === key);
+ return entry ? entry[1] : undefined;
+}
+
+const keyToFind = 'b';
+const value = getValueByKey(map, keyToFind); // Returns 2
\ No newline at end of file
diff --git a/public/PDF/dummyFunctions.js b/public/PDF/dummyFunctions.js
new file mode 100644
index 0000000..0b4c781
--- /dev/null
+++ b/public/PDF/dummyFunctions.js
@@ -0,0 +1,22 @@
+// JavaScript Document
+
+function myFunction() {
+ let myVar = 'Hello, Wappler!';
+ return myVar;
+}
+
+function runMyFunction() {
+ // alert("function run")
+ let result = generateRandomIdentifier(9);
+ // Use Wappler dmx.set to bind result to a Wappler variable if needed
+ //
{{myResult}}
+ console.log(result)
+ dmx.global.set('myResult', result);
+
+}
+async function toBase64(filePath) {
+ const img = await fetch(filePath).then(res => res.arrayBuffer())
+ console.log(img)
+ dmx.global.set('imgResult', img)
+ return img
+}
\ No newline at end of file
diff --git a/public/PDF/jsPDF.js b/public/PDF/jsPDF.js
new file mode 100644
index 0000000..a433c94
--- /dev/null
+++ b/public/PDF/jsPDF.js
@@ -0,0 +1,42 @@
+async function updatePdfFields(pdfBytes, dataSource) {
+ // Load the PDF document
+ const pdfDoc = await PDFDocument.load(pdfBytes);
+ const form = pdfDoc.getForm();
+
+ // Loop over each record in the Wappler data source
+ dataSource.forEach((record) => {
+ // Loop over each key-value pair in the record
+ Object.entries(record).forEach(([fieldName, fieldValue]) => {
+ // Find the form field in the PDF by name
+ const formField = form.getTextField(fieldName);
+
+ // If the field exists in the PDF, update it with the value
+ if (formField) {
+ formField.setText(String(fieldValue));
+ }
+ });
+ });
+
+ // Serialize the PDF back to bytes and return
+ const updatedPdfBytes = await pdfDoc.save();
+ return updatedPdfBytes;
+}
+
+// Usage Example
+async function main() {
+ // Load your PDF as bytes (e.g., using fetch)
+ const pdfBytes = await fetch("path/to/your.pdf").then((res) =>
+ res.arrayBuffer()
+ );
+
+ // Sample data source from Wappler
+ const dataSource = [
+ { fieldName1: "Value1", fieldName2: "Value2" },
+ { fieldName1: "AnotherValue1", fieldName2: "AnotherValue2" },
+ ];
+
+ // Call the function to update the PDF fields
+ const updatedPdfBytes = await updatePdfFields(pdfBytes, dataSource);
+
+ // Do something with the updated PDF, e.g., download it or display it
+}
diff --git a/public/PDF/libPDFscripts.js b/public/PDF/libPDFscripts.js
new file mode 100644
index 0000000..b4435dd
--- /dev/null
+++ b/public/PDF/libPDFscripts.js
@@ -0,0 +1,101 @@
+// JavaScript Document
+
+//Use this function as a start - to pass the path, then datasource to update with pdfbytes, then download -- Maybe combine into one file?
+//wich is more efficient?
+
+//filepath = /PDF/XXX.pdf, dataSource = datastore.var
+// *** Use of 'rest paramater' syntax to add extra datasources at the end.
+//return array of datasources i.e [datastore,data_view1] and pass that array to updatePdfFields
+//Consider default values = filepath = '/PDF/masterTemplate.pdf'
+async function toBase64(filePath, ...dataSources) {
+ console.log(filePath);
+ const pdfBytes = await fetch(filePath).then((res) => res.arrayBuffer());
+
+ // console.log(dataSources); // should be only 2,
+ updatePdfFields(pdfBytes, dataSources);
+
+ //return pdfBytes
+}
+
+async function updatePdfFields(pdfBytes, dataSources) {
+ // Load the PDF document
+ console.log("pdfBytes.size =", pdfBytes.byteLength);
+ console.log(dataSources);
+ const pdfDoc = await PDFLib.PDFDocument.load(pdfBytes);
+ const form = pdfDoc.getForm();
+
+ // Loop over each data source passed to the function
+ dataSources.forEach((dataSource) => {
+ // Loop over each record in the current data source
+ dataSource.forEach((record) => {
+ // Loop over each key-value pair in the record
+ Object.entries(record).forEach(([fieldName, fieldValue]) => {
+ console.log(fieldName, " => ", fieldValue);
+
+ // Find the form field in the PDF by name
+ /** !!! BLOCK 1 Start
+ const formField = form.getTextField(fieldName);
+ // If the field exists in the PDF, update it with the value
+ if (formField) {
+ formField.setText(String(fieldValue));
+ }
+ **/ // BLOCK 1 END
+ });
+ });
+ });
+
+ // Serialize the PDF back to bytes
+ const updatedPdfBytes = await pdfDoc.save();
+
+ // Trigger download of the updated PDF
+ downloadPdf(updatedPdfBytes, "UpdatedDocument.pdf");
+}
+
+// Function to trigger download of the updated PDF
+function downloadPdf(pdfBytes, fileName) {
+ // Create a Blob from the PDF bytes
+ const blob = new Blob([pdfBytes], { type: "application/pdf" });
+ const url = URL.createObjectURL(blob);
+
+ // Create a link element for the download
+ const link = document.createElement("a");
+ link.href = url;
+ link.download = fileName;
+
+ // Append the link to the document, trigger a click, and remove it afterward
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+
+ // Release the object URL to free up memory
+ URL.revokeObjectURL(url);
+}
+
+// Usage Example
+async function main() {
+ // Load your PDF as bytes (e.g., using fetch)
+ const pdfBytes = await fetch("path/to/your.pdf").then((res) =>
+ res.arrayBuffer()
+ );
+
+ // Sample data sources from Wappler
+ const dataSource1 = [{ fieldName1: "Value1", fieldName2: "Value2" }];
+ const dataSource2 = [
+ { fieldName3: "AnotherValue1", fieldName4: "AnotherValue2" },
+ ];
+
+ // Call the function with multiple data sources
+ await updatePdfFields(pdfBytes, dataSource1, dataSource2);
+}
+
+function generateRandomFilename() {
+ const characters =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ let filename = "";
+ for (let i = 0; i < 8; i++) {
+ const randomIndex = Math.floor(Math.random() * characters.length);
+ filename += characters[randomIndex];
+ }
+ console.log("Random Filename: ", filename);
+ return filename;
+}
diff --git a/public/PDF/pdfLibSignature.js b/public/PDF/pdfLibSignature.js
new file mode 100644
index 0000000..446ae31
--- /dev/null
+++ b/public/PDF/pdfLibSignature.js
@@ -0,0 +1,88 @@
+// JavaScript Document v1.2
+
+const canvas = document.getElementById('signatureCanvas');
+const ctx = canvas.getContext('2d');
+let drawing = false;
+
+function myTestFunction(variable1, variable2) {
+ console.log(variable1, variable2);
+ // Your logic here
+}
+// Get the canvas element
+
+
+// Function to get the canvas offset
+function getCanvasOffset() {
+ const rect = canvas.getBoundingClientRect();
+ //console.log("offsetX:",rect.left, " OffsetY:",rect.top)
+ return {
+ offsetX: rect.left,
+ offsetY: rect.top
+ };
+}
+
+
+function clearCanvas() {
+ console.log("Clear Signature area")
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+}
+
+function startDrawing(e) {
+ console.log("Start Signature Capture")
+ //console.log(e)
+ drawing = true;
+ draw(e);
+}
+
+function endDrawing() {
+ console.log("Stopped Signature Capture")
+ drawing = false;
+ ctx.beginPath();
+}
+
+function draw(e) {
+ //console.log(e)
+ if (!drawing) return;
+ ctx.lineWidth = 2;
+ ctx.lineCap = 'round';
+ ctx.strokeStyle = '#000';
+
+ const { offsetX, offsetY } = getCanvasOffset();
+ let x = e.clientX - offsetX //canvas.offsetLeft;
+ let y = e.clientY - offsetY //canvas.offsetTop;
+ //console.log("X:",x," Y:",y)
+
+ //let x = e.clientX - canvas.offsetLeft;
+ //let y = e.clientY - canvas.offsetTop;
+ //console.log("X:", x, " Y:", y)
+ ctx.lineTo(x, y);
+ ctx.stroke();
+ ctx.beginPath();
+ ctx.moveTo(x, y);
+}
+
+
+function generateRandomIdentifier(size) {
+
+ if (size > 20) {
+ let size = 20
+ console.log("randomIdentifier Exceeded max len of 20. Defaults to 20 ")
+ }
+ const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+ let randIdentifier = '';
+ for (let i = 0; i < size; i++) {
+ const randomIndex = Math.floor(Math.random() * characters.length);
+ randIdentifier += characters[randomIndex];
+ }
+ console.log("Random randIdentifier: ", randIdentifier);
+ return randIdentifier;
+}
+//canvas.addEventListener('mousedown', startDrawing);
+//canvas.addEventListener('mouseup', endDrawing);
+//canvas.addEventListener('mousemove', draw);
+
+// ** TOUCH EVENT LISTNERS FOR TABLETS
+
+//canvas.addEventListener('touchstart', (e) => startDrawing(e.touches[0]));
+//canvas.addEventListener('touchend', endDrawing);
+//canvas.addEventListener('touchmove', (e) => draw(e.touches[0]));
\ No newline at end of file
diff --git a/public/PDF/pdfScripts.js b/public/PDF/pdfScripts.js
new file mode 100644
index 0000000..d628977
--- /dev/null
+++ b/public/PDF/pdfScripts.js
@@ -0,0 +1,43 @@
+// JavaScript Document
+
+//import { PDFDocument } from 'pdf-lib'
+
+//http://localhost:8100/assets/pdf/testpdf.pdf
+async function fillform() {
+ const formURL = "/assets/pdf/testpdf.pdf";
+ const formPdfBytes = await fetch(formURL).then((res) => res.arrayBuffer());
+ const pdfdoc = await PDFDocument.load(formPdfBytes);
+}
+
+function myTestFunction(variable1, variable2) {
+ console.log(variable1, variable2);
+ // Your logic here
+}
+
+//Use this function wihouth the http to pull from remote host.
+async function pullPDF() {
+ // IDEA: Load all the possible methods and calls in one run then you can expose to Wappler for processing. As long as the dmx.set function will work
+
+ const formUrl = "/assets/PDFdemo.pdf"; //'https://pdf-lib.js.org/assets/dod_character.pdf'
+ const formPdfBytes = await fetch(formUrl).then((res) => res.arrayBuffer());
+ const pdfDoc = await PDFLib.PDFDocument.load(formPdfBytes);
+ const form = pdfDoc.getForm();
+
+ console.log("Size of pdf:", formPdfBytes.byteLength);
+
+ const fieldnames = []; //empty array to assign each field name to.
+ const fields = form.getFields();
+
+ fields.forEach((field) => {
+ const name = field.getName();
+ fieldnames.push(name);
+ console.log("Field name:", name);
+ });
+
+ console.log("First field name:", fields[0].getName());
+
+ console.log(fieldnames);
+ // dmx.set('fieldsList', fieldnames)
+ console.log("Size of pdf:", pdfObjects[1].byteLength);
+ const pdfObjects = [formUrl, formPdfBytes, pdfDoc, form, form.getFields()];
+}
diff --git a/public/PDF/test-Copy.pdf b/public/PDF/test-Copy.pdf
new file mode 100644
index 0000000..cc3bde6
--- /dev/null
+++ b/public/PDF/test-Copy.pdf
@@ -0,0 +1,10293 @@
+%PDF-1.6
+%
+1 0 obj
+<<
+/AcroForm 2 0 R
+/Lang
+/MarkInfo <<
+/Marked true
+>>
+/Metadata 3 0 R
+/Outlines 4 0 R
+/PageLayout /OneColumn
+/Pages 5 0 R
+/StructTreeRoot 6 0 R
+/Type /Catalog
+>>
+endobj
+7 0 obj
+<<
+/Author (Waller, Becky)
+/Company (Amazon)
+/Created (D:20210823)
+/CreationDate (D:20240204081438-06'00')
+/Creator (Acrobat PDFMaker 23 for Word)
+/LastSaved (D:20230625)
+/ModDate (D:20240804235645-05'00')
+/Producer (Adobe PDF Library 23.8.246)
+/SourceModified (D:20240204141231)
+/Title ()
+>>
+endobj
+2 0 obj
+<<
+/DA (/Helv 0 Tf 0 g )
+/DR <<
+/Encoding <<
+/PDFDocEncoding 8 0 R
+>>
+/Font <<
+/Helv 9 0 R
+/ZaDb 10 0 R
+>>
+>>
+/Fields [11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R]
+/SigFlags 0
+>>
+endobj
+3 0 obj
+<<
+/Length 4013
+/Subtype /XML
+/Type /Metadata
+>>
+stream
+
+
+
+
+ 2024-08-04T23:56:45-05:00
+ 2024-02-04T08:14:38-06:00
+ 2024-08-04T23:56:45-05:00
+ Acrobat PDFMaker 23 for Word
+ uuid:02a43b6b-826f-4dc4-996d-8fd130fae006
+ uuid:5c097d4d-e21a-479f-b8e6-b8ded29445af
+
+
+ 3
+
+
+ application/pdf
+
+
+
+
+
+
+
+ Waller, Becky
+
+
+ Adobe PDF Library 23.8.246
+ D:20240204141231
+ Amazon
+ D:20210823
+ D:20230625
+ 1
+ 1.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+endstream
+endobj
+4 0 obj
+<<
+/Count 15
+/First 19 0 R
+/Last 20 0 R
+/Type /Outlines
+>>
+endobj
+5 0 obj
+<<
+/Count 6
+/Kids [21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R]
+/Type /Pages
+>>
+endobj
+6 0 obj
+<<
+/K 27 0 R
+/Namespaces [28 0 R]
+/ParentTree 29 0 R
+/ParentTreeNextKey 8
+/RoleMap 30 0 R
+/Type /StructTreeRoot
+>>
+endobj
+8 0 obj
+<<
+/Differences [24 /breve /caron /circumflex /dotaccent /hungarumlaut /ogonek /ring /tilde 39
+/quotesingle 96 /grave 128 /bullet /dagger /daggerdbl /ellipsis /emdash /endash
+/florin /fraction /guilsinglleft /guilsinglright /minus /perthousand /quotedblbase /quotedblleft /quotedblright /quoteleft
+/quoteright /quotesinglbase /trademark /fi /fl /Lslash /OE /Scaron /Ydieresis /Zcaron
+/dotlessi /lslash /oe /scaron /zcaron 160 /Euro 164 /currency 166
+/brokenbar 168 /dieresis /copyright /ordfeminine 172 /logicalnot /.notdef /registered /macron
+/degree /plusminus /twosuperior /threesuperior /acute /mu 183 /periodcentered /cedilla /onesuperior
+/ordmasculine 188 /onequarter /onehalf /threequarters 192 /Agrave /Aacute /Acircumflex /Atilde
+/Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute
+/Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
+/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute
+/acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis
+/igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde
+/odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis]
+/Type /Encoding
+>>
+endobj
+9 0 obj
+<<
+/BaseFont /Helvetica
+/Encoding 8 0 R
+/Name /Helv
+/Subtype /Type1
+/Type /Font
+>>
+endobj
+10 0 obj
+<<
+/BaseFont /ZapfDingbats
+/Name /ZaDb
+/Subtype /Type1
+/Type /Font
+>>
+endobj
+11 0 obj
+<<
+/DA (/Helv 12 Tf 0 g)
+/DV (0)
+/FT /Tx
+/Kids [31 0 R]
+/T (DOT-English)
+/TU (English Language Profency)
+/V (0)
+>>
+endobj
+12 0 obj
+<<
+/DA (/Helv 12 Tf 0 g)
+/F 4
+/FT /Tx
+/MK <<
+>>
+/P 21 0 R
+/Rect [121.205 696.251 271.205 718.251]
+/Subtype /Widget
+/T (DSP_ShortCode)
+/Type /Annot
+>>
+endobj
+13 0 obj
+<<
+/AP <<
+/N 32 0 R
+>>
+/DA (/Helv 12 Tf 0 g)
+/F 4
+/FT /Tx
+/MK <<
+>>
+/P 21 0 R
+/Rect [387.343 696.251 537.343 718.251]
+/Subtype /Widget
+/T (CurrentDate)
+/Type /Annot
+/V (April--- 2024)
+>>
+endobj
+14 0 obj
+<<
+/DA (/Helv 12 Tf 0 g)
+/F 4
+/FT /Tx
+/MK <<
+>>
+/P 21 0 R
+/Rect [120.564 665.469 270.564 687.469]
+/Subtype /Widget
+/T (DA_Name)
+/Type /Annot
+>>
+endobj
+15 0 obj
+<<
+/DA (/Helv 12 Tf 0 g)
+/F 4
+/FT /Tx
+/MK <<
+>>
+/P 21 0 R
+/Rect [387.984 664.827 537.984 686.827]
+/Subtype /Widget
+/T (SoftID)
+/Type /Annot
+>>
+endobj
+16 0 obj
+<<
+/DA (/Helv 12 Tf 0 g)
+/F 4
+/FT /Tx
+/MK <<
+>>
+/P 21 0 R
+/Rect [170.585 574.405 320.585 596.405]
+/Subtype /Widget
+/T (DriverLicenseNumber)
+/Type /Annot
+>>
+endobj
+17 0 obj
+<<
+/AP <<
+/N 33 0 R
+>>
+/DA (/Helv 12 Tf 0 g)
+/DV (DDX6)
+/F 4
+/FT /Tx
+/MK <<
+>>
+/P 21 0 R
+/Rect [487.011 573.763 572.881 595.763]
+/Subtype /Widget
+/T (LicenseIssueState)
+/Type /Annot
+/V (DDX6)
+>>
+endobj
+18 0 obj
+<<
+/DA (/Helv 12 Tf 0 g)
+/F 4
+/FT /Tx
+/MK <<
+>>
+/P 21 0 R
+/Rect [388.626 619.295 538.626 641.295]
+/Subtype /Widget
+/T (StationCode)
+/Type /Annot
+>>
+endobj
+19 0 obj
+<<
+/Next 34 0 R
+/Parent 4 0 R
+/Title (Enhanced Road Test Overview)
+>>
+endobj
+20 0 obj
+<<
+/A 35 0 R
+/Count 6
+/First 36 0 R
+/Last 37 0 R
+/Parent 4 0 R
+/Prev 38 0 R
+/Title (Enhanced Road Test Evaluation)
+>>
+endobj
+21 0 obj
+<<
+/Annots [31 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R]
+/Contents [39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R]
+/CropBox [0.0 0.0 612.0 792.0]
+/Group 47 0 R
+/MediaBox [0.0 0.0 612.0 792.0]
+/Parent 5 0 R
+/Resources <<
+/ExtGState <<
+/GS0 48 0 R
+>>
+/Font <<
+/TT0 49 0 R
+/TT1 50 0 R
+/TT2 51 0 R
+/TT3 52 0 R
+/TT4 53 0 R
+>>
+/ProcSet [/PDF /Text /ImageC]
+/XObject <<
+/Im0 54 0 R
+>>
+>>
+/Rotate 0
+/StructParents 2
+/Tabs /S
+/Type /Page
+>>
+endobj
+22 0 obj
+<<
+/Contents 55 0 R
+/CropBox [0.0 0.0 612.0 792.0]
+/Group 47 0 R
+/MediaBox [0.0 0.0 612.0 792.0]
+/Parent 5 0 R
+/Resources <<
+/ExtGState <<
+/GS0 48 0 R
+>>
+/Font <<
+/TT0 49 0 R
+/TT1 50 0 R
+/TT2 56 0 R
+/TT3 53 0 R
+/TT4 57 0 R
+/TT5 51 0 R
+>>
+/ProcSet [/PDF /Text /ImageC]
+/XObject <<
+/Im0 54 0 R
+>>
+>>
+/Rotate 0
+/StructParents 3
+/Tabs /S
+/Type /Page
+>>
+endobj
+23 0 obj
+<<
+/Contents 58 0 R
+/CropBox [0.0 0.0 612.0 792.0]
+/Group 47 0 R
+/MediaBox [0.0 0.0 612.0 792.0]
+/Parent 5 0 R
+/Resources <<
+/ExtGState <<
+/GS0 48 0 R
+>>
+/Font <<
+/TT0 49 0 R
+/TT1 50 0 R
+/TT2 56 0 R
+/TT3 53 0 R
+/TT4 51 0 R
+/TT5 52 0 R
+/TT6 57 0 R
+>>
+/ProcSet [/PDF /Text /ImageC]
+/XObject <<
+/Im0 54 0 R
+>>
+>>
+/Rotate 0
+/StructParents 4
+/Tabs /S
+/Type /Page
+>>
+endobj
+24 0 obj
+<<
+/Contents 59 0 R
+/CropBox [0.0 0.0 612.0 792.0]
+/Group 47 0 R
+/MediaBox [0.0 0.0 612.0 792.0]
+/Parent 5 0 R
+/Resources <<
+/ExtGState <<
+/GS0 48 0 R
+>>
+/Font <<
+/TT0 49 0 R
+/TT1 50 0 R
+/TT2 56 0 R
+/TT3 53 0 R
+/TT4 57 0 R
+/TT5 51 0 R
+/TT6 52 0 R
+>>
+/ProcSet [/PDF /Text /ImageC]
+/XObject <<
+/Im0 54 0 R
+>>
+>>
+/Rotate 0
+/StructParents 5
+/Tabs /S
+/Type /Page
+>>
+endobj
+25 0 obj
+<<
+/Contents 60 0 R
+/CropBox [0.0 0.0 612.0 792.0]
+/Group 47 0 R
+/MediaBox [0.0 0.0 612.0 792.0]
+/Parent 5 0 R
+/Resources <<
+/ExtGState <<
+/GS0 48 0 R
+>>
+/Font <<
+/TT0 49 0 R
+/TT1 50 0 R
+/TT2 56 0 R
+/TT3 53 0 R
+/TT4 51 0 R
+>>
+/ProcSet [/PDF /Text /ImageC]
+/XObject <<
+/Im0 54 0 R
+>>
+>>
+/Rotate 0
+/StructParents 6
+/Tabs /S
+/Type /Page
+>>
+endobj
+26 0 obj
+<<
+/Contents 61 0 R
+/CropBox [0.0 0.0 612.0 792.0]
+/Group 47 0 R
+/MediaBox [0.0 0.0 612.0 792.0]
+/Parent 5 0 R
+/Resources <<
+/ExtGState <<
+/GS0 48 0 R
+>>
+/Font <<
+/TT0 49 0 R
+/TT1 50 0 R
+/TT2 56 0 R
+/TT3 51 0 R
+/TT4 53 0 R
+/TT5 52 0 R
+>>
+/ProcSet [/PDF /Text /ImageC]
+/XObject <<
+/Im0 54 0 R
+>>
+>>
+/Rotate 0
+/StructParents 7
+/Tabs /S
+/Type /Page
+>>
+endobj
+27 0 obj
+<<
+/K 62 0 R
+/NS 28 0 R
+/P 6 0 R
+/S /Document
+>>
+endobj
+28 0 obj
+<<
+/NS (http://iso.org/pdf2/ssn)
+/Type /Namespace
+>>
+endobj
+29 0 obj
+<<
+/Nums [2 [63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R null null
+null null null 71 0 R 72 0 R null 73 0 R 74 0 R 75 0 R 76 0 R
+77 0 R 78 0 R 79 0 R 80 0 R null 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R
+86 0 R 87 0 R 88 0 R null 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R
+95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R null null null
+null null 102 0 R 103 0 R null 104 0 R null null 105 0 R 106 0 R
+null null null null null 107 0 R null 108 0 R null null
+null null 109 0 R null null 110 0 R null null null null
+111 0 R null 112 0 R null 113 0 R null null null 114 0 R 115 0 R
+null 116 0 R 117 0 R null 118 0 R null null null 119 0 R 120 0 R
+null 121 0 R 122 0 R null 123 0 R null null null 124 0 R 125 0 R
+null 126 0 R 127 0 R null 128 0 R null null null 129 0 R 130 0 R
+131 0 R 132 0 R 133 0 R 134 0 R null 135 0 R null null null 136 0 R
+137 0 R null 138 0 R 139 0 R null 140 0 R null null null 141 0 R
+142 0 R 143 0 R null 144 0 R 145 0 R 146 0 R null 147 0 R null null
+null 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 155 0 R
+156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 163 0 R 164 0 R
+164 0 R 164 0 R 165 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R
+172 0 R 173 0 R 174 0 R]
+ 3 [175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R
+185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R
+195 0 R 196 0 R 197 0 R 198 0 R 199 0 R null null null null null
+200 0 R 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R
+210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R
+220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R
+null null null null null 230 0 R 231 0 R null 232 0 R null
+233 0 R 234 0 R null 235 0 R null 236 0 R 237 0 R null 238 0 R null
+239 0 R 240 0 R null 241 0 R null 242 0 R 243 0 R null null null
+null null 244 0 R 245 0 R null 246 0 R null 247 0 R 248 0 R null
+249 0 R null 250 0 R 251 0 R null 252 0 R null 253 0 R 254 0 R null
+null null null null 255 0 R 256 0 R null 257 0 R null 258 0 R
+259 0 R null 260 0 R null 261 0 R 262 0 R null 263 0 R null 264 0 R
+265 0 R null 266 0 R null 267 0 R 268 0 R null 269 0 R null 270 0 R
+271 0 R null 272 0 R null 273 0 R 274 0 R null 275 0 R null 276 0 R
+277 0 R null null null null null 278 0 R 279 0 R 280 0 R 281 0 R
+282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R
+292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R
+302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R
+312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R]
+ 4 [321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R
+331 0 R 332 0 R 333 0 R null 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R
+340 0 R 341 0 R 342 0 R 343 0 R 344 0 R 345 0 R 346 0 R 347 0 R null null
+null null null 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R
+355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R null null null
+null null 362 0 R 363 0 R null 364 0 R null 365 0 R 366 0 R null
+367 0 R null 368 0 R 369 0 R null 370 0 R null 371 0 R 372 0 R null
+null null null null 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R
+379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R
+389 0 R 390 0 R 391 0 R 392 0 R null null null null null 393 0 R
+394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R
+null null null null null 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R
+409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R
+419 0 R 420 0 R 421 0 R 422 0 R]
+ 5 [423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R
+433 0 R 434 0 R 435 0 R null null null null null 436 0 R 437 0 R
+438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R
+448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R
+458 0 R 459 0 R 460 0 R 461 0 R 462 0 R null null null null null
+463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R
+473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R null null null
+null null 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R
+488 0 R 489 0 R 490 0 R null 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R
+497 0 R 498 0 R 499 0 R 500 0 R null null null null null 501 0 R
+502 0 R null 503 0 R null 504 0 R 505 0 R null 506 0 R null 507 0 R
+508 0 R null 509 0 R null 510 0 R 511 0 R null 512 0 R null 513 0 R
+514 0 R null null null null null 515 0 R 516 0 R null 517 0 R
+null 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R 526 0 R
+527 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R]
+ 6 [535 0 R null 536 0 R null 537 0 R 538 0 R null 539 0 R null 540 0 R
+541 0 R null 542 0 R null 543 0 R 544 0 R null 545 0 R 546 0 R 547 0 R
+548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R null 554 0 R 555 0 R 556 0 R
+557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R
+567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R
+577 0 R 578 0 R 579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R 586 0 R
+587 0 R 588 0 R 589 0 R 590 0 R 591 0 R 592 0 R 593 0 R 594 0 R 595 0 R 596 0 R
+597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R 605 0 R 606 0 R
+606 0 R 607 0 R 608 0 R 608 0 R 609 0 R 610 0 R]
+7 [611 0 R 612 0 R 613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R
+621 0 R 622 0 R 623 0 R 624 0 R 625 0 R 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R
+631 0 R null 632 0 R 633 0 R 634 0 R 635 0 R 636 0 R 637 0 R 638 0 R null
+639 0 R 640 0 R null 641 0 R 642 0 R 643 0 R 644 0 R 645 0 R 646 0 R 647 0 R
+648 0 R 649 0 R 650 0 R 651 0 R 652 0 R 653 0 R 654 0 R 655 0 R 656 0 R 657 0 R
+658 0 R]
+]
+>>
+endobj
+30 0 obj
+<<
+/Annotation /Span
+/Artifact /P
+/Bibliography /BibEntry
+/Chart /Figure
+/Diagram /Figure
+/DropCap /Figure
+/Endnote /Note
+/Footnote /Note
+/InlineShape /Figure
+/Outline /Span
+/Strikeout /Span
+/Subscript /Span
+/Superscript /Span
+/TextBox /Art
+/Underline /Span
+>>
+endobj
+31 0 obj
+<<
+/AP <<
+/N 659 0 R
+>>
+/F 4
+/MK <<
+>>
+/P 21 0 R
+/Parent 11 0 R
+/Rect [32.2761 367.169 92.2754 381.721]
+/Subtype /Widget
+/Type /Annot
+>>
+endobj
+32 0 obj
+<<
+/Length 104
+/BBox [0.0 0.0 150.0 22.0]
+/FormType 1
+/Matrix [1.0 0.0 0.0 1.0 0.0 0.0]
+/Resources <<
+/Font <<
+/Helv 9 0 R
+>>
+/ProcSet [/PDF /Text]
+>>
+/Subtype /Form
+/Type /XObject
+>>
+stream
+/Tx BMC
+
+q
+1 1 148 20 re
+W
+n
+BT
+/Helv 12 Tf
+/DeviceGray cs
+0 sc
+2 6.692 Td
+(April--- 2024) Tj
+ET
+Q
+EMC
+
+
+endstream
+endobj
+33 0 obj
+<<
+/Length 82
+/BBox [0.0 0.0 85.8704 22.0]
+/FormType 1
+/Matrix [1.0 0.0 0.0 1.0 0.0 0.0]
+/Resources <<
+/Font <<
+/Helv 9 0 R
+>>
+/ProcSet [/PDF /Text]
+>>
+/Subtype /Form
+/Type /XObject
+>>
+stream
+/Tx BMC
+q
+1 1 83.8704 20 re
+W
+n
+BT
+/Helv 12 Tf
+0 g
+2 6.548 Td
+(DDX6) Tj
+ET
+Q
+EMC
+
+endstream
+endobj
+34 0 obj
+<<
+/Count 4
+/First 660 0 R
+/Last 661 0 R
+/Next 38 0 R
+/Parent 4 0 R
+/Prev 19 0 R
+/Title (Evaluation Instructions)
+>>
+endobj
+35 0 obj
+<<
+/D [21 0 R /XYZ 34 477 0.0]
+/S /GoTo
+>>
+endobj
+36 0 obj
+<<
+/A 662 0 R
+/Next 663 0 R
+/Parent 20 0 R
+/Title (Section I: English Language Proficiency for DOT Vehicles \(Only if applicable\))
+>>
+endobj
+37 0 obj
+<<
+/A 664 0 R
+/Parent 20 0 R
+/Prev 665 0 R
+/Title (Notes)
+>>
+endobj
+38 0 obj
+<<
+/Count 1
+/First 666 0 R
+/Last 666 0 R
+/Next 20 0 R
+/Parent 4 0 R
+/Prev 34 0 R
+/Title (DT Script)
+>>
+endobj
+39 0 obj
+<<
+/Length 1348
+/Filter /FlateDecode
+>>
+stream
+HWnF}W# +\XShP&%,Yj-ґ.ݥ(6r̙3Ѧ[-^ut_dTi4Dka`J1`-tVvjQoU3Vm_O!*)A[+lVf}&Ѩ3P/4Yx _)A.E^@&i4I