Identify each field by matching the common label synonyms (English / German / Chinese where applicable) listed in the schema descriptions and below. Preserve literal text; do NOT translate or reformat values beyond date-time normalization.

Reference / external-ID disambiguation:
- bookingNumber = the carrier's own booking ID for this shipment ('Booking No.', 'Booking Reference', 'Our Reference', 'Shipping Order No.', '订舱号'). Do NOT use the customer / forwarder reference (often labelled 'Your Reference', 'Customer Reference', 'Bkg Pty Ref', 'Forwarder Reference', or an 'S<digits>' shipment id).
- contractNumber = 'Service Contract' / 'Contract No.' / 'S/C' / 'Rate Agreement' / 'Quote' / '报价'. Do NOT use the customer S-number.
- mblNumber = 'Bill of Lading No.' / 'B/L No.' / 'SWB No.' / 'Sea Waybill' / 'Pre-Assigned BL No.'. Many booking confirmations do NOT print one — return null in that case; do NOT substitute bookingNumber or any internal reference.

Cut-off disambiguation (each cut-off is a distinct deadline — do NOT collapse):
- siCutOff = Shipping Instructions / B/L closing ('SI Cut-Off', 'Doc Cut-off', 'Shipping Instruction Deadline', 'Closing Date B/L').
- vgmCutOff = Verified Gross Mass / SOLAS deadline ('VGM Cut-off', 'SOLAS Cut-off', 'VGM Closing').
- cyCutOff = Container-yard / gate-in deadline ('CY Cut-off', 'Cargo Cut-off', 'Port Cut-Off', 'Gate-in by', '截关 日期/时间'). Do NOT use SI or VGM cut-offs here.
- cfsCutOff = LCL only ('CFS Cut-off'). Null for FCL.
- Ignore dates embedded in free-text 'Remarks' / 'Booking Remark' sections; always source cut-offs from the structured key/value rows.

Terminal disambiguation:
- gateInTerminal = origin terminal where the LOADED container is gated in ('Loading Terminal', 'Export Terminal', 'Gate-In Terminal', 'Full Return CY', 'Delivery Terminal'). NOT the empty-pickup depot.
- pickUpTerminal = destination terminal where the loaded container is gated out at the discharge port ('Import Terminal', 'Place of Delivery TML', 'Discharge Instructions' terminal name). Most layouts do NOT print this — return null. NOT a city; NOT a post-ocean inland address.

Reference fallbacks: REQUIRED FALLBACK pattern — when gateInReference / pickUpReference is not explicitly printed, set it to bookingNumber. Do NOT return null.

transportLegs rules:
- Ocean only. Each leg corresponds to ONE vessel segment, in chronological order. Inland pre/on-carriage (rail, truck, barge, feeder) must NOT be emitted — even when the carrier lists it in the same transport-plan table as the ocean legs. Identify inland rows by an explicit mode/segment-type column when present (e.g. 'Mode = MVS' for ocean vs 'RCO'/'RR'/'TRK'/'BAR'/'FED'/'FEE' for inland). When no mode column is printed, an empty vessel/voyage cell paired with an inland city is a secondary signal.
- 'Place of Receipt' / 'Receipt' (pre-carriage origin) and 'Place of Delivery' / 'Final Destination' (post-ocean inland delivery) are NOT ocean legs. The first leg's portOfLoading is the document's PORT OF LOADING (city); the last leg's portOfDischarge is the document's PORT OF DISCHARGE (city).
- Multi-leg trigger: any printed transhipment port ('Transhipment', 'T/S Port', '中转港', 'PORT OF TRANSHIPMENT N1/N2') signals an additional leg. Each transhipment city becomes the discharge of one leg and the loading of the next.
- Connectivity: leg N's portOfDischarge MUST equal leg N+1's portOfLoading. Final leg's portOfDischarge MUST equal the document's PORT OF DISCHARGE.
- Time integrity ('no time travel'): each leg's eta must be >= its etd, AND <= the next leg's etd.
- If a connecting vessel/voyage cell is blank but the leg is required to reach the final POD, still emit the leg with vesselName/voyage/imoNumber null.
- Port cells: strip UN/LOCODE prefix and terminal/facility suffix to keep the city only ('CNNGB (NINGBO)' → 'NINGBO'; 'Hamburg / Container Terminal Tollerort' → 'Hamburg').
- Vessel cells: when vessel and voyage are printed in one cell separated by ' / ' or whitespace, vesselName = portion before the separator(s), voyage = the FIRST voyage token after the vessel name. Drop any trailing local-call voyage and parenthetical noise (Lloyds No., service code, operator suffix).
- imoNumber: only emit when explicitly printed as an IMO / Lloyds number — never derive or guess.
- serviceCode: only emit when explicitly printed as a service / trade-lane code (e.g. 'AEU3', 'FE3'). Otherwise null.

containers rules:
- One entry per PHYSICAL container. Expand quantity rows: 'Qty = N', 'N x TYPE', 'N X TYPE' → N entries sharing the same containerType and pickUpDepot.
- containerType: read the size/type as printed (e.g. "40'HC", "42GP", "40 OT", "20' General Purpose Container").
- pickUpDepot: ONLY when a depot / terminal NAME is printed ('Empty Pick Up Depot', 'Empty Pickup Location', 'Pick up Place', '首选堆场'). If the value is just a city (e.g. 'GDANSK', 'NINGBO') without a specific depot identifier, return null. Do NOT use 'Full Return Location' (that is the loaded gate-in terminal).
- dropOffDepot: empty-return depot at destination. Rarely printed on booking confirmations — return null when absent.
