{
  "version": 3,
  "sources": ["/cdn/shop/t/48/assets/pt-tire-parse.js?cb=1779509198252167000"],
  "sourcesContent": ["/* Prince Tires \u2014 shared tire-size parser + search analytics.\n   Single source of truth. Loaded globally; exposes window.PTTireParse. */\n(function (root) {\n  'use strict';\n\n  // Flotation section width -> canonical NN.NN  (\"12.5\"/\"1250\"/\"12.50\" -> \"12.50\")\n  function normalizeSection(t) {\n    t = String(t).replace(',', '.');\n    var n;\n    if (t.indexOf('.') !== -1) n = parseFloat(t);\n    else if (t.length >= 3) n = parseInt(t, 10) / 100;\n    else n = parseInt(t, 10);\n    return isNaN(n) ? '' : n.toFixed(2);\n  }\n\n  // Parse a tire size from any string.\n  // Returns { width, profile, rim, flotation, canonical } or null.\n  function parseSize(s) {\n    if (!s) return null;\n    var up = String(s).toUpperCase();\n    // Normalize \"x-like\" separators (* \u2715) before any pattern match \u2014 keeps\n    // every regex below from needing to enumerate them. A standalone hyphen\n    // between two digit groups is harder to disambiguate from a real hyphen\n    // in product names, so we handle it inside the spaced/separator branch\n    // rather than here.\n    up = up.replace(/[*\u2715]/g, 'X');\n\n    // Flotation: 35X12.50R20, 35x1250r20, 33\u00D712.50R20, LT35X12.50R20, 33*12.50R20\n    var fl = up.match(/(\\d{2})\\s*[X\u00D7]\\s*(\\d{1,4}(?:[.,]\\d{1,2})?)\\s*R?\\s*(\\d{2})/);\n    if (fl) {\n      var fw = String(+fl[1]), fp = normalizeSection(fl[2]), fr = String(+fl[3]);\n      return { width: fw, profile: fp, rim: fr, flotation: true, canonical: fw + 'X' + fp + 'R' + fr };\n    }\n    // Metric: 225/65R17, P225/65R17, LT265/70R16, 245/35ZR19, 205/55ZRF16\n    var m = up.match(/(\\d{3})\\s*\\/?\\s*(\\d{2,3})\\s*[A-Z]{0,2}R[A-Z]?\\s*(\\d{2})/);\n    if (m) {\n      var mw = String(+m[1]), mp = String(+m[2]), mr = String(+m[3]);\n      return { width: mw, profile: mp, rim: mr, flotation: false, canonical: mw + '/' + mp + 'R' + mr };\n    }\n    // Euro-metric, no aspect ratio: 145R12, 185R14, 155R12C\n    var eu = up.match(/(?:^|\\s)(\\d{3})\\s*[A-Z]?R\\s*(\\d{2})[A-Z]?(?:\\s|$)/);\n    if (eu) {\n      var ew = String(+eu[1]), er = String(+eu[2]);\n      return { width: ew, profile: '', rim: er, flotation: false, canonical: ew + 'R' + er };\n    }\n    // Compact size embedded in free text: \"33125020 lt\", \"2055515 cooper tires\"\n    var efl = up.match(/\\b(\\d{2})(\\d{2})(\\d{2})(\\d{2})\\b/);\n    if (efl) {\n      var ew2 = String(+efl[1]), ep2 = efl[2] + '.' + efl[3], er2 = String(+efl[4]);\n      return { width: ew2, profile: ep2, rim: er2, flotation: true, canonical: ew2 + 'X' + ep2 + 'R' + er2 };\n    }\n    var emt = up.match(/\\b(\\d{3})(\\d{2})(\\d{2})\\b/);\n    if (emt) {\n      var mw2 = String(+emt[1]), mp2 = String(+emt[2]), mr2 = String(+emt[3]);\n      return { width: mw2, profile: mp2, rim: mr2, flotation: false, canonical: mw2 + '/' + mp2 + 'R' + mr2 };\n    }\n    // Compact digits-only: strip separators, then 8-digit flotation or 7-digit metric\n    var compact = up.replace(/[\\s/\\-X\u00D7R.]/g, '');\n    var fdm = compact.match(/^(\\d{2})(\\d{2})(\\d{2})(\\d{2})$/);\n    if (fdm) {\n      var cw = String(+fdm[1]), cp = fdm[2] + '.' + fdm[3], cr = String(+fdm[4]);\n      return { width: cw, profile: cp, rim: cr, flotation: true, canonical: cw + 'X' + cp + 'R' + cr };\n    }\n    var dm = compact.match(/^(?:P|LT|ST)?(\\d{3})(\\d{2})(\\d{2})$/);\n    if (dm) {\n      var dw = String(+dm[1]), dp = String(+dm[2]), dr = String(+dm[3]);\n      return { width: dw, profile: dp, rim: dr, flotation: false, canonical: dw + '/' + dp + 'R' + dr };\n    }\n    // Separator-flexible metric: \"225 55 17\", \"225-55-17\", \"225*55*17\"\n    // (the customer typed something that isn't 225/55R17 but is still a\n    // tire size in spirit). Any combination of space, hyphen, or `*` works.\n    var sp = up.match(/(\\d{3})\\s*[\\s\\-*]\\s*(\\d{2})\\s*[\\s\\-*]\\s*(\\d{2})/);\n    if (sp) {\n      var sw = String(+sp[1]), spp = String(+sp[2]), sr = String(+sp[3]);\n      return { width: sw, profile: spp, rim: sr, flotation: false, canonical: sw + '/' + spp + 'R' + sr };\n    }\n    return null;\n  }\n\n  // Build Shopify collection size-filter params for a parsed size.\n  function sizeFilterParams(parsed) {\n    var p = new URLSearchParams();\n    if (!parsed) return p;\n    if (parsed.width)   p.set('filter.p.m.custom.tire_width', parsed.width);\n    if (parsed.profile) p.set('filter.p.m.custom.tire_profile', parsed.profile);\n    if (parsed.rim)     p.set('filter.p.m.custom.rim_diameter', parsed.rim);\n    return p;\n  }\n\n  // Push a standardized search event to GTM's dataLayer. Never throws.\n  function track(props) {\n    try {\n      root.dataLayer = root.dataLayer || [];\n      root.dataLayer.push(Object.assign({ event: 'pt_search' }, props || {}));\n    } catch (e) { /* analytics must never break a widget */ }\n  }\n\n  // Synonym map: keys are lowercase tokens/phrases to replace, values are the\n  // canonical strings the intent parsers recognise.  Only genuine gaps are listed \u2014\n  // season words (winter, snow, ice, all-season, all-weather, summer, performance)\n  // and every vendor-catalogue brand are already handled by the parsers directly.\n  var SYNONYM_MAP = {\n    // Brand abbreviations not present as a vendor name token\n    'bfg':              'BFGoodrich',\n    // Wheels/rims \u2014 normalised so intent parsers that key on 'rim' still fire\n    'wheels':           'rims',\n    'wheel':            'rim',\n    // Mud-terrain shorthands (the service-type detector already handles LT/ST;\n    // these let a query like \"MT tires\" or \"M/T tires\" surface as a season-neutral\n    // brand-neutral search rather than silently doing nothing)\n    'm/t':              'mud terrain',\n    'm-t':              'mud terrain',\n    // All-terrain shorthands\n    'a/t':              'all terrain',\n    'a-t':              'all terrain',\n    // Highway-terrain shorthand\n    'h/t':              'highway terrain',\n    'h-t':              'highway terrain',\n    // Winter / snow synonyms \u2014 the AI-shopper simulation showed many shoppers\n    // searched \"snow tires\" expecting them to map to the winter collection.\n    'snow tires':       'winter tires',\n    '3pms':             'winter',\n    '3pmsf':            'winter',\n    'snowflake':        'winter',\n    'studded':          'winter',\n    // Performance/summer shorthand\n    'summer tires':     'performance tires'\n  };\n\n  // Expand synonym aliases in a query string.\n  // Returns the query with any recognised alias tokens replaced by their\n  // canonical equivalents, lower-cased key, exact word-boundary match.\n  // The parsers should call this at the top of their intent-detection logic.\n  function expandSynonyms(query) {\n    if (!query) return query;\n    var result = query;\n    var keys = Object.keys(SYNONYM_MAP);\n    for (var i = 0; i < keys.length; i++) {\n      var k = keys[i];\n      var escaped = k.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n      result = result.replace(new RegExp('\\\\b' + escaped + '\\\\b', 'gi'), SYNONYM_MAP[k]);\n    }\n    return result;\n  }\n\n  // Canonical bolt patterns we actually stock. A customer-typed value is\n  // snapped to the nearest of these within 1.5 mm tolerance so \"5x114\"\n  // resolves to \"5x114.3\", \"6x139\" to \"6x139.7\", etc. Refresh from\n  // `db/audit-wheels-fitment.mjs` if the catalog grows new patterns.\n  var KNOWN_BOLT_PATTERNS = [\n    '4x100','4x108','4x114.3',\n    '5x100','5x108','5x110','5x112','5x114.3','5x120','5x127','5x130','5x135','5x139.7','5x150',\n    '6x114.3','6x115','6x127','6x135','6x139.7',\n    '8x165.1','8x170',\n    '12x135'  // dually marker \u2014 present in catalog from a 12x135/139.7 SKU\n  ];\n\n  // Parse free-text customer input into a canonical bolt pattern.\n  // Accepts every common separator: x, X, \u00D7, \u2715, *, -, space.\n  // Inch values (e.g. 5x4.5) are converted to mm (5x114.3). Imprecise\n  // mm values (e.g. 5x114) snap to the nearest known catalog pattern.\n  // Returns canonical \"5x114.3\" string, or null if not a bolt-pattern shape.\n  function parseBoltPattern(query) {\n    if (!query) return null;\n    var s = String(query).trim().toLowerCase();\n    // Normalize every \"x-like\" separator (\u00D7 \u2715 * - space hyphen) to a single 'x'.\n    // We don't want to confuse a bolt-pattern hyphen with a tire-size hyphen\n    // (\"225-65-17\") \u2014 so we only do this AFTER stripping units / suffixes\n    // AND we only return a match for the strict [3-12] x [50-200] shape.\n    s = s.replace(/[\u00D7\u2715*]/g, 'x').replace(/\\s+/g, '').replace(/mm$|\"|''/g, '');\n    s = s.replace(/(\\d)\\s*-\\s*(\\d)/g, '$1x$2');\n    var m = s.match(/^(\\d{1,2})x(\\d+(?:\\.\\d+)?)$/);\n    if (!m) return null;\n    var lugs = parseInt(m[1], 10);\n    var raw  = parseFloat(m[2]);\n    if (lugs < 3 || lugs > 12) return null;\n    if (!isFinite(raw) || raw <= 0) return null;\n    // Inch input (most likely <20) \u2192 mm\n    var mm = raw < 20 ? raw * 25.4 : raw;\n    // Snap to known catalog canonical within 1.5 mm tolerance\n    var TOL = 1.5;\n    var best = null;\n    var bestDist = Infinity;\n    for (var i = 0; i < KNOWN_BOLT_PATTERNS.length; i++) {\n      var parts = KNOWN_BOLT_PATTERNS[i].split('x');\n      var kLugs = parseInt(parts[0], 10);\n      var kMm   = parseFloat(parts[1]);\n      if (kLugs !== lugs) continue;\n      var dist = Math.abs(kMm - mm);\n      if (dist < bestDist) { bestDist = dist; best = KNOWN_BOLT_PATTERNS[i]; }\n    }\n    if (best && bestDist <= TOL) return best;\n    // No catalog match \u2014 return the literal normalized form (e.g. \"5x95\")\n    var mmStr = (mm % 1 === 0) ? String(Math.round(mm)) : mm.toFixed(1);\n    return lugs + 'x' + mmStr;\n  }\n\n  root.PTTireParse = {\n    parseSize: parseSize,\n    parseBoltPattern: parseBoltPattern,\n    normalizeSection: normalizeSection,\n    sizeFilterParams: sizeFilterParams,\n    track: track,\n    expandSynonyms: expandSynonyms,\n    KNOWN_BOLT_PATTERNS: KNOWN_BOLT_PATTERNS,\n    version: 2\n  };\n})(window);\n"],
  "mappings": "CAEC,SAAU,KAAM,CACf,aAGA,SAAS,iBAAiB,EAAG,CAC3B,EAAI,OAAO,CAAC,EAAE,QAAQ,IAAK,GAAG,EAC9B,IAAI,EACJ,OAAI,EAAE,QAAQ,GAAG,IAAM,GAAI,EAAI,WAAW,CAAC,EAClC,EAAE,QAAU,EAAG,EAAI,SAAS,EAAG,EAAE,EAAI,IACzC,EAAI,SAAS,EAAG,EAAE,EAChB,MAAM,CAAC,EAAI,GAAK,EAAE,QAAQ,CAAC,CACpC,CAIA,SAAS,UAAU,EAAG,CACpB,GAAI,CAAC,EAAG,OAAO,KACf,IAAI,GAAK,OAAO,CAAC,EAAE,YAAY,EAM/B,GAAK,GAAG,QAAQ,QAAS,GAAG,EAG5B,IAAI,GAAK,GAAG,MAAM,2DAA2D,EAC7E,GAAI,GAAI,CACN,IAAI,GAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EAAG,GAAK,iBAAiB,GAAG,CAAC,CAAC,EAAG,GAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EACzE,MAAO,CAAE,MAAO,GAAI,QAAS,GAAI,IAAK,GAAI,UAAW,GAAM,UAAW,GAAK,IAAM,GAAK,IAAM,EAAG,CACjG,CAEA,IAAI,EAAI,GAAG,MAAM,yDAAyD,EAC1E,GAAI,EAAG,CACL,IAAI,GAAK,OAAO,CAAC,EAAE,CAAC,CAAC,EAAG,GAAK,OAAO,CAAC,EAAE,CAAC,CAAC,EAAG,GAAK,OAAO,CAAC,EAAE,CAAC,CAAC,EAC7D,MAAO,CAAE,MAAO,GAAI,QAAS,GAAI,IAAK,GAAI,UAAW,GAAO,UAAW,GAAK,IAAM,GAAK,IAAM,EAAG,CAClG,CAEA,IAAI,GAAK,GAAG,MAAM,mDAAmD,EACrE,GAAI,GAAI,CACN,IAAI,GAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EAAG,GAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EAC3C,MAAO,CAAE,MAAO,GAAI,QAAS,GAAI,IAAK,GAAI,UAAW,GAAO,UAAW,GAAK,IAAM,EAAG,CACvF,CAEA,IAAI,IAAM,GAAG,MAAM,kCAAkC,EACrD,GAAI,IAAK,CACP,IAAI,IAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAG,IAAM,IAAI,CAAC,EAAI,IAAM,IAAI,CAAC,EAAG,IAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAC5E,MAAO,CAAE,MAAO,IAAK,QAAS,IAAK,IAAK,IAAK,UAAW,GAAM,UAAW,IAAM,IAAM,IAAM,IAAM,GAAI,CACvG,CACA,IAAI,IAAM,GAAG,MAAM,2BAA2B,EAC9C,GAAI,IAAK,CACP,IAAI,IAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAG,IAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAG,IAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EACtE,MAAO,CAAE,MAAO,IAAK,QAAS,IAAK,IAAK,IAAK,UAAW,GAAO,UAAW,IAAM,IAAM,IAAM,IAAM,GAAI,CACxG,CAEA,IAAI,QAAU,GAAG,QAAQ,eAAgB,EAAE,EACvC,IAAM,QAAQ,MAAM,gCAAgC,EACxD,GAAI,IAAK,CACP,IAAI,GAAK,OAAO,CAAC,IAAI,CAAC,CAAC,EAAG,GAAK,IAAI,CAAC,EAAI,IAAM,IAAI,CAAC,EAAG,GAAK,OAAO,CAAC,IAAI,CAAC,CAAC,EACzE,MAAO,CAAE,MAAO,GAAI,QAAS,GAAI,IAAK,GAAI,UAAW,GAAM,UAAW,GAAK,IAAM,GAAK,IAAM,EAAG,CACjG,CACA,IAAI,GAAK,QAAQ,MAAM,qCAAqC,EAC5D,GAAI,GAAI,CACN,IAAI,GAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EAAG,GAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EAAG,GAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EAChE,MAAO,CAAE,MAAO,GAAI,QAAS,GAAI,IAAK,GAAI,UAAW,GAAO,UAAW,GAAK,IAAM,GAAK,IAAM,EAAG,CAClG,CAIA,IAAI,GAAK,GAAG,MAAM,iDAAiD,EACnE,GAAI,GAAI,CACN,IAAI,GAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EAAG,IAAM,OAAO,CAAC,GAAG,CAAC,CAAC,EAAG,GAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EACjE,MAAO,CAAE,MAAO,GAAI,QAAS,IAAK,IAAK,GAAI,UAAW,GAAO,UAAW,GAAK,IAAM,IAAM,IAAM,EAAG,CACpG,CACA,OAAO,IACT,CAGA,SAAS,iBAAiB,OAAQ,CAChC,IAAI,EAAI,IAAI,gBACZ,OAAK,SACD,OAAO,OAAS,EAAE,IAAI,+BAAgC,OAAO,KAAK,EAClE,OAAO,SAAS,EAAE,IAAI,iCAAkC,OAAO,OAAO,EACtE,OAAO,KAAS,EAAE,IAAI,iCAAkC,OAAO,GAAG,GAC/D,CACT,CAGA,SAAS,MAAM,MAAO,CACpB,GAAI,CACF,KAAK,UAAY,KAAK,WAAa,CAAC,EACpC,KAAK,UAAU,KAAK,OAAO,OAAO,CAAE,MAAO,WAAY,EAAG,OAAS,CAAC,CAAC,CAAC,CACxE,OAAS,EAAG,CAA4C,CAC1D,CAMA,IAAI,YAAc,CAEhB,IAAoB,aAEpB,OAAoB,OACpB,MAAoB,MAIpB,MAAoB,cACpB,MAAoB,cAEpB,MAAoB,cACpB,MAAoB,cAEpB,MAAoB,kBACpB,MAAoB,kBAGpB,aAAoB,eACpB,OAAoB,SACpB,QAAoB,SACpB,UAAoB,SACpB,QAAoB,SAEpB,eAAoB,mBACtB,EAMA,SAAS,eAAe,MAAO,CAC7B,GAAI,CAAC,MAAO,OAAO,MAGnB,QAFI,OAAS,MACT,KAAO,OAAO,KAAK,WAAW,EACzB,EAAI,EAAG,EAAI,KAAK,OAAQ,IAAK,CACpC,IAAI,EAAI,KAAK,CAAC,EACV,QAAU,EAAE,QAAQ,sBAAuB,MAAM,EACrD,OAAS,OAAO,QAAQ,IAAI,OAAO,MAAQ,QAAU,MAAO,IAAI,EAAG,YAAY,CAAC,CAAC,CACnF,CACA,OAAO,MACT,CAMA,IAAI,oBAAsB,CACxB,QAAQ,QAAQ,UAChB,QAAQ,QAAQ,QAAQ,QAAQ,UAAU,QAAQ,QAAQ,QAAQ,QAAQ,UAAU,QACpF,UAAU,QAAQ,QAAQ,QAAQ,UAClC,UAAU,QACV,QACF,EAOA,SAAS,iBAAiB,MAAO,CAC/B,GAAI,CAAC,MAAO,OAAO,KACnB,IAAI,EAAI,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAKzC,EAAI,EAAE,QAAQ,SAAU,GAAG,EAAE,QAAQ,OAAQ,EAAE,EAAE,QAAQ,YAAa,EAAE,EACxE,EAAI,EAAE,QAAQ,mBAAoB,OAAO,EACzC,IAAI,EAAI,EAAE,MAAM,6BAA6B,EAC7C,GAAI,CAAC,EAAG,OAAO,KACf,IAAI,KAAO,SAAS,EAAE,CAAC,EAAG,EAAE,EACxB,IAAO,WAAW,EAAE,CAAC,CAAC,EAE1B,GADI,KAAO,GAAK,KAAO,IACnB,CAAC,SAAS,GAAG,GAAK,KAAO,EAAG,OAAO,KAOvC,QALI,GAAK,IAAM,GAAK,IAAM,KAAO,IAE7B,IAAM,IACN,KAAO,KACP,SAAW,IACN,EAAI,EAAG,EAAI,oBAAoB,OAAQ,IAAK,CACnD,IAAI,MAAQ,oBAAoB,CAAC,EAAE,MAAM,GAAG,EACxC,MAAQ,SAAS,MAAM,CAAC,EAAG,EAAE,EAC7B,IAAQ,WAAW,MAAM,CAAC,CAAC,EAC/B,GAAI,QAAU,KACd,KAAI,KAAO,KAAK,IAAI,IAAM,EAAE,EACxB,KAAO,WAAY,SAAW,KAAM,KAAO,oBAAoB,CAAC,GACtE,CACA,GAAI,MAAQ,UAAY,IAAK,OAAO,KAEpC,IAAI,MAAS,GAAK,IAAM,EAAK,OAAO,KAAK,MAAM,EAAE,CAAC,EAAI,GAAG,QAAQ,CAAC,EAClE,OAAO,KAAO,IAAM,KACtB,CAEA,KAAK,YAAc,CACjB,UAAW,UACX,iBAAkB,iBAClB,iBAAkB,iBAClB,iBAAkB,iBAClB,MAAO,MACP,eAAgB,eAChB,oBAAqB,oBACrB,QAAS,CACX,CACF,GAAG,MAAM",
  "names": []
}
