@codename/deck 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ var ot=/^[a-z][a-z0-9-]{0,31}$/,Lt=/^(auto|min-content|max-content|\d{1,2}(\.\d)?fr|\d{1,3}%)$/,_t=["Title Slide","Title and Content","Section Header","Two Content","Comparison","Title Only","Blank","Content with Caption","Picture with Caption"],kt={align:["start","center","end"],justify:["start","center","end"],paper:["paper","fill","ink","soft"],title:["normal","large","huge"],logo:["small","big","none"]},jt=["top-end","top-start","bottom-end","bottom-start"],ut=t=>typeof t=="string"&&t.length<=7e5&&/^data:image\/(png|jpeg|gif|webp|svg\+xml);base64,[a-z0-9+/]+=*$/i.test(t)?t:null,dt=t=>typeof t=="string"&&t.length<=3145728&&/^data:image\/(?:(?:png|jpeg|gif|webp|svg\+xml);base64,[a-z0-9+/]+=*|svg\+xml,[\w.!~*'()%/+=-]*)$/i.test(t)?t:null;var mt={name:"standard",tokens:{},pictures:{},layouts:Object.fromEntries(Object.entries({default:{label:{en:"Title and content",fr:"Titre et contenu"},pptx:"Title and Content"},cover:{label:{en:"Cover",fr:"Couverture"},justify:"center",paper:"fill",title:"huge",logo:"big",pptx:"Title Slide",numbered:!1},intro:{label:{en:"Introduction",fr:"Introduction"},justify:"center",paper:"fill",title:"large",logo:"big",pptx:"Title Slide",numbered:!1},section:{label:{en:"Section",fr:"Section"},justify:"center",paper:"ink",title:"huge",pptx:"Section Header",numbered:!1},center:{label:{en:"Centred",fr:"Centré"},justify:"center",align:"center",pptx:"Title Only"},statement:{label:{en:"Statement",fr:"Affirmation"},justify:"center",align:"center",title:"large",pptx:"Title Only"},fact:{label:{en:"Big number",fr:"Grand chiffre"},justify:"center",align:"center",title:"huge",pptx:"Title Only"},quote:{label:{en:"Quote",fr:"Citation"},justify:"center",pptx:"Title Only"},end:{label:{en:"Closing",fr:"Clôture"},justify:"center",align:"center",paper:"fill",title:"large",logo:"big",pptx:"Title Slide",numbered:!1},full:{label:{en:"Full",fr:"Plein cadre"},logo:"none",pptx:"Blank",numbered:!1},none:{label:{en:"Blank",fr:"Vide"},logo:"none",pptx:"Blank",numbered:!1},"two-cols":{label:{en:"Two columns",fr:"Deux colonnes"},slots:["default","right"],areas:"default right",columns:"1fr 1fr",pptx:"Two Content"},"two-cols-header":{label:{en:"Comparison",fr:"Comparaison"},slots:["default","left","right","bottom"],areas:"default default | left right | bottom bottom",columns:"1fr 1fr",rows:"auto 1fr auto",pptx:"Comparison"},"three-cols":{label:{en:"Three columns",fr:"Trois colonnes"},slots:["default","left","middle","right"],areas:"default default default | left middle right",columns:"1fr 1fr 1fr",rows:"auto 1fr",pptx:"Comparison"},"image-left":{label:{en:"Picture left",fr:"Image à gauche"},pptx:"Picture with Caption",justify:"center"},"image-right":{label:{en:"Picture right",fr:"Image à droite"},pptx:"Picture with Caption",justify:"center"},image:{label:{en:"Picture",fr:"Image"},logo:"none",pptx:"Blank",numbered:!1}}).map(([t,e])=>[t,St(e).layout]))};function St(t){let e=[];if(!t||typeof t!="object")return{layout:null,problems:["not a layout"]};let r={},a=Array.isArray(t.slots)||typeof t.slots=="string"?[t.slots].flat().map(String):t.slots&&typeof t.slots=="object"?Object.entries(t.slots).map(([u,S])=>(S&&typeof S=="object"&&(r[u]=vt(S)),u==="title"?"default":u)):["default"],n=[...new Set(a)];if(!n.every(u=>ot.test(u)))return{layout:null,problems:["a slot name is not a-z, 0-9 and -"]};n.includes("default")||n.unshift("default");let s=(Array.isArray(t.areas)?t.areas.map(u=>[u].flat().join(" ")):String(t.areas??n.join(" ")).split(/\||\n/)).map(u=>u.trim().replace(/^"|"$/g,"").split(/\s+/)).filter(u=>u.length&&u[0]),p=s[0]?.length??0;if(!s.length||s.some(u=>u.length!==p)||s.flat().some(u=>u!=="."&&!n.includes(u)))return{layout:null,problems:["areas are not a rectangle of its slots"]};for(let u of n){let S=s.flatMap((C,F)=>C.map((j,A)=>[j,A,F])).filter(([C])=>C===u);if(!S.length){u!=="default"&&e.push(`slot ${u} has no area`);continue}let O=S.map(C=>C[1]),M=S.map(C=>C[2]);if(S.length!==(Math.max(...O)-Math.min(...O)+1)*(Math.max(...M)-Math.min(...M)+1))return{layout:null,problems:[`slot ${u} is not a rectangle`]}}let l=(u,S)=>{let O=u===void 0?Array(S).fill("1fr"):(Array.isArray(u)?u:String(u).split(/\s+/)).map(String);return O.length===S&&O.every(M=>Lt.test(M))?O:null},c=l(t.columns,p),f=l(t.rows,s.length);if(!c||!f)return{layout:null,problems:["columns or rows are not tracks deck knows (auto, 1fr, 40%…), one per column or row"]};let g=(u,S)=>{let O=String(t[u]??S);return kt[u].includes(O)?O:(e.push(`${u} ${O} is not one of ${kt[u].join(", ")}`),S)},k=typeof t.label=="string"||t.label&&typeof t.label=="object"?t.label:void 0,b=Array.isArray(t.art)&&t.art.length<=8&&t.art.every(u=>typeof u=="string"&&ot.test(u))?t.art:void 0;t.art!==void 0&&!b&&e.push("art is not 8 names at most");let y=u=>typeof u=="string"?u.slice(0,300):void 0;return{layout:{label:k,intent:y(t.intent),use_when:y(t.use_when),avoid_when:y(t.avoid_when),slots:n,budgets:r,areas:s,columns:c,rows:f,align:g("align","start"),justify:g("justify","start"),paper:g("paper","paper"),title:g("title","normal"),logo:g("logo","small"),pptx:_t.includes(t.pptx)?t.pptx:n.length>1?"Comparison":"Title and Content",numbered:t.numbered!==!1,art:b},problems:e}}function vt(t){let e={};for(let r of["max_words","max_chars","item_max_words","heading_max_words"])Number.isInteger(t[r])&&t[r]>0&&(e[r]=t[r]);return Array.isArray(t.items)&&t.items.length===2&&t.items.every(Number.isInteger)&&(e.items=t.items),typeof t.required=="boolean"&&(e.required=t.required),typeof t.kind=="string"&&/^[a-z-]{1,20}$/.test(t.kind)&&(e.kind=t.kind),e}function Gt(t){if(!t||typeof t!="object")return{};if(!JSON.stringify(t).includes('"$value"'))return t;let e=k=>k&&typeof k=="object"&&"$value"in k?k.$value:k,r=k=>{let b=e(k);return typeof b=="string"?b:typeof b?.hex=="string"?`${b.hex}${typeof b.alpha=="number"&&b.alpha<1?Math.round(Math.max(0,b.alpha)*255).toString(16).padStart(2,"0"):""}`:void 0},a=k=>{let b=e(k);return Array.isArray(b)?b.map(String):typeof b=="string"?[b]:void 0},n={bg:"paper",background:"paper",paper:"paper",fg:"ink",text:"ink",ink:"ink",accent:"primary",primary:"primary",muted:"muted",surface:"soft",soft:"soft"},o=k=>Object.fromEntries(Object.entries(k??{}).filter(([b])=>b in n).map(([b,y])=>[n[b],r(y)]).filter(([,b])=>b)),s=t.color??t.colour??{},p={...o(s),...o(s.light)},l=o(s.dark);Object.keys(l).length&&(p.dark=l);let c=t.font??t.fontFamily??{},f=a(c.heading??c.display??c.sans),g=a(c.body??c.text??c.sans);return(f||g)&&(p.fonts={heading:f??g,body:g??f}),p}function Mt(...t){let e={name:"standard",tokens:{},layouts:{...mt.layouts},pictures:{}},r=[];for(let a of t)if(!(!a||typeof a!="object")){if(typeof a.name=="string"&&(e.name=a.name),a.tokens&&typeof a.tokens=="object"){let n=Gt(a.tokens),o=n.dark&&typeof n.dark=="object"?{...e.tokens.dark,...n.dark}:e.tokens.dark;e.tokens={...e.tokens,...n,...o&&{dark:o}}}for(let[n,o]of Object.entries(a.pictures??{}))ot.test(n)&&dt(o)?e.pictures[n]=o:r.push(`picture ${n}: not a picture inside the kit`);for(let[n,o]of Object.entries(a.layouts??a.types??{})){if(!ot.test(n)){r.push(`layout ${n}: not a-z, 0-9 and -`);continue}if(o===!1){n!=="default"&&delete e.layouts[n];continue}let{layout:s,problems:p}=St(o);r.push(...p.map(l=>`layout ${n}: ${l}`)),s&&(e.layouts[n]=s)}}for(let[a,n]of[["logo",e.tokens],["dark logo",e.tokens.dark]])n?.logo!==void 0&&!ut(n.logo)&&(r.push(`${a}: not a picture inside the kit (PNG, JPEG, GIF, WebP or SVG as data:, 512 KB at most)`),delete n.logo);return e.tokens.logoAt!==void 0&&!jt.includes(e.tokens.logoAt)&&(r.push(`logoAt ${e.tokens.logoAt} is not one of ${jt.join(", ")}`),delete e.tokens.logoAt),{kit:e,problems:r}}function tt(t,e=[255,255,255]){let r=String(t).trim(),a=/^#?([\da-f]{3,4}|[\da-f]{6}|[\da-f]{8})$/i.exec(r)?.[1],n=/^rgba?\(([^)]*)\)$/i.exec(r)?.[1].split(/[\s,/]+/).filter(Boolean),o=(f,g)=>f.endsWith("%")?parseFloat(f)/100*g:Number(f),[s,p,l,c=1]=a?(a.length<5?[...a].map(f=>f+f):a.match(/../g)).map((f,g)=>parseInt(f,16)/(g>2?255:1)):n?.length===3||n?.length===4?n.map((f,g)=>o(f,g>2?1:255)):[];return s!==void 0&&[s,p,l].every(f=>f>=0&&f<=255)&&c>=0&&c<=1?Ht(Wt(e,[s,p,l],c)):null}var Ht=t=>t.map(e=>Math.round(Math.max(0,Math.min(255,e)))),Wt=(t,e,r)=>t.map((a,n)=>a+(e[n]-a)*r);function Ct(t){let[e,r,a]=t.map(n=>{let o=n/255;return o<=.03928?o/12.92:((o+.055)/1.055)**2.4});return .2126*e+.7152*r+.0722*a}function et(t,e){let[r,a]=[Ct(t),Ct(e)].sort((n,o)=>o-n);return(r+.05)/(a+.05)}var Vt={"Title Slide":"cover","Title and Content":"default","Section Header":"section","Two Content":"two-cols-header","Title Only":"center",Blank:"none"},qt=["Title Slide","Title and Content","Section Header","Two Content","Comparison","Title Only","Blank","Content with Caption","Picture with Caption"],Pt={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",svg:"image/svg+xml"},Kt={...Pt,webp:"image/webp",bmp:"image/bmp"},Ot=2,Jt=3,V=12700;function Zt(t){let e=new DataView(t.buffer,t.byteOffset,t.byteLength),r=t.length-22;for(;r>=0&&e.getUint32(r,!0)!==101010256;)r--;if(r<0)throw new Error("not a PowerPoint file");let a=new Map;for(let n=e.getUint32(r+16,!0),o=e.getUint16(r+10,!0);o>0;o--){let s=e.getUint16(n+10,!0),p=e.getUint32(n+20,!0),l=new TextDecoder().decode(t.subarray(n+46,n+46+e.getUint16(n+28,!0))),c=e.getUint32(n+42,!0),f=c+30+e.getUint16(c+26,!0)+e.getUint16(c+28,!0),g=t.subarray(f,f+p);a.set(l,async()=>s===0?g:new Uint8Array(await new Response(new Blob([g]).stream().pipeThrough(new DecompressionStream("deflate-raw"))).arrayBuffer())),n+=46+e.getUint16(n+28,!0)+e.getUint16(n+30,!0)+e.getUint16(n+32,!0)}return a}var m=(t,e)=>new RegExp(`\\b${e}="([^"]*)"`).exec(t)?.[1],gt=(t,e)=>new Map([...t.matchAll(/<Relationship\b[^>]*>/g)].map(([r])=>[String(m(r,"Id")),new URL(String(m(r,"Target")),`file:///${e}/`).pathname.slice(1)]));async function me(t,{name:e}={}){let r=Zt(t),a=[],n=async d=>new TextDecoder().decode(await(r.get(d)?.()??new Uint8Array)),o=[...r.keys()].filter(d=>/^(ppt|theme)\/slideMasters\/slideMaster\d+\.xml$/.test(d)).sort()[0];if(!o)throw new Error("no slide master: not a PowerPoint template");let s=o.split("/")[0],p=await n(o),l=gt(await n(o.replace(/([^/]+)$/,"_rels/$1.rels")),`${s}/slideMasters`),c=[...l.values()].find(d=>/theme\/theme\d+\.xml$/.test(d))??`${s}/theme/theme1.xml`,f=await n(c),[g,k]=(d=>[Number(m(d,"cx")??12192e3),Number(m(d,"cy")??6858e3)])(/<p:sldSz\b[^>]*>/.exec(await n(`${s}/presentation.xml`))?.[0]??""),b=d=>Object.fromEntries([...(/<(?:p:clrMap|a:overrideClrMapping)\b[^>]*>/.exec(d)?.[0]??"").matchAll(/(\w+)="(\w+)"/g)].map(([,w,N])=>[w,N])),y={bg1:"lt1",tx1:"dk1",bg2:"lt2",tx2:"dk2",...b(p)},u=Object.fromEntries([...f.matchAll(/<a:(dk1|lt1|dk2|lt2|accent[1-6]|hlink|folHlink)>\s*<a:(?:srgbClr\b[^>]*\bval|sysClr\b[^>]*\blastClr)="([0-9A-Fa-f]{6})"/g)].map(([,d,w])=>[d,`#${w.toLowerCase()}`])),S=d=>m(new RegExp(`<a:${d}>[\\s\\S]*?<a:latin\\b[^>]*>`).exec(f)?.[0].replace(/^[\s\S]*<a:latin/,"")??"","typeface"),[O,M]=[S("majorFont"),S("minorFont")].map(d=>d&&!d.startsWith("+")?[d,"ui-sans-serif","system-ui","sans-serif"]:null),C=Object.fromEntries([["paper",y.bg1],["ink",y.tx1],["primary","accent1"],["muted",y.tx2],["soft",y.bg2]].filter(([,d])=>u[d]).map(([d,w])=>[d,u[w]])),F=[1,2,3,4,5,6].map(d=>u[`accent${d}`]).filter(Boolean);F.length&&(C.series=F),(O||M)&&(C.fonts={heading:O??M,body:M??O});let j="";for(let[d]of p.matchAll(/<p:pic>[\s\S]*?<\/p:pic>/g)){let w=l.get(String(m(/<a:blip\b[^>]*>/.exec(d)?.[0]??"","r:embed"))),N=Pt[/\.(\w+)$/.exec(w??"")?.[1].toLowerCase()??""];if(!w||!N||!r.has(w))continue;let B=await r.get(w)?.(),D=B&&`data:${N};base64,${It(B)}`;if(!ut(D)){a.push(`the logo ${w.split("/").pop()} is larger than 512 KB`);break}let[K,rt]=(W=>[Number(m(W,"x")??0),Number(m(W,"y")??0)])(/<a:off\b[^>]*>/.exec(d)?.[0]??"");Object.assign(C,{logo:D,logoAt:`${rt<k/2?"top":"bottom"}-${K<g/2?"start":"end"}`}),j=w;break}let A=d=>z(new RegExp(`<a:${d}>([\\s\\S]*?)</a:${d}>`).exec(f)?.[1]??"").map(w=>w.xml),I={scheme:Object.fromEntries(Object.entries(u).map(([d,w])=>[d,tt(w.slice(1))])),map:y,rels:l,files:r,size:[g/V,k/V],themeRels:gt(await n(c.replace(/([^/]+)$/,"_rels/$1.rels")),c.replace(/\/[^/]+$/,"")),styles:{fill:A("fillStyleLst"),line:A("lnStyleLst"),bg:A("bgFillStyleLst")},faces:{major:S("majorFont")??"",minor:S("minorFont")??""},pictures:new Map,used:new Set,noted:new Set,ids:{n:0},defs:[]},E=new Map,G=d=>E.get(JSON.stringify(d))??E.set(JSON.stringify(d),(w=>it(At(p),{...I,map:d,used:w,ids:{n:0}}).then(N=>({svg:N,used:w})))(new Set)).get(JSON.stringify(d)),X=Object.fromEntries([[y.bg2,"soft"],["accent1","fill"],[y.tx1,"ink"],[y.bg1,"paper"]].filter(([d])=>u[d]).map(([d,w])=>[u[d],w])),[h,x]=[I.scheme[y.tx1]??[0,0,0],I.scheme[y.bg1]??[255,255,255]],P=d=>[...d.matchAll(/<p:sp>[\s\S]*?<\/p:sp>/g)].flatMap(([w])=>{let N=/<p:ph\b[^>]*>/.exec(w)?.[0];if(!N)return[];let B=/<a:off\b[^>]*>/.exec(w)?.[0],D=/<a:ext\b[^>]*>/.exec(w)?.[0];return[{type:m(N,"type")??"body",name:m(/<p:cNvPr\b[^>]*>/.exec(w)?.[0]??"","name")??"",box:B&&D?[Number(m(B,"x")),Number(m(B,"y")),Number(m(D,"cx")),Number(m(D,"cy"))]:null}]}),T=P(p),U={},R={},q=(d,w)=>{let N=d?dt(le(d,I.size)):null;if(d&&!N&&a.push(`layout ${w}: a layer of its art is larger than ${Jt} MB`),!N)return[];let B=2166136261;for(let D=0;D<N.length;D++)B=Math.imul(B^N.charCodeAt(D),16777619)>>>0;return R[`art-${B.toString(36)}`]=N,[`art-${B.toString(36)}`]},Y=[...l.values()].filter(d=>/slideLayouts\/slideLayout\d+\.xml$/.test(d)).sort((d,w)=>Number(/(\d+)\.xml$/.exec(d)?.[1])-Number(/(\d+)\.xml$/.exec(w)?.[1]));for(let d of Y){let w=await n(d),N=(m(/<p:cSld\b[^>]*>/.exec(w)?.[0]??"","name")??"").replace(/&amp;/g,"&").trim(),B=P(w).filter(v=>!["dt","ftr","sldNum"].includes(v.type)).map(v=>({...v,box:v.box??T.find(wt=>wt.type===v.type||v.type==="ctrTitle"&&wt.type==="title")?.box??null})).filter(v=>v.box),D=Vt[N]??(N.toLowerCase().normalize("NFKD").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").replace(/^(?=\d)/,"l-").slice(0,32)||`layout-${Y.indexOf(d)+1}`),K={...I,map:{...y,...b(w)},rels:gt(await n(d.replace(/([^/]+)$/,"_rels/$1.rels")),d.replace(/\/[^/]+$/,"")),used:new Set,ids:{n:0}},rt=Nt(w),W=await se(rt??Nt(p),{...K,ids:{n:0},...!rt&&{rels:l}}),lt=/<p:sldLayout\b[^>]*\bshowMasterSp="(0|false)"/.test(w)?{svg:"",used:new Set}:await G(K.map),yt=await it(At(w),K),ct=ie(w,p,K),at=W.rgb?X[nt(W.rgb)]:void 0,Bt=ct&&et(ct,h)>et(ct,x),xt=at==="fill"?"fill":Bt&&(lt.svg||yt||!at)?"ink":at??(W.rgb&&et(W.rgb,h)<et(W.rgb,x)?"ink":"paper"),ft=[...q(xt===at?"":W.svg,N||D),...q(lt.svg,N||D),...q(yt,N||D)],pt=ce(B,g,k,ft.length>0);if(!pt){a.push(`layout ${N||D}: its placeholders make no grid deck lays out`);continue}let zt=j&&(K.used.has(j)||lt.used.has(j))?"none":mt.layouts[D]?.logo??"small",Ut={ctr:"center",r:"end"}[Et(w,p,/<a:(?:lvl1pPr|pPr)\b[^>]*\balgn="(\w+)"/)??""]??"start";U[D]={label:N||D,...pt,paper:xt,title:B.some(v=>v.type==="ctrTitle")?"huge":"normal",logo:zt,align:Ut,...B.some(v=>v.type==="ctrTitle")&&{justify:"center"},pptx:qt.includes(N)?N:pt.slots.length>1?"Comparison":"Title and Content",numbered:/<p:ph\b[^>]*type="sldNum"/.test(w),...ft.length&&{art:ft}}}Object.values(U).some(d=>d.art)&&(C.dark=Object.fromEntries(["paper","ink","muted","soft"].filter(d=>C[d]).map(d=>[d,C[d]])));let L=Mt({name:e??"template",tokens:C,layouts:U,pictures:R});return{kit:{...L.kit,name:e??"template"},problems:[...a,...I.noted,...L.problems]}}function z(t=""){let e=[],r=0,a="",n=0,o=0;for(let s of t.matchAll(/<(\/?)([\w:]+)[^>]*?(\/?)>/g)){let p=s.index;s[1]?--r===0&&e.push({name:s[2],tag:a,inner:t.slice(n,p),xml:t.slice(o,p+s[0].length)}):s[3]?r||e.push({name:s[2],tag:s[0],inner:"",xml:s[0]}):r++||(a=s[0],o=p,n=p+s[0].length)}return e}var $=(t,e)=>z(t).find(r=>r.name===e),At=t=>/<p:spTree>([\s\S]*)<\/p:spTree>/.exec(t)?.[1]??"",Nt=t=>/<p:bg>([\s\S]*?)<\/p:bg>/.exec(t)?.[1],i=t=>String(Math.round(t*100)/100),nt=t=>`#${t.map(e=>Math.round(Math.max(0,Math.min(255,e))).toString(16).padStart(2,"0")).join("")}`,Tt=t=>(t/=255)<=.04045?t/12.92:((t+.055)/1.055)**2.4,ht=t=>255*(t<=.0031308?t*12.92:1.055*Math.max(0,t)**(1/2.4)-.055);function Qt([t,e,r]){let[a,n,o]=[t/255,e/255,r/255],s=Math.max(a,n,o),p=Math.min(a,n,o),l=(s+p)/2,c=s-p;if(!c)return[0,0,l];let f=c/(1-Math.abs(2*l-1));return[((s===a?(n-o)/c%6:s===n?(o-a)/c+2:(a-n)/c+4)*60+360)%360,f,l]}function Z(t,e,r){let a=(1-Math.abs(2*Math.min(1,Math.max(0,r))-1))*Math.min(1,e),n=a*(1-Math.abs(t/60%2-1)),o=Math.min(1,Math.max(0,r))-a/2,[s,p,l]=t<60?[a,n,0]:t<120?[n,a,0]:t<180?[0,a,n]:t<240?[0,n,a]:t<300?[n,0,a]:[a,0,n];return[s+o,p+o,l+o].map(c=>c*255)}var Xt={black:"000000",white:"ffffff",gray:"808080",grey:"808080",red:"ff0000",green:"008000",blue:"0000ff",yellow:"ffff00"};function H(t,e,r=null){let a=z(t).find(l=>/^a:(srgbClr|schemeClr|sysClr|prstClr|scrgbClr|hslClr)$/.test(l.name));if(!a)return null;let n=m(a.tag,"val")??"",o=l=>Number(m(a.tag,l)??0)/1e5,s=a.name==="a:srgbClr"?tt(n):a.name==="a:sysClr"?tt(m(a.tag,"lastClr")??(n==="window"?"ffffff":"000000")):a.name==="a:schemeClr"?n==="phClr"?r?.rgb??null:e.scheme[e.map[n]??n]??null:a.name==="a:prstClr"?tt(Xt[n]??"808080"):a.name==="a:scrgbClr"?["r","g","b"].map(l=>ht(o(l))):Z(Number(m(a.tag,"hue")??0)/6e4,o("sat"),o("lum"));if(!s)return null;let p=n==="phClr"?r?.alpha??1:1;for(let l of z(a.inner)){let c=Number(m(l.tag,"val")??1e5)/1e5,[f,g,k]=Qt(s);l.name==="a:alpha"?p=c:l.name==="a:alphaMod"?p*=c:l.name==="a:lumMod"?s=Z(f,g,k*c):l.name==="a:lumOff"?s=Z(f,g,k+c):l.name==="a:satMod"?s=Z(f,g*c,k):l.name==="a:hueMod"?s=Z(f*c%360,g,k):l.name==="a:hueOff"?s=Z((f+c*1e5/6e4+360)%360,g,k):l.name==="a:shade"?s=s.map(b=>ht(Tt(b)*c)):l.name==="a:tint"&&(s=s.map(b=>ht(1-(1-Tt(b))*c)))}return{rgb:s,alpha:p}}async function bt(t,e){let r=t?e.rels.get(t):void 0,a=r&&e.files.get(r);if(!r||!a)return null;let n=Kt[/\.(\w+)$/.exec(r)?.[1].toLowerCase()??""],o=r.split("/").pop();if(!n)return e.noted.add(`the picture ${o} is in a format browsers don't draw`),null;e.pictures.has(r)||e.pictures.set(r,a().then(p=>p.length>Ot*1024*1024?(e.noted.add(`the picture ${o} is larger than ${Ot} MB`),null):`data:${n};base64,${It(p)}`));let s=await e.pictures.get(r);return s&&e.used.add(r),s??null}function Rt(t,e,r=null){let a=$(t,"a:duotone"),n=$(t,"a:lum");if(!a&&!n)return"";let o=`a${++e.ids.n}`,[s,p]=z(a?.inner).map(b=>H(b.xml,e,r)?.rgb??[0,0,0]),l=b=>(y=>`${i(y*.2126)} ${i(y*.7152)} ${i(y*.0722)} 0 ${i(s[b]/255)}`)((p[b]-s[b])/255),[c,f]=["bright","contrast"].map(b=>Number(m(n?.tag??"",b)??0)/1e5),g=f<0?1+f:1/Math.max(.01,1-f),k=["R","G","B"].map(b=>`<feFunc${b} type="linear" slope="${i(g)}" intercept="${i(c+.5*(1-g))}"/>`).join("");return e.defs.push(`<filter id="${o}" color-interpolation-filters="sRGB">${n?`<feComponentTransfer>${k}</feComponentTransfer>`:""}${a&&p?`<feColorMatrix type="matrix" values="${l(0)} ${l(1)} ${l(2)} 0 0 0 1 0"/>`:""}</filter>`),` filter="url(#${o})"`}async function Q(t,e,r,a=null){for(let n of z(t)){if(n.name==="a:noFill")return`${e}="none"`;if(n.name==="a:solidFill"||n.name==="a:pattFill"){let o=H(n.name==="a:pattFill"?$(n.inner,"a:fgClr")?.inner??"":n.inner,r,a);return o?`${e}="${nt(o.rgb)}"${o.alpha<1?` ${e}-opacity="${i(o.alpha)}"`:""}`:`${e}="none"`}if(n.name==="a:gradFill"){let o=z($(n.inner,"a:gsLst")?.inner).map(c=>[Number(m(c.tag,"pos")??0)/1e5,H(c.inner,r,a)]).sort((c,f)=>c[0]-f[0]),s=`a${++r.ids.n}`,p=$(n.inner,"a:path"),l=o.map(([c,f])=>f?`<stop offset="${i(c)}" stop-color="${nt(f.rgb)}"${f.alpha<1?` stop-opacity="${i(f.alpha)}"`:""}/>`:"").join("");if(!l)return`${e}="none"`;if(p){let c=$(p.inner,"a:fillToRect")?.tag??"",[f,g,k,b]=["l","t","r","b"].map(S=>Number(m(c,S)??0)/1e5),y=(f+1-k)/2,u=(g+1-b)/2;r.defs.push(`<radialGradient id="${s}" cx="${i(y)}" cy="${i(u)}" r="${i(Math.hypot(Math.max(y,1-y),Math.max(u,1-u)))}">${l}</radialGradient>`)}else{let c=Number(m($(n.inner,"a:lin")?.tag??"","ang")??0)/6e4*(Math.PI/180),f=Math.cos(c)/2,g=Math.sin(c)/2;r.defs.push(`<linearGradient id="${s}" x1="${i(.5-f)}" y1="${i(.5-g)}" x2="${i(.5+f)}" y2="${i(.5+g)}">${l}</linearGradient>`)}return`${e}="url(#${s})"`}if(n.name==="a:blipFill"){let o=$(n.inner,"a:blip"),s=await bt(m(o?.tag??"","r:embed"),r),p=`a${++r.ids.n}`;if(!s||e!=="fill")return`${e}="none"`;let l=m($(o?.inner,"a:alphaModFix")?.tag??"","amt");return r.defs.push(`<pattern id="${p}" width="1" height="1" patternContentUnits="objectBoundingBox"><image width="1" height="1" preserveAspectRatio="none"${Rt(o?.inner??"",r,a)}${l?` opacity="${i(Number(l)/1e5)}"`:""} xlink:href="${s}"/></pattern>`),`fill="url(#${p})"`}if(n.name==="a:grpFill")return r.group??`${e}="none"`}}var _=(...t)=>`M${t.map(([e,r])=>`${i(e)} ${i(r)}`).join("L")}Z`,st=(t,e,[r,a,n,o])=>`M${i(r)} 0H${i(t-a)}${a?`A${i(a)} ${i(a)} 0 0 1 ${i(t)} ${i(a)}`:""}V${i(e-n)}${n?`A${i(n)} ${i(n)} 0 0 1 ${i(t-n)} ${i(e)}`:""}H${i(o)}${o?`A${i(o)} ${i(o)} 0 0 1 0 ${i(e-o)}`:""}V${i(r)}${r?`A${i(r)} ${i(r)} 0 0 1 ${i(r)} 0`:""}Z`,J={rect:(t,e)=>_([0,0],[t,0],[t,e],[0,e]),roundRect:(t,e,r,a)=>st(t,e,Array(4).fill(a*r("adj",16667))),round1Rect:(t,e,r,a)=>st(t,e,[0,a*r("adj",16667),0,0]),round2SameRect:(t,e,r,a)=>st(t,e,[a*r("adj1",16667),a*r("adj1",16667),a*r("adj2",0),a*r("adj2",0)]),round2DiagRect:(t,e,r,a)=>st(t,e,[a*r("adj1",16667),a*r("adj2",0),a*r("adj1",16667),a*r("adj2",0)]),snip1Rect:(t,e,r,a)=>(n=>_([0,0],[t-n,0],[t,n],[t,e],[0,e]))(a*r("adj",16667)),snip2SameRect:(t,e,r,a)=>(n=>_([n,0],[t-n,0],[t,n],[t,e],[0,e],[0,n]))(a*r("adj1",16667)),ellipse:(t,e)=>`M0 ${i(e/2)}A${i(t/2)} ${i(e/2)} 0 1 1 ${i(t)} ${i(e/2)}A${i(t/2)} ${i(e/2)} 0 1 1 0 ${i(e/2)}Z`,triangle:(t,e,r)=>_([t*r("adj",5e4),0],[t,e],[0,e]),rtTriangle:(t,e)=>_([0,0],[t,e],[0,e]),diamond:(t,e)=>_([t/2,0],[t,e/2],[t/2,e],[0,e/2]),parallelogram:(t,e,r,a)=>(n=>_([n,0],[t,0],[t-n,e],[0,e]))(a*r("adj",25e3)),trapezoid:(t,e,r,a)=>(n=>_([n,0],[t-n,0],[t,e],[0,e]))(a*r("adj",25e3)),homePlate:(t,e,r,a)=>(n=>_([0,0],[n,0],[t,e/2],[n,e],[0,e]))(t-a*r("adj",5e4)),chevron:(t,e,r,a)=>(n=>_([0,0],[t-n,0],[t,e/2],[t-n,e],[0,e],[n,e/2]))(a*r("adj",5e4)),pentagon:(t,e)=>_([t/2,0],[t,e*.382],[t*.809,e],[t*.191,e],[0,e*.382]),hexagon:(t,e,r,a)=>(n=>_([n,0],[t-n,0],[t,e/2],[t-n,e],[n,e],[0,e/2]))(a*r("adj",25e3)),octagon:(t,e,r,a)=>(n=>_([n,0],[t-n,0],[t,n],[t,e-n],[t-n,e],[n,e],[0,e-n],[0,n]))(a*r("adj",29289)),star5:(t,e)=>_(...Array.from({length:10},(r,a)=>((n,o)=>[t/2+t/2*n*Math.cos(o),e/2+e/2*n*Math.sin(o)])(a%2?.382:1,-Math.PI/2+a*Math.PI/5))),line:(t,e)=>`M0 0L${i(t)} ${i(e)}`,bentConnector2:(t,e)=>`M0 0H${i(t)}V${i(e)}`,bentConnector3:(t,e,r)=>`M0 0H${i(t*r("adj1",5e4))}V${i(e)}H${i(t)}`,curvedConnector3:(t,e,r)=>(a=>`M0 0C${i(a)} 0 ${i(a)} ${i(e)} ${i(t)} ${i(e)}`)(t*r("adj1",5e4))};Object.assign(J,{straightConnector1:J.line,flowChartProcess:J.rect,flowChartAlternateProcess:J.roundRect,flowChartDecision:J.diamond,flowChartConnector:J.ellipse});var Yt=new Set(["line","straightConnector1","bentConnector2","bentConnector3","curvedConnector3"]),te={dash:[4,3],sysDash:[3,1],dot:[1,3],sysDot:[1,1],lgDash:[8,3],dashDot:[4,3,1,3],lgDashDot:[8,3,1,3],lgDashDotDot:[8,3,1,3,1,3],sysDashDot:[3,1,1,1],sysDashDotDot:[3,1,1,1,1,1]};function Ft(t,e,r){let a=$(t,"a:custGeom");if(a)return z($(a.inner,"a:pathLst")?.inner).filter(l=>l.name==="a:path").flatMap(l=>{let c=Number(m(l.tag,"w")??0),f=Number(m(l.tag,"h")??0),g=c?e/c:1/V,k=f?r/f:1/V,b="",y=[0,0];for(let u of z(l.inner)){let S=z(u.inner).filter(M=>M.name==="a:pt").map(M=>[Number(m(M.tag,"x"))*g,Number(m(M.tag,"y"))*k]),O=S.map(([M,C])=>`${i(M)} ${i(C)}`).join(" ");if(u.name==="a:moveTo")b+=`M${O}`;else if(u.name==="a:lnTo")b+=`L${O}`;else if(u.name==="a:cubicBezTo")b+=`C${O}`;else if(u.name==="a:quadBezTo")b+=`Q${O}`;else if(u.name==="a:close")b+="Z";else if(u.name==="a:arcTo"){let[M,C]=[Number(m(u.tag,"wR")??0)*g,Number(m(u.tag,"hR")??0)*k],[F,j]=["stAng","swAng"].map(I=>Number(m(u.tag,I)??0)/6e4*(Math.PI/180)),A=[y[0]-M*Math.cos(F)+M*Math.cos(F+j),y[1]-C*Math.sin(F)+C*Math.sin(F+j)];b+=`A${i(M)} ${i(C)} 0 ${Math.abs(j)>Math.PI?1:0} ${j>0?1:0} ${i(A[0])} ${i(A[1])}`,y=A}S.length&&(y=S[S.length-1])}return b&&!b.includes("NaN")?[{d:b,fill:m(l.tag,"fill")!=="none",stroke:!/^(0|false)$/.test(m(l.tag,"stroke")??"")}]:[]});let n=$(t,"a:prstGeom");if(!n)return null;let o=m(n.tag,"prst")??"",s=Object.fromEntries(z($(n.inner,"a:avLst")?.inner).map(l=>[m(l.tag,"name"),Number(/^val\s+(-?\d+)$/.exec(m(l.tag,"fmla")??"")?.[1])])),p=J[o]?.(e,r,(l,c)=>(Number.isFinite(s[l])?s[l]:c)/1e5,Math.min(e,r));return p?[{d:p,fill:!Yt.has(o),stroke:!0}]:void 0}function $t(t){let e=$(t?.inner,"a:off"),r=$(t?.inner,"a:ext");if(!t||!e||!r)return null;let[a,n,o,s]=[m(e.tag,"x"),m(e.tag,"y"),m(r.tag,"cx"),m(r.tag,"cy")].map(f=>Number(f??0)/V),p=Number(m(t.tag,"rot")??0)/6e4,[l,c]=["flipH","flipV"].map(f=>/^(1|true)$/.test(m(t.tag,f)??""));return{x:a,y:n,w:o,h:s,move:`translate(${i(a)} ${i(n)})${p?` rotate(${i(p)} ${i(o/2)} ${i(s/2)})`:""}`,flip:l||c?` matrix(${l?-1:1} 0 0 ${c?-1:1} ${l?i(o):0} ${c?i(s):0})`:""}}async function ee(t,e,r){let a=await Q(t,"fill",r),n=$(e,"a:fillRef"),o=Number(m(n?.tag??"","idx")??0),s=o>1e3?r.styles.bg[o-1001]:o?r.styles.fill[o-1]:void 0;return a??(s&&n&&await Q(s,"fill",{...r,rels:r.themeRels},H(n.inner,r)))??'fill="none"'}async function Dt(t,e,r){let a=$(t,"a:ln"),n=$(e,"a:lnRef"),o=Number(m(n?.tag??"","idx")??0),s=o?z(r.styles.line[o-1]??"")[0]:void 0,p=(a&&await Q(a.inner,"stroke",r))??(s&&n&&await Q(s.inner,"stroke",r,H(n.inner,r)));if(!p||p==='stroke="none"')return"";let l=Number(m(a?.tag??"","w")??m(s?.tag??"","w")??9525)/V,c=te[m($(a?.inner,"a:prstDash")?.tag??$(s?.inner,"a:prstDash")?.tag??"","val")??""];return` ${p} stroke-width="${i(l)}"${c?` stroke-dasharray="${c.map(f=>i(f*l)).join(" ")}"`:""}`}function ne(t,e,r,a,n){let o=$(t,"a:bodyPr"),s=(j,A)=>Number(m(o?.tag??"",j)??A)/V,[p,l,c,f]=[s("lIns",91440),s("tIns",45720),s("rIns",91440),s("bIns",45720)],g=m(o?.tag??"","wrap")!=="none",k=Number(m($(o?.inner,"a:normAutofit")?.tag??"","fontScale")??1e5)/1e5,b=$($(t,"a:lstStyle")?.inner,"a:lvl1pPr"),y=$(b?.inner,"a:defRPr"),u=$(a,"a:fontRef"),S=(u&&H(u.inner,n))??{rgb:n.scheme[n.map.tx1??"dk1"]??[0,0,0],alpha:1},O=[];for(let j of z(t).filter(A=>A.name==="a:p")){let A=z(j.inner).filter(R=>R.name==="a:r"||R.name==="a:br"),I=$(A.find(R=>R.name==="a:r")?.inner,"a:rPr")??$(j.inner,"a:endParaRPr"),E=R=>m(I?.tag??"",R)??m(y?.tag??"",R),G=Number(E("sz")??1800)/100*k,X=m($(j.inner,"a:pPr")?.tag??"","algn")??m(b?.tag??"","algn")??"l",h=H($(I?.inner,"a:solidFill")?.inner??"",n)??H($(y?.inner,"a:solidFill")?.inner??"",n)??S,x=m($(I?.inner,"a:latin")?.tag??"","typeface")??"+mn-lt",P=x.startsWith("+mj")?n.faces.major:x.startsWith("+")?n.faces.minor:x,T=A.map(R=>R.name==="a:br"?`
2
+ `:/<a:t(?:\s[^>]*)?>([\s\S]*?)<\/a:t>/.exec(R.inner)?.[1]??"").join("").replace(/(&[^;\s]+;)|[^&]+/g,(R,q)=>q??(E("cap")==="all"?R.toLocaleUpperCase():R)),U=Math.max(1,Math.floor((e-p-c)/(G*(E("b")==="1"?.6:.55))));for(let R of T.split(`
3
+ `)){let q=L=>L.replace(/&[^;\s]+;/g,"_").length<=U,Y=g?R.split(" ").reduce((L,d)=>L.length&&q(`${L[L.length-1]} ${d}`)?[...L.slice(0,-1),`${L[L.length-1]} ${d}`]:[...L,d],[]):[R];for(let L of Y.length?Y:[""])O.push({words:L,size:G,align:X,colour:h,face:P,bold:E("b")==="1",italic:E("i")==="1"})}}let M=O.reduce((j,A)=>j+A.size*1.2,0),C=m(o?.tag??"","anchor")??"t",F=C==="ctr"?l+(r-l-f-M)/2:C==="b"?r-f-M:l;return O.map(j=>{let A=F+j.size*.95,[I,E]=j.align==="ctr"?[p+(e-p-c)/2,"middle"]:j.align==="r"?[e-c,"end"]:[p,"start"];return F+=j.size*1.2,j.words.trim()?`<text x="${i(I)}" y="${i(A)}" font-size="${i(j.size)}" font-family="${[j.face.replace(/["'&<>]/g,""),"ui-sans-serif","system-ui","sans-serif"].filter(Boolean).map(G=>/\s/.test(G)?`'${G}'`:G).join(", ")}" fill="${nt(j.colour.rgb)}"${j.colour.alpha<1?` fill-opacity="${i(j.colour.alpha)}"`:""}${E==="start"?"":` text-anchor="${E}"`}${j.bold?' font-weight="bold"':""}${j.italic?' font-style="italic"':""} xml:space="preserve">${j.words}</text>`:""}).join("")}async function re(t,e){if(/<p:ph\b/.test(($(t,"p:nvSpPr")??$(t,"p:nvCxnSpPr"))?.inner??""))return"";let r=$(t,"p:spPr")?.inner??"",a=$(t,"p:style")?.inner??"",n=$t($(r,"a:xfrm")),o={...e,defs:[]};if(!n)return"";let s=Ft(r,n.w,n.h);s===void 0&&o.noted.add(`the shape ${m($(r,"a:prstGeom")?.tag??"","prst")} is left out`);let p=s?.some(g=>g.fill)?await ee(r,a,o):'fill="none"',l=s?.some(g=>g.stroke)?await Dt(r,a,o):"",c=(s??[]).filter(g=>g.fill&&p!=='fill="none"'||g.stroke&&l).map(g=>`<path d="${g.d}" ${g.fill?p:'fill="none"'}${g.stroke?l:""}/>`).join(""),f=ne($(t,"p:txBody")?.inner??"",n.w,n.h,a,o);return`${o.defs.join("")}${c?`<g transform="${n.move}${n.flip}">${c}</g>`:""}${f?`<g transform="${n.move}">${f}</g>`:""}`}async function ae(t,e){if(/<p:ph\b/.test($(t,"p:nvPicPr")?.inner??""))return"";let r=$(t,"p:blipFill")?.inner??"",a=$(r,"a:blip"),n=$(t,"p:spPr")?.inner??"",o=$t($(n,"a:xfrm")),s=/<asvg:svgBlip\b[^>]*\br:embed="([^"]+)"/.exec(a?.inner??"")?.[1],p=s&&await bt(s,e)||await bt(m(a?.tag??"","r:embed"),e);if(!o||!p)return"";let l=$(r,"a:srcRect")?.tag??"",[c,f,g,k]=["l","t","r","b"].map(j=>Number(m(l,j)??0)/1e5),b=o.w/(1-c-g||1),y=o.h/(1-f-k||1),u=m($(a?.inner,"a:alphaModFix")?.tag??"","amt"),S=Ft(n,o.w,o.h)?.[0],O=S&&!/\bprst="rect"/.test(n)?`a${++e.ids.n}`:"",M={...e,defs:[]},C=S?await Dt(n,$(t,"p:style")?.inner??"",M):"",F=Rt(a?.inner??"",M);return`${M.defs.join("")}<g transform="${o.move}${o.flip}"${u?` opacity="${i(Number(u)/1e5)}"`:""}>${O?`<clipPath id="${O}"><path d="${S?.d}"/></clipPath><g clip-path="url(#${O})">`:"<g>"}<svg width="${i(o.w)}" height="${i(o.h)}"><image x="${i(-c*b)}" y="${i(-f*y)}" width="${i(b)}" height="${i(y)}" preserveAspectRatio="none"${F} xlink:href="${p}"/></svg></g>${C?`<path d="${S?.d}" fill="none"${C}/>`:""}</g>`}async function oe(t,e){let r=$(t,"p:grpSpPr")?.inner??"",a=$(r,"a:xfrm"),n=$t(a),o={...e,defs:[]},[s,p,l,c]=[m($(a?.inner,"a:chOff")?.tag??"","x"),m($(a?.inner,"a:chOff")?.tag??"","y"),m($(a?.inner,"a:chExt")?.tag??"","cx"),m($(a?.inner,"a:chExt")?.tag??"","cy")].map(g=>Number(g??0)/V),f=await it(t,{...o,group:await Q(r,"fill",o)});return f?`${o.defs.join("")}<g${n?` transform="${n.move}${n.flip} scale(${i(l?n.w/l:1)} ${i(c?n.h/c:1)}) translate(${i(-s)} ${i(-p)})"`:""}>${f}</g>`:""}async function it(t,e){let r="";for(let a of z(t))a.name==="mc:AlternateContent"?r+=await it(($(a.inner,"mc:Fallback")??$(a.inner,"mc:Choice"))?.inner??"",e):a.name==="p:sp"||a.name==="p:cxnSp"?r+=await re(a.inner,e):a.name==="p:pic"?r+=await ae(a.inner,e):a.name==="p:grpSp"&&(r+=await oe(a.inner,e));return r}async function se(t,e){let r=$(t,"p:bgPr"),a=$(t,"p:bgRef"),n=Number(m(a?.tag??"","idx")??0),o={...e,defs:[]},s=r?.inner??(n>1e3?e.styles.bg[n-1001]:n?e.styles.fill[n-1]:void 0)??(a?'<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>':""),p=a?H(a.inner,e):null,l=$(s,"a:solidFill"),c=l?H(l.inner,e,p)?.rgb??null:t?null:e.scheme.lt1??[255,255,255],f=await Q(s,"fill",r?o:{...o,rels:e.themeRels},p)??(c?`fill="${nt(c)}"`:void 0);return{rgb:c,svg:f&&f!=='fill="none"'?`${o.defs.join("")}<rect width="${i(e.size[0])}" height="${i(e.size[1])}" ${f}/>`:""}}function Et(t,e,r){let a=n=>r.exec(/<p:txBody>[\s\S]*?<\/p:txBody>/.exec([...n.matchAll(/<p:sp>[\s\S]*?<\/p:sp>/g)].find(([o])=>/<p:ph\b[^>]*type="(title|ctrTitle)"/.test(o))?.[0]??"")?.[0]??"")?.[1];return a(t)??a(e)??r.exec(/<p:titleStyle>[\s\S]*?<\/p:titleStyle>/.exec(e)?.[0]??"")?.[1]}function ie(t,e,r){let a=Et(t,e,/<a:solidFill>([\s\S]*?)<\/a:solidFill>/);return(a&&H(a,r)?.rgb)??r.scheme[r.map.tx1??"dk1"]??null}var le=(t,[e,r])=>`data:image/svg+xml,${encodeURIComponent(`<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="${i(e)}" height="${i(r)}" viewBox="0 0 ${i(e)} ${i(r)}" preserveAspectRatio="none">${t}</svg>`).replace(/%2F/g,"/").replace(/%2B/g,"+").replace(/%3D/g,"=")}`;function ce(t,e,r,a=!1){let n=h=>["title","ctrTitle","subTitle"].includes(h.type),o=h=>h.box,s=(h,x)=>Math.abs(h[0]-x[0])<e*.05&&Math.abs(h[2]-x[2])<e*.05&&h[1]>x[1],p=t.filter(n),l=h=>/^body-([a-z][a-z0-9-]{0,31})$/.exec(h.name)?.[1],c=t.filter(h=>!n(h)).sort((h,x)=>o(h)[0]-o(x)[0]||o(h)[1]-o(x)[1]),f=p.length?c.length===1&&!l(c[0])&&o(c[0])[1]>=o(p[0])[1]?c[0]:c.find(h=>l(h)==="default"||!l(h)&&s(o(h),o(p[0]))):void 0,g=f?[...p,f]:p,k=c.filter(h=>h!==f),b=h=>h.length?((x,P,T,U)=>[x,P,T-x,U-P])(Math.min(...h.map(x=>x[0])),Math.min(...h.map(x=>x[1])),Math.max(...h.map(x=>x[0]+x[2])),Math.max(...h.map(x=>x[1]+x[3]))):null,y=g.length?k:k.slice(1),u=g.length?b(g.map(o)):k.length?o(k[0]):[0,0,e,r],S=y.every((h,x)=>!x||o(h)[0]>=(o(y[x-1])[0]+o(y[x-1])[2])*.98),O=S&&y.length===2&&g.length?["left","right"]:S&&y.length===3&&g.length?["left","middle","right"]:S&&y.length===1?["right"]:S&&y.length===2?["middle","right"]:y.map((h,x)=>`s${x+1}`),M=[["default",u],...y.map((h,x)=>[l(h)??O[x],o(h)])],C=(h,x,P)=>[...new Set([...a?[0,P]:[],...M.flatMap(([,T])=>[T[h],T[h]+T[x]])])].sort((T,U)=>T-U).reduce((T,U)=>T.length&&U-T[T.length-1]<P*.03?T:[...T,U],[]),F=C(0,2,e),j=C(1,3,r),A=a?.01:.03,I=(h,x,P)=>x>=h[0]-e*A&&x<=h[0]+h[2]+e*A&&P>=h[1]-r*A&&P<=h[1]+h[3]+r*A,E=j.slice(1).map((h,x)=>F.slice(1).map((P,T)=>M.find(([,U])=>I(U,(F[T]+P)/2,(j[x]+h)/2))?.[0]??"."));if(!E.length||!E[0].length||!E.flat().includes("default"))return null;let G=(h,x)=>h.length===2?["1fr"]:h.slice(1).map((P,T)=>`${Math.max(.1,Math.round((P-h[T])/x*100)/10)}fr`),X=G(j,r).map((h,x)=>!a&&M.length>1&&E[x].every(P=>P==="default"||P===".")?"auto":h);return{slots:M.map(([h])=>h),areas:E.map(h=>h.join(" ")).join(" | "),columns:G(F,e).join(" "),rows:X.join(" ")}}function It(t){let e="";for(let r=0;r<t.length;r+=32768)e+=String.fromCharCode(...t.subarray(r,r+32768));return btoa(e)}function ge(t){let e=n=>typeof n=="string"?{$type:"color",$value:n}:void 0,r=n=>Object.fromEntries(Object.entries({bg:n.paper,fg:n.ink,accent:n.primary,muted:n.muted,surface:n.soft}).flatMap(([o,s])=>e(s)?[[o,e(s)]]:[])),a=t.fonts??{};return{color:{light:r(t),...t.dark&&{dark:r(t.dark)},...t.series&&{series:Object.fromEntries(t.series.map((n,o)=>[`s${o+1}`,e(n)]))}},...(a.heading||a.body)&&{font:{...a.heading&&{heading:{$type:"fontFamily",$value:a.heading}},...a.body&&{body:{$type:"fontFamily",$value:a.body}}}}}}export{me as kitFromTemplate,ge as tokensToDtcg};
4
+ //# sourceMappingURL=template.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/kit.js", "../src/look.js", "../src/template.js"],
4
+ "sourcesContent": ["// A kit: a design system and the layouts that go with it, as data and never as CSS or code, so a\n// person, an organisation or a brain can make one and no kit can do more than lay out a slide.\n// deck's own kit holds the usual layouts; a host's (an organisation's, a project's) and the deck\n// file's own `kit:` go over it, in that order. A layout is a grid: its slots by name, the areas\n// they take, its tracks, how its words sit, what paper it is on, how big its logo shows, and the\n// PowerPoint layout it is nearest to, and the art a template draws behind it, layers among the kit's\n// pictures; a kit may turn one of the usual layouts off. Its tokens may hold a logo, a picture inside\n// the kit and never an address, as its pictures are. Everything is checked against a small grammar;\n// what fails is dropped, with a reason. Pure.\n\n/** @typedef {{ required?: boolean, max_words?: number, max_chars?: number, items?: [number, number], item_max_words?: number, heading_max_words?: number, kind?: string }} Budget */\n/** @typedef {{ label?: Record<string, string> | string, intent?: string, use_when?: string, avoid_when?: string, slots: string[], budgets: Record<string, Budget>, areas: string[][], columns: string[], rows: string[], align: 'start' | 'center' | 'end', justify: 'start' | 'center' | 'end', paper: 'paper' | 'fill' | 'ink' | 'soft', title: 'normal' | 'large' | 'huge', logo: 'big' | 'small' | 'none', pptx: string, numbered: boolean, art?: string[] }} Layout */\n/** @typedef {{ name?: string, tokens: Record<string, any>, layouts: Record<string, Layout>, pictures: Record<string, string> }} Kit */\n\nconst NAME = /^[a-z][a-z0-9-]{0,31}$/\nconst TRACK = /^(auto|min-content|max-content|\\d{1,2}(\\.\\d)?fr|\\d{1,3}%)$/\nconst PPTX = ['Title Slide', 'Title and Content', 'Section Header', 'Two Content', 'Comparison', 'Title Only', 'Blank', 'Content with Caption', 'Picture with Caption']\nconst ENUMS = /** @type {const} */ ({ align: ['start', 'center', 'end'], justify: ['start', 'center', 'end'], paper: ['paper', 'fill', 'ink', 'soft'], title: ['normal', 'large', 'huge'], logo: ['small', 'big', 'none'] })\n/** The corners a logo sits in, as `logoAt` names them, the first by default. */\nexport const CORNERS = ['top-end', 'top-start', 'bottom-end', 'bottom-start']\n\n/**\n * A logo as a kit holds it: a picture inside the kit, PNG, JPEG, GIF, WebP or SVG as a data: address of 512 KB at most,\n * never an address to fetch; else null. @param {unknown} value\n */\nexport const logoOf = (value) => (typeof value === 'string' && value.length <= 700_000 && /^data:image\\/(png|jpeg|gif|webp|svg\\+xml);base64,[a-z0-9+/]+=*$/i.test(value) ? value : null)\n\n/**\n * A picture of a kit's, a layer of a layout's art drawn behind its words over the whole slide: a picture inside the kit as a\n * logo is, or an SVG written out (`data:image/svg+xml,…`), of 3 MB at most, never an address to fetch; else null. @param {unknown} value\n */\nexport const artOf = (value) => (typeof value === 'string' && value.length <= 3_145_728 && /^data:image\\/(?:(?:png|jpeg|gif|webp|svg\\+xml);base64,[a-z0-9+/]+=*|svg\\+xml,[\\w.!~*'()%/+=-]*)$/i.test(value) ? value : null)\n\n/** The names brains give the usual layouts, for the ones deck has. */\nexport const ALIASES = /** @type {Record<string, string>} */ ({\n title: 'cover', 'title-slide': 'cover', 'two-columns': 'two-cols', 'two-column': 'two-cols', columns: 'two-cols', comparison: 'two-cols-header',\n 'three-columns': 'three-cols', 'section-header': 'section', divider: 'section', big: 'fact', number: 'fact', 'image-text': 'image-right', closing: 'end', thanks: 'end',\n})\n\n/** deck's own kit: the usual layouts, the ones Slidev names and the ones PowerPoint has, as data. */\nexport const STANDARD = /** @type {Kit} */ ({\n name: 'standard',\n tokens: {},\n pictures: {},\n layouts: Object.fromEntries(Object.entries(/** @type {Record<string, any>} */ ({\n default: { label: { en: 'Title and content', fr: 'Titre et contenu' }, pptx: 'Title and Content' },\n cover: { label: { en: 'Cover', fr: 'Couverture' }, justify: 'center', paper: 'fill', title: 'huge', logo: 'big', pptx: 'Title Slide', numbered: false },\n intro: { label: { en: 'Introduction', fr: 'Introduction' }, justify: 'center', paper: 'fill', title: 'large', logo: 'big', pptx: 'Title Slide', numbered: false },\n section: { label: { en: 'Section', fr: 'Section' }, justify: 'center', paper: 'ink', title: 'huge', pptx: 'Section Header', numbered: false },\n center: { label: { en: 'Centred', fr: 'Centré' }, justify: 'center', align: 'center', pptx: 'Title Only' },\n statement: { label: { en: 'Statement', fr: 'Affirmation' }, justify: 'center', align: 'center', title: 'large', pptx: 'Title Only' },\n fact: { label: { en: 'Big number', fr: 'Grand chiffre' }, justify: 'center', align: 'center', title: 'huge', pptx: 'Title Only' },\n quote: { label: { en: 'Quote', fr: 'Citation' }, justify: 'center', pptx: 'Title Only' },\n end: { label: { en: 'Closing', fr: 'Clôture' }, justify: 'center', align: 'center', paper: 'fill', title: 'large', logo: 'big', pptx: 'Title Slide', numbered: false },\n full: { label: { en: 'Full', fr: 'Plein cadre' }, logo: 'none', pptx: 'Blank', numbered: false },\n none: { label: { en: 'Blank', fr: 'Vide' }, logo: 'none', pptx: 'Blank', numbered: false },\n 'two-cols': { label: { en: 'Two columns', fr: 'Deux colonnes' }, slots: ['default', 'right'], areas: 'default right', columns: '1fr 1fr', pptx: 'Two Content' },\n 'two-cols-header': { label: { en: 'Comparison', fr: 'Comparaison' }, slots: ['default', 'left', 'right', 'bottom'], areas: 'default default | left right | bottom bottom', columns: '1fr 1fr', rows: 'auto 1fr auto', pptx: 'Comparison' },\n 'three-cols': { label: { en: 'Three columns', fr: 'Trois colonnes' }, slots: ['default', 'left', 'middle', 'right'], areas: 'default default default | left middle right', columns: '1fr 1fr 1fr', rows: 'auto 1fr', pptx: 'Comparison' },\n 'image-left': { label: { en: 'Picture left', fr: 'Image à gauche' }, pptx: 'Picture with Caption', justify: 'center' },\n 'image-right': { label: { en: 'Picture right', fr: 'Image à droite' }, pptx: 'Picture with Caption', justify: 'center' },\n image: { label: { en: 'Picture', fr: 'Image' }, logo: 'none', pptx: 'Blank', numbered: false },\n })).map(([name, given]) => [name, /** @type {Layout} */ (layoutOf(given).layout)])),\n})\n\n/**\n * A layout as given, checked: its slots, areas and tracks in the grammar, its words' place, paper\n * and size among their names. @param {any} given @returns {{ layout: Layout | null, problems: string[] }}\n */\nexport function layoutOf(given) {\n const problems = []\n if (!given || typeof given !== 'object') return { layout: null, problems: ['not a layout'] }\n // Slots as names, or as a catalog writes them: each a budget, `title` being the heading the\n // default slot opens with rather than a slot of its own.\n /** @type {Record<string, Budget>} */\n const budgets = {}\n const named = Array.isArray(given.slots) || typeof given.slots === 'string' ? [given.slots].flat().map(String)\n : given.slots && typeof given.slots === 'object' ? Object.entries(given.slots).map(([name, budget]) => {\n if (budget && typeof budget === 'object') budgets[name] = clean(budget)\n return name === 'title' ? 'default' : name\n }) : ['default']\n const slots = [...new Set(named)]\n if (!slots.every((slot) => NAME.test(slot))) return { layout: null, problems: ['a slot name is not a-z, 0-9 and -'] }\n if (!slots.includes('default')) slots.unshift('default')\n // Areas as Slidev's and CSS's grid write them, rows split by | or new lines.\n /** @type {string[]} */\n const lines = Array.isArray(given.areas) ? given.areas.map((/** @type {any} */ row) => [row].flat().join(' ')) : String(given.areas ?? slots.join(' ')).split(/\\||\\n/)\n const rows = lines.map((row) => row.trim().replace(/^\"|\"$/g, '').split(/\\s+/)).filter((row) => row.length && row[0])\n const width = rows[0]?.length ?? 0\n if (!rows.length || rows.some((row) => row.length !== width) || rows.flat().some((cell) => cell !== '.' && !slots.includes(cell))) return { layout: null, problems: ['areas are not a rectangle of its slots'] }\n for (const slot of slots) {\n const cells = rows.flatMap((row, y) => row.map((cell, x) => /** @type {[string, number, number]} */ ([cell, x, y]))).filter(([cell]) => cell === slot)\n if (!cells.length) { if (slot !== 'default') problems.push(`slot ${slot} has no area`); continue }\n const xs = cells.map((c) => c[1]), ys = cells.map((c) => c[2])\n if (cells.length !== (Math.max(...xs) - Math.min(...xs) + 1) * (Math.max(...ys) - Math.min(...ys) + 1)) return { layout: null, problems: [`slot ${slot} is not a rectangle`] }\n }\n const tracks = (/** @type {any} */ value, /** @type {number} */ count) => {\n const list = value === undefined ? Array(count).fill('1fr') : (Array.isArray(value) ? value : String(value).split(/\\s+/)).map(String)\n return list.length === count && list.every((t) => TRACK.test(t)) ? list : null\n }\n const columns = tracks(given.columns, width), rowTracks = tracks(given.rows, rows.length)\n if (!columns || !rowTracks) return { layout: null, problems: ['columns or rows are not tracks deck knows (auto, 1fr, 40%…), one per column or row'] }\n const pick = (/** @type {keyof typeof ENUMS} */ key, /** @type {string} */ fallback) => {\n const value = String(given[key] ?? fallback)\n if (!(/** @type {readonly string[]} */ (ENUMS[key])).includes(value)) { problems.push(`${key} ${value} is not one of ${ENUMS[key].join(', ')}`); return fallback }\n return value\n }\n const label = typeof given.label === 'string' || (given.label && typeof given.label === 'object') ? given.label : undefined\n const art = Array.isArray(given.art) && given.art.length <= 8 && given.art.every((/** @type {unknown} */ one) => typeof one === 'string' && NAME.test(one)) ? given.art : undefined\n if (given.art !== undefined && !art) problems.push('art is not 8 names at most')\n const words = (/** @type {any} */ v) => (typeof v === 'string' ? v.slice(0, 300) : undefined)\n return {\n layout: /** @type {Layout} */ ({\n label, intent: words(given.intent), use_when: words(given.use_when), avoid_when: words(given.avoid_when), slots, budgets, areas: rows, columns, rows: rowTracks,\n align: pick('align', 'start'), justify: pick('justify', 'start'), paper: pick('paper', 'paper'), title: pick('title', 'normal'), logo: pick('logo', 'small'),\n pptx: PPTX.includes(given.pptx) ? given.pptx : slots.length > 1 ? 'Comparison' : 'Title and Content', numbered: given.numbered !== false, art,\n }),\n problems,\n }\n}\n\n/** A slot's budget, its numbers only. @param {Record<string, any>} given @returns {Budget} */\nfunction clean(given) {\n /** @type {Record<string, any>} */\n const kept = {}\n for (const key of ['max_words', 'max_chars', 'item_max_words', 'heading_max_words']) if (Number.isInteger(given[key]) && given[key] > 0) kept[key] = given[key]\n if (Array.isArray(given.items) && given.items.length === 2 && given.items.every(Number.isInteger)) kept.items = given.items\n if (typeof given.required === 'boolean') kept.required = given.required\n if (typeof given.kind === 'string' && /^[a-z-]{1,20}$/.test(given.kind)) kept.kind = given.kind\n return kept\n}\n\n/**\n * Design tokens as the W3C's Design Tokens format (DTCG 2025.10) writes them, read into a kit's:\n * `color.light` and `color.dark` groups (bg, surface, fg, muted, accent) or flat colours, `font.sans`\n * and the like; each `$value` a colour string or a colour object with its `hex` and `alpha`. Tokens already flat\n * pass through. @param {any} given @returns {Record<string, any>}\n */\nexport function tokensFrom(given) {\n if (!given || typeof given !== 'object') return {}\n if (!JSON.stringify(given).includes('\"$value\"')) return given\n const value = (/** @type {any} */ t) => (t && typeof t === 'object' && '$value' in t ? t.$value : t)\n // A colour object's alpha kept, as #rrggbbaa.\n const colour = (/** @type {any} */ t) => { const v = value(t); return typeof v === 'string' ? v : typeof v?.hex === 'string' ? `${v.hex}${typeof v.alpha === 'number' && v.alpha < 1 ? Math.round(Math.max(0, v.alpha) * 255).toString(16).padStart(2, '0') : ''}` : undefined }\n const face = (/** @type {any} */ t) => { const v = value(t); return Array.isArray(v) ? v.map(String) : typeof v === 'string' ? [v] : undefined }\n const NAMES = /** @type {const} */ ({ bg: 'paper', background: 'paper', paper: 'paper', fg: 'ink', text: 'ink', ink: 'ink', accent: 'primary', primary: 'primary', muted: 'muted', surface: 'soft', soft: 'soft' })\n const group = (/** @type {any} */ g) => Object.fromEntries(Object.entries(g ?? {}).filter(([k]) => k in NAMES).map(([k, t]) => [NAMES[/** @type {keyof typeof NAMES} */ (k)], colour(t)]).filter(([, v]) => v))\n const colours = given.color ?? given.colour ?? {}\n /** @type {Record<string, any>} */\n const tokens = { ...group(colours), ...group(colours.light) }\n const dark = group(colours.dark)\n if (Object.keys(dark).length) tokens.dark = dark\n const fonts = given.font ?? given.fontFamily ?? {}\n const heading = face(fonts.heading ?? fonts.display ?? fonts.sans), body = face(fonts.body ?? fonts.text ?? fonts.sans)\n if (heading || body) tokens.fonts = { heading: heading ?? body, body: body ?? heading }\n return tokens\n}\n\n/**\n * Kits merged, the later over the earlier: their tokens, their dark ones within theirs, their layouts by name and their\n * pictures, each checked; a layout given as false is taken away, but the default. A logo that isn't a picture inside the\n * kit is dropped. @param {...any} kits @returns {{ kit: Kit, problems: string[] }}\n */\nexport function mergeKits(...kits) {\n /** @type {Kit} */\n const kit = { name: 'standard', tokens: {}, layouts: { ...STANDARD.layouts }, pictures: {} }\n const problems = []\n for (const given of kits) {\n if (!given || typeof given !== 'object') continue\n if (typeof given.name === 'string') kit.name = given.name\n if (given.tokens && typeof given.tokens === 'object') {\n const next = tokensFrom(given.tokens), dark = next.dark && typeof next.dark === 'object' ? { ...kit.tokens.dark, ...next.dark } : kit.tokens.dark\n kit.tokens = { ...kit.tokens, ...next, ...(dark && { dark }) }\n }\n for (const [name, picture] of Object.entries(given.pictures ?? {})) {\n if (NAME.test(name) && artOf(picture)) kit.pictures[name] = picture\n else problems.push(`picture ${name}: not a picture inside the kit`)\n }\n for (const [name, definition] of Object.entries(given.layouts ?? given.types ?? {})) {\n if (!NAME.test(name)) { problems.push(`layout ${name}: not a-z, 0-9 and -`); continue }\n if (definition === false) { if (name !== 'default') delete kit.layouts[name]; continue }\n const { layout, problems: found } = layoutOf(definition)\n problems.push(...found.map((p) => `layout ${name}: ${p}`))\n if (layout) kit.layouts[name] = layout\n }\n }\n for (const [where, tokens] of /** @type {[string, Record<string, any> | undefined][]} */ ([['logo', kit.tokens], ['dark logo', kit.tokens.dark]])) {\n if (tokens?.logo !== undefined && !logoOf(tokens.logo)) { problems.push(`${where}: not a picture inside the kit (PNG, JPEG, GIF, WebP or SVG as data:, 512 KB at most)`); delete tokens.logo }\n }\n if (kit.tokens.logoAt !== undefined && !CORNERS.includes(kit.tokens.logoAt)) { problems.push(`logoAt ${kit.tokens.logoAt} is not one of ${CORNERS.join(', ')}`); delete kit.tokens.logoAt }\n return { kit, problems }\n}\n\n/** A layout's name in a language, else its own name. @param {Layout} layout @param {string} name @param {string} lang */\nexport function labelOf(layout, name, lang) {\n if (typeof layout.label === 'string') return layout.label\n return layout.label?.[lang] ?? layout.label?.[lang.split('-')[0]] ?? layout.label?.en ?? name\n}\n\n/**\n * The layout a slide that names none is given, from what it holds, as Pandoc's PowerPoint writer\n * chooses: the first slide is the cover; a heading alone, a section; slots beyond the first, the\n * layout of two (or three) columns that has them; a number alone as its heading, a fact; a quote\n * alone, a quote; else the default. @param {{ index: number, slots: { name: string, text: string }[] }} slide\n */\nexport function inferLayout(slide) {\n const names = slide.slots.map((slot) => slot.name)\n if (names.includes('middle')) return 'three-cols'\n if (names.includes('left')) return 'two-cols-header'\n if (names.includes('right')) return 'two-cols'\n if (slide.index === 0) return 'cover'\n const text = slide.slots.map((slot) => slot.text).join('\\n').trim()\n const lines = text.split('\\n').filter((line) => line.trim())\n if (lines.length === 1 && /^#{1,2}\\s+\\S/.test(lines[0])) return 'section'\n if (/^#\\s+[^\\s]*\\d[\\d\\s.,%€$£¥]*\\S*\\s*$/u.test(lines[0] ?? '') && lines.length <= 3 && !/^\\s*[-*\\d]+[.)]?\\s/m.test(lines.slice(1).join('\\n'))) return 'fact'\n if (lines.length && lines.every((line, i) => line.startsWith('>') || (i === lines.length - 1 && !line.startsWith('#')))) return lines[0].startsWith('>') ? 'quote' : 'default'\n return 'default'\n}\n", "// A deck's look: a design system's few tokens (paper, ink, primary, a voice for its type), from a\n// named look, then the project's, then the deck's own `themeConfig`, as Slidev names a theme's\n// settings. Light and dark are both worked out from them: each colour kept at its hue, deepened or\n// lightened until it reads at AA on the paper it sits on (4.5:1 for words, 3:1 for a chart's\n// marks), so a brain's or a person's colours can't make a slide unreadable. Pure.\n\n/** @typedef {{ paper: string, ink: string, primary: string, voice: string, radius: number, muted?: string, soft?: string, series?: string[], dark?: Record<string, string>, fonts?: { heading: string[], body: string[] } }} Tokens */\n/** @typedef {{ paper: string, ink: string, muted: string, line: string, primary: string, onPrimary: string, soft: string, series: string[] }} Scheme */\n\n/** Looks a deck can name (`theme:`), each a handful of tokens. */\nexport const LOOKS = /** @type {Record<string, Tokens>} */ ({\n default: { paper: '#fffdf8', ink: '#1d1b16', primary: '#f7c531', voice: 'calm', radius: 10 },\n ocean: { paper: '#f6fafb', ink: '#0d2530', primary: '#0f766e', voice: 'calm', radius: 6 },\n ember: { paper: '#fff8f3', ink: '#2a160c', primary: '#d9480f', voice: 'bold', radius: 2 },\n ink: { paper: '#ffffff', ink: '#111111', primary: '#3b5bdb', voice: 'elegant', radius: 0 },\n})\n\n/** Type for each voice: the device's faces, so a deck needs nothing to download to look right. */\nexport const VOICES = /** @type {Record<string, { heading: string, body: string }>} */ ({\n calm: { heading: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, \"Noto Sans\", sans-serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, \"Noto Sans\", sans-serif' },\n elegant: { heading: 'ui-serif, \"Iowan Old Style\", Georgia, \"Noto Serif\", serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, sans-serif' },\n bold: { heading: '\"Avenir Next Condensed\", \"Arial Narrow\", ui-sans-serif, system-ui, sans-serif', body: 'ui-sans-serif, system-ui, \"Segoe UI\", Roboto, sans-serif' },\n friendly: { heading: 'ui-rounded, \"SF Pro Rounded\", \"Nunito\", system-ui, sans-serif', body: 'ui-rounded, \"SF Pro Rounded\", system-ui, sans-serif' },\n})\n\n/**\n * The tokens a deck's settings give, over the project's look and a named one.\n * @param {Record<string, any>} settings @param {Partial<Tokens>} [project]\n * @returns {Tokens}\n */\nexport function tokensOf(settings, project = {}) {\n const named = LOOKS[String(settings.theme ?? '')] ?? LOOKS.default\n const own = typeof settings.themeConfig === 'object' && settings.themeConfig ? settings.themeConfig : {}\n /** @type {Tokens} */\n const tokens = { ...named, ...clean(project), ...clean(own) }\n if (!VOICES[tokens.voice]) tokens.voice = 'calm'\n return tokens\n}\n\n/** @param {Record<string, any>} given @returns {Partial<Tokens>} */\nfunction clean(given) {\n /** @type {Partial<Tokens>} */\n const kept = {}\n for (const key of /** @type {const} */ (['paper', 'ink', 'primary', 'muted', 'soft'])) if (typeof given[key] === 'string' && rgbOf(given[key])) kept[key] = given[key]\n if (given.dark && typeof given.dark === 'object') kept.dark = Object.fromEntries(Object.entries(given.dark).filter(([, v]) => typeof v === 'string' && rgbOf(v)))\n if (given.fonts && Array.isArray(given.fonts.heading) && Array.isArray(given.fonts.body)) kept.fonts = { heading: given.fonts.heading.map(String), body: given.fonts.body.map(String) }\n if (typeof given.voice === 'string') kept.voice = given.voice\n if (typeof given.radius === 'number') kept.radius = given.radius\n if (Array.isArray(given.series) && given.series.length && given.series.every((/** @type {unknown} */ c) => typeof c === 'string' && rgbOf(c))) kept.series = given.series.slice(0, 6)\n return kept\n}\n\n/**\n * Light or dark, worked out from the tokens: dark swaps paper and ink and lifts the primary.\n * @param {Tokens} tokens @param {'light' | 'dark'} scheme @returns {Scheme}\n */\nexport function schemeOf(tokens, scheme) {\n // A see-through colour is seen over the paper it is on.\n const light = rgbOf(tokens.paper) ?? [255, 253, 248], dark = rgbOf(tokens.ink, light) ?? [29, 27, 22]\n // A kit's own dark colours where it gives them (a design system's dark mode), else worked out.\n const own = scheme === 'dark' ? tokens.dark ?? {} : {}\n const paper = round(rgbOf(own.paper ?? '', scheme === 'dark' ? [0, 0, 0] : [255, 255, 255]) ?? (scheme === 'dark' ? mix(dark, [0, 0, 0], 0.35) : light))\n const ink = round(rgbOf(own.ink ?? '', paper) ?? (scheme === 'dark' ? mix(light, [255, 255, 255], 0.2) : dark))\n const primary = rgbOf(own.primary ?? tokens.primary, paper) ?? [247, 197, 49]\n // The primary as a fill keeps its own colour; as words or marks it is made to read on the paper.\n const text = readable(primary, paper, 4.5)\n const onPrimary = contrast(ink, primary) >= contrast(paper, primary) ? ink : paper\n // A chart's colours: the kit's own (a template's accents), else the primary turned round the wheel; each made to read at 3:1.\n const given = (tokens.series ?? []).map((c) => rgbOf(c, paper)).filter((c) => c !== null)\n const series = [0, 1, 2, 3, 4, 5].map((n) => readable(/** @type {number[]} */ (given[n % (given.length || 1)] ?? rotate(primary, n * 57)), paper, 3))\n return {\n paper: css(paper), ink: css(ink), muted: css(readable(round(rgbOf(own.muted ?? (scheme === 'light' ? tokens.muted ?? '' : ''), paper) ?? mix(ink, paper, 0.38)), paper, 4.5)), line: css(mix(ink, paper, 0.82)),\n primary: css(text), onPrimary: css(onPrimary), soft: css(rgbOf(own.soft ?? (scheme === 'light' ? tokens.soft ?? '' : ''), paper) ?? mix(primary, paper, 0.78)), series: series.map(css),\n }\n}\n\n/**\n * A colour as deck reads one, as red, green and blue: `#rgb` or `#rrggbb` (`#rgba`, `#rrggbbaa` with an alpha), `rgb()` or\n * `rgba()` as CSS writes them, by commas or spaces, the alpha after a comma or a slash; one see-through is seen over `under`,\n * white unless said. @param {string} value @param {number[]} [under] @returns {[number, number, number] | null}\n */\nexport function rgbOf(value, under = [255, 255, 255]) {\n const text = String(value).trim(), digits = /^#?([\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})$/i.exec(text)?.[1], css = /^rgba?\\(([^)]*)\\)$/i.exec(text)?.[1].split(/[\\s,/]+/).filter(Boolean)\n const share = (/** @type {string} */ part, /** @type {number} */ whole) => (part.endsWith('%') ? (parseFloat(part) / 100) * whole : Number(part))\n const [r, g, b, a = 1] = digits ? (digits.length < 5 ? [...digits].map((c) => c + c) : /** @type {string[]} */ (digits.match(/../g))).map((h, i) => parseInt(h, 16) / (i > 2 ? 255 : 1))\n : css?.length === 3 || css?.length === 4 ? css.map((part, i) => share(part, i > 2 ? 1 : 255)) : []\n return r !== undefined && [r, g, b].every((c) => c >= 0 && c <= 255) && a >= 0 && a <= 1 ? round(mix(under, [r, g, b], a)) : null\n}\n\n/** @param {number[]} rgb */\nexport const css = (rgb) => `#${rgb.map((c) => Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, '0')).join('')}`\n\n/** A colour as it will be written: whole numbers, so that it reads at the ratio checked. @param {number[]} c */\nconst round = (c) => /** @type {[number, number, number]} */ (c.map((v) => Math.round(Math.max(0, Math.min(255, v)))))\n\n/** @param {number[]} a @param {number[]} b @param {number} t */\nconst mix = (a, b, t) => /** @type {[number, number, number]} */ (a.map((c, i) => c + (b[i] - c) * t))\n\n/** @param {number[]} rgb */\nfunction luminance(rgb) {\n const [r, g, b] = rgb.map((c) => { const s = c / 255; return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4 })\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\n/** WCAG's contrast ratio. @param {number[]} a @param {number[]} b */\nexport function contrast(a, b) {\n const [x, y] = [luminance(a), luminance(b)].sort((p, q) => q - p)\n return (x + 0.05) / (y + 0.05)\n}\n\n/**\n * The colour, its hue kept, deepened or lightened toward black or white until it reads at the\n * ratio on the paper. @param {number[]} colour @param {number[]} paper @param {number} ratio\n */\nexport function readable(colour, paper, ratio) {\n const toward = luminance(paper) > 0.18 ? [0, 0, 0] : [255, 255, 255]\n let t = 0, out = round(colour)\n while (contrast(out, paper) < ratio && t < 1) out = round(mix(colour, toward, (t = Math.min(1, t + 0.02))))\n return out\n}\n\n/** The colour turned round the colour wheel. @param {number[]} rgb @param {number} degrees */\nfunction rotate(rgb, degrees) {\n const [r, g, b] = rgb.map((c) => c / 255)\n const max = Math.max(r, g, b), min = Math.min(r, g, b), l = (max + min) / 2\n const d = max - min\n const s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1))\n let h = d === 0 ? 0 : max === r ? ((g - b) / d) % 6 : max === g ? (b - r) / d + 2 : (r - g) / d + 4\n h = (h * 60 + degrees + 360) % 360\n const c = (1 - Math.abs(2 * l - 1)) * Math.max(s, 0.55), x = c * (1 - Math.abs(((h / 60) % 2) - 1)), m = l - c / 2\n const [p, q, u] = h < 60 ? [c, x, 0] : h < 120 ? [x, c, 0] : h < 180 ? [0, c, x] : h < 240 ? [0, x, c] : h < 300 ? [x, 0, c] : [c, 0, x]\n return [p + m, q + m, u + m].map((v) => v * 255)\n}\n", "// A kit from a company's PowerPoint template (.potx, .pptx, or an Office theme, .thmx), and a kit's tokens out in the W3C's Design Tokens format:\n// a module of its own (@codename/deck/template), which a host loads only when it reads or writes one. From the template,\n// its theme's colours (the first light its paper, the first dark its ink, the first accent its primary, the six accents a\n// chart's colours) and faces (headings', words'); the first picture on its slide master, its logo, in the corner it sits\n// in; and each slide layout, a layout of the kit by its name, its placeholders a grid of slots, on the paper its\n// background is, with its art: what a slide on it shows besides its placeholders (its background, the master's shapes and\n// pictures, its own, their text), drawn as SVG layers behind the words, each kept once among the kit's pictures. The file is read with the platform's own\n// DecompressionStream and its XML with regular expressions, as a page under Trusted Types parses no markup. What can't be\n// read is left out, with a reason.\n\nimport { STANDARD, mergeKits, logoOf, artOf } from './kit.js'\nimport { contrast, rgbOf } from './look.js'\n\n/** The slide layouts PowerPoint names as deck's own are: a template's take their place. */\nconst OWN = /** @type {Record<string, string>} */ ({ 'Title Slide': 'cover', 'Title and Content': 'default', 'Section Header': 'section', 'Two Content': 'two-cols-header', 'Title Only': 'center', Blank: 'none' })\nconst PPTX = ['Title Slide', 'Title and Content', 'Section Header', 'Two Content', 'Comparison', 'Title Only', 'Blank', 'Content with Caption', 'Picture with Caption']\nconst PICTURES = /** @type {Record<string, string>} */ ({ png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif', svg: 'image/svg+xml' })\n/** The pictures a browser draws in a layout's art, and how large one may be. */\nconst DRAWN = /** @type {Record<string, string>} */ ({ ...PICTURES, webp: 'image/webp', bmp: 'image/bmp' })\nconst PICTURE_MB = 2, ART_MB = 3\n/** A point is 12,700 of PowerPoint's units: art is drawn in points. */\nconst EMU = 12700\n\n/** A zip's files by name, each read when asked. @param {Uint8Array} bytes */\nfunction unzip(bytes) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n let end = bytes.length - 22\n while (end >= 0 && view.getUint32(end, true) !== 0x06054b50) end--\n if (end < 0) throw new Error('not a PowerPoint file')\n /** @type {Map<string, () => Promise<Uint8Array>>} */\n const files = new Map()\n for (let at = view.getUint32(end + 16, true), n = view.getUint16(end + 10, true); n > 0; n--) {\n const method = view.getUint16(at + 10, true), size = view.getUint32(at + 20, true), name = new TextDecoder().decode(bytes.subarray(at + 46, at + 46 + view.getUint16(at + 28, true)))\n const local = view.getUint32(at + 42, true), start = local + 30 + view.getUint16(local + 26, true) + view.getUint16(local + 28, true), data = bytes.subarray(start, start + size)\n files.set(name, async () => (method === 0 ? data : new Uint8Array(await new Response(new Blob([/** @type {BlobPart} */ (data)]).stream().pipeThrough(new DecompressionStream('deflate-raw'))).arrayBuffer())))\n at += 46 + view.getUint16(at + 28, true) + view.getUint16(at + 30, true) + view.getUint16(at + 32, true)\n }\n return files\n}\n\n/** An attribute's value in a piece of XML. @param {string} xml @param {string} name */\nconst attr = (xml, name) => new RegExp(`\\\\b${name}=\"([^\"]*)\"`).exec(xml)?.[1]\n/** A part's relationships, by their ids, as paths from the package's root. @param {string} rels @param {string} from the part's folder */\nconst targets = (rels, from) => new Map([...rels.matchAll(/<Relationship\\b[^>]*>/g)].map(([one]) => [String(attr(one, 'Id')), new URL(String(attr(one, 'Target')), `file:///${from}/`).pathname.slice(1)]))\n\n/**\n * A kit read from a PowerPoint template, with what couldn't be read.\n * @param {Uint8Array} bytes a .potx, .pptx or .thmx @param {{ name?: string }} [options]\n * @returns {Promise<{ kit: import('./kit.js').Kit, problems: string[] }>}\n */\nexport async function kitFromTemplate(bytes, { name } = {}) {\n const files = unzip(bytes), problems = /** @type {string[]} */ ([])\n const text = async (/** @type {string} */ path) => new TextDecoder().decode(await (files.get(path)?.() ?? new Uint8Array()))\n // A template's parts are under ppt/, an Office theme's under theme/.\n const master = [...files.keys()].filter((path) => /^(ppt|theme)\\/slideMasters\\/slideMaster\\d+\\.xml$/.test(path)).sort()[0]\n if (!master) throw new Error('no slide master: not a PowerPoint template')\n const root = master.split('/')[0], masterXml = await text(master), masterRels = targets(await text(master.replace(/([^/]+)$/, '_rels/$1.rels')), `${root}/slideMasters`)\n const themePath = [...masterRels.values()].find((path) => /theme\\/theme\\d+\\.xml$/.test(path)) ?? `${root}/theme/theme1.xml`, theme = await text(themePath)\n const [cx, cy] = ((size) => [Number(attr(size, 'cx') ?? 12192000), Number(attr(size, 'cy') ?? 6858000)])(/<p:sldSz\\b[^>]*>/.exec(await text(`${root}/presentation.xml`))?.[0] ?? '')\n\n // Its theme: colours by their role, as its master maps them to the paper and the words (bg1, tx1…), faces for headings and words.\n const mapOf = (/** @type {string} */ xml) => Object.fromEntries([...(/<(?:p:clrMap|a:overrideClrMapping)\\b[^>]*>/.exec(xml)?.[0] ?? '').matchAll(/(\\w+)=\"(\\w+)\"/g)].map(([, key, value]) => [key, value]))\n const masterMap = { bg1: 'lt1', tx1: 'dk1', bg2: 'lt2', tx2: 'dk2', ...mapOf(masterXml) }\n const scheme = Object.fromEntries([...theme.matchAll(/<a:(dk1|lt1|dk2|lt2|accent[1-6]|hlink|folHlink)>\\s*<a:(?:srgbClr\\b[^>]*\\bval|sysClr\\b[^>]*\\blastClr)=\"([0-9A-Fa-f]{6})\"/g)].map(([, role, value]) => [role, `#${value.toLowerCase()}`]))\n const face = (/** @type {string} */ part) => attr(new RegExp(`<a:${part}>[\\\\s\\\\S]*?<a:latin\\\\b[^>]*>`).exec(theme)?.[0].replace(/^[\\s\\S]*<a:latin/, '') ?? '', 'typeface')\n const [heading, body] = [face('majorFont'), face('minorFont')].map((one) => (one && !one.startsWith('+') ? [one, 'ui-sans-serif', 'system-ui', 'sans-serif'] : null))\n /** @type {Record<string, any>} */\n const tokens = Object.fromEntries(/** @type {[string, string][]} */ ([['paper', masterMap.bg1], ['ink', masterMap.tx1], ['primary', 'accent1'], ['muted', masterMap.tx2], ['soft', masterMap.bg2]]).filter(([, role]) => scheme[role]).map(([key, role]) => [key, scheme[role]]))\n const accents = [1, 2, 3, 4, 5, 6].map((n) => scheme[`accent${n}`]).filter(Boolean)\n if (accents.length) tokens.series = accents\n if (heading || body) tokens.fonts = { heading: heading ?? body, body: body ?? heading }\n\n // Its logo: the first picture on its master that a browser draws, in the corner it sits in.\n let logoPath = ''\n for (const [pic] of masterXml.matchAll(/<p:pic>[\\s\\S]*?<\\/p:pic>/g)) {\n const path = masterRels.get(String(attr(/<a:blip\\b[^>]*>/.exec(pic)?.[0] ?? '', 'r:embed'))), type = PICTURES[/\\.(\\w+)$/.exec(path ?? '')?.[1].toLowerCase() ?? '']\n if (!path || !type || !files.has(path)) continue\n const data = await files.get(path)?.(), url = data && `data:${type};base64,${base64(data)}`\n if (!logoOf(url)) { problems.push(`the logo ${path.split('/').pop()} is larger than 512 KB`); break }\n const [x, y] = ((off) => [Number(attr(off, 'x') ?? 0), Number(attr(off, 'y') ?? 0)])(/<a:off\\b[^>]*>/.exec(pic)?.[0] ?? '')\n Object.assign(tokens, { logo: url, logoAt: `${y < cy / 2 ? 'top' : 'bottom'}-${x < cx / 2 ? 'start' : 'end'}` })\n logoPath = path\n break\n }\n\n // What its art is drawn with: its colours by role, its colour map, its styles' fills and lines, its faces, its pictures.\n const lists = (/** @type {string} */ list) => children(new RegExp(`<a:${list}>([\\\\s\\\\S]*?)</a:${list}>`).exec(theme)?.[1] ?? '').map((one) => one.xml)\n /** @type {Art} */\n const art = { scheme: Object.fromEntries(Object.entries(scheme).map(([role, hex]) => [role, rgbOf(hex.slice(1))])), map: masterMap, rels: masterRels, files, size: [cx / EMU, cy / EMU],\n themeRels: targets(await text(themePath.replace(/([^/]+)$/, '_rels/$1.rels')), themePath.replace(/\\/[^/]+$/, '')),\n styles: { fill: lists('fillStyleLst'), line: lists('lnStyleLst'), bg: lists('bgFillStyleLst') }, faces: { major: face('majorFont') ?? '', minor: face('minorFont') ?? '' },\n pictures: new Map(), used: new Set(), noted: new Set(), ids: { n: 0 }, defs: [] }\n // The master's shapes, drawn once for each colour map its layouts read them with.\n const underneath = new Map()\n const masterArt = (/** @type {Record<string, string>} */ map) => underneath.get(JSON.stringify(map)) ?? underneath.set(JSON.stringify(map), ((used) => drawTree(treeOf(masterXml), { ...art, map, used, ids: { n: 0 } })\n .then((svg) => ({ svg, used })))(new Set())).get(JSON.stringify(map))\n // A colour as its role is, by the paper it is for: the background's its paper, the words' its ink, the first accent its fill, the second background's soft.\n const roles = /** @type {Record<string, string>} */ (Object.fromEntries([[masterMap.bg2, 'soft'], ['accent1', 'fill'], [masterMap.tx1, 'ink'], [masterMap.bg1, 'paper']].filter(([role]) => scheme[role]).map(([role, paper]) => [scheme[role], paper])))\n const [ink, paper] = [art.scheme[masterMap.tx1] ?? [0, 0, 0], art.scheme[masterMap.bg1] ?? [255, 255, 255]]\n\n // Its layouts: each placeholder where it sits, else where the master's of its kind sits; its art behind them.\n const placed = (/** @type {string} */ xml) => [...xml.matchAll(/<p:sp>[\\s\\S]*?<\\/p:sp>/g)].flatMap(([sp]) => {\n const ph = /<p:ph\\b[^>]*>/.exec(sp)?.[0]\n if (!ph) return []\n const off = /<a:off\\b[^>]*>/.exec(sp)?.[0], ext = /<a:ext\\b[^>]*>/.exec(sp)?.[0]\n return [{ type: attr(ph, 'type') ?? 'body', name: attr(/<p:cNvPr\\b[^>]*>/.exec(sp)?.[0] ?? '', 'name') ?? '', box: off && ext ? [Number(attr(off, 'x')), Number(attr(off, 'y')), Number(attr(ext, 'cx')), Number(attr(ext, 'cy'))] : null }]\n })\n const masterBoxes = placed(masterXml)\n /** @type {Record<string, any>} */\n const layouts = {}, pictures = /** @type {Record<string, string>} */ ({})\n // A layer of art, kept once among the kit's pictures by what it holds: its name, or none where it is too large.\n const layer = (/** @type {string} */ drawn, /** @type {string} */ where) => {\n const url = drawn ? artOf(svgOf(drawn, art.size)) : null\n if (drawn && !url) problems.push(`layout ${where}: a layer of its art is larger than ${ART_MB} MB`)\n if (!url) return []\n let hash = 2166136261\n for (let i = 0; i < url.length; i++) hash = Math.imul(hash ^ url.charCodeAt(i), 16777619) >>> 0\n pictures[`art-${hash.toString(36)}`] = url\n return [`art-${hash.toString(36)}`]\n }\n const paths = [...masterRels.values()].filter((path) => /slideLayouts\\/slideLayout\\d+\\.xml$/.test(path)).sort((a, b) => Number(/(\\d+)\\.xml$/.exec(a)?.[1]) - Number(/(\\d+)\\.xml$/.exec(b)?.[1]))\n for (const path of paths) {\n const xml = await text(path), title = (attr(/<p:cSld\\b[^>]*>/.exec(xml)?.[0] ?? '', 'name') ?? '').replace(/&amp;/g, '&').trim()\n const boxes = placed(xml).filter((one) => !['dt', 'ftr', 'sldNum'].includes(one.type)).map((one) => ({ ...one, box: one.box ?? masterBoxes.find((m) => m.type === one.type || (one.type === 'ctrTitle' && m.type === 'title'))?.box ?? null }))\n .filter((one) => one.box)\n const key = OWN[title] ?? (title.toLowerCase().normalize('NFKD').replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').replace(/^(?=\\d)/, 'l-').slice(0, 32) || `layout-${paths.indexOf(path) + 1}`)\n // Its art: its background, the master's shapes unless it hides them, its own; the paper its words read on.\n // Each layer its own SVG, its gradients and patterns numbered from one, so that layers alike are kept once.\n const here = { ...art, map: { ...masterMap, ...mapOf(xml) }, rels: targets(await text(path.replace(/([^/]+)$/, '_rels/$1.rels')), path.replace(/\\/[^/]+$/, '')), used: new Set(), ids: { n: 0 } }\n const own = bgOf(xml), back = await backOf(own ?? bgOf(masterXml), { ...here, ids: { n: 0 }, ...(!own && { rels: masterRels }) })\n const under = /<p:sldLayout\\b[^>]*\\bshowMasterSp=\"(0|false)\"/.test(xml) ? { svg: '', used: new Set() } : await masterArt(here.map)\n const mine = await drawTree(treeOf(xml), here), words = wordsOf(xml, masterXml, here), role = back.rgb ? roles[hexOf(back.rgb)] : undefined\n // Words the template sets light over its art read on ink; else on the paper their background is, a colour of the theme by its role.\n const light = words && contrast(words, ink) > contrast(words, paper)\n const sheet = role === 'fill' ? 'fill' : light && (under.svg || mine || !role) ? 'ink' : role ?? (back.rgb && contrast(back.rgb, ink) < contrast(back.rgb, paper) ? 'ink' : 'paper')\n const layers = [...layer(sheet === role ? '' : back.svg, title || key), ...layer(under.svg, title || key), ...layer(mine, title || key)]\n const layout = gridOf(boxes, cx, cy, layers.length > 0)\n if (!layout) { problems.push(`layout ${title || key}: its placeholders make no grid deck lays out`); continue }\n const logo = logoPath && (here.used.has(logoPath) || under.used.has(logoPath)) ? 'none' : STANDARD.layouts[key]?.logo ?? 'small'\n // Its words aligned as its title is.\n const align = /** @type {Record<string, string>} */ ({ ctr: 'center', r: 'end' })[titleSays(xml, masterXml, /<a:(?:lvl1pPr|pPr)\\b[^>]*\\balgn=\"(\\w+)\"/) ?? ''] ?? 'start'\n layouts[key] = { label: title || key, ...layout, paper: sheet, title: boxes.some((one) => one.type === 'ctrTitle') ? 'huge' : 'normal', logo, align,\n ...(boxes.some((one) => one.type === 'ctrTitle') && { justify: 'center' }), pptx: PPTX.includes(title) ? title : layout.slots.length > 1 ? 'Comparison' : 'Title and Content',\n numbered: /<p:ph\\b[^>]*type=\"sldNum\"/.test(xml), ...(layers.length && { art: layers }) }\n }\n // A template has one look: drawn with art, its paper and words by night are its own by day (its main colour is so already).\n if (Object.values(layouts).some((layout) => layout.art)) tokens.dark = Object.fromEntries(['paper', 'ink', 'muted', 'soft'].filter((key) => tokens[key]).map((key) => [key, tokens[key]]))\n const merged = mergeKits({ name: name ?? 'template', tokens, layouts, pictures })\n return { kit: { ...merged.kit, name: name ?? 'template' }, problems: [...problems, ...art.noted, ...merged.problems] }\n}\n\n/**\n * What a layout's art is drawn with: the theme's colours by role and the part's colour map, its relationships and the theme's, the theme's\n * fills, lines and faces, the pictures read, those this part drew, what couldn't be drawn, the gradients and patterns a\n * shape paints with, and the group's fill.\n * @typedef {{ scheme: Record<string, number[] | null>, map: Record<string, string>, rels: Map<string, string>, themeRels: Map<string, string>, files: Map<string, () => Promise<Uint8Array>>, size: number[],\n * styles: { fill: string[], line: string[], bg: string[] }, faces: { major: string, minor: string }, pictures: Map<string, Promise<string | null>>, used: Set<string>,\n * noted: Set<string>, ids: { n: number }, defs: string[], group?: string }} Art\n */\n/** @typedef {{ name: string, tag: string, inner: string, xml: string }} Part */\n/** @typedef {{ rgb: number[], alpha: number }} Colour */\n\n/** The elements directly inside a piece of XML, in order: each its name, its opening tag, what it holds, and itself. @param {string | undefined} xml @returns {Part[]} */\nfunction children(xml = '') {\n const out = /** @type {Part[]} */ ([])\n let depth = 0, tag = '', from = 0, at = 0\n for (const m of xml.matchAll(/<(\\/?)([\\w:]+)[^>]*?(\\/?)>/g)) {\n const index = /** @type {number} */ (m.index)\n if (m[1]) { if (--depth === 0) out.push({ name: m[2], tag, inner: xml.slice(from, index), xml: xml.slice(at, index + m[0].length) }) }\n else if (m[3]) { if (!depth) out.push({ name: m[2], tag: m[0], inner: '', xml: m[0] }) }\n else if (!depth++) { tag = m[0]; at = index; from = index + m[0].length }\n }\n return out\n}\n/** The first element of a name directly inside. @param {string | undefined} xml @param {string} name */\nconst child = (xml, name) => children(xml).find((one) => one.name === name)\n/** A part's tree of shapes. @param {string} xml */\nconst treeOf = (xml) => /<p:spTree>([\\s\\S]*)<\\/p:spTree>/.exec(xml)?.[1] ?? ''\n/** A part's background, if it has one. @param {string} xml */\nconst bgOf = (xml) => /<p:bg>([\\s\\S]*?)<\\/p:bg>/.exec(xml)?.[1]\n/** A number as art writes it. @param {number} value */\nconst n = (value) => String(Math.round(value * 100) / 100)\n\n/** @param {number[]} rgb */\nconst hexOf = (rgb) => `#${rgb.map((c) => Math.round(Math.max(0, Math.min(255, c))).toString(16).padStart(2, '0')).join('')}`\n/** @param {number} c */\nconst toLinear = (c) => ((c /= 255) <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4)\n/** @param {number} v */\nconst fromLinear = (v) => 255 * (v <= 0.0031308 ? v * 12.92 : 1.055 * Math.max(0, v) ** (1 / 2.4) - 0.055)\n/** @param {number[]} rgb @returns {number[]} hue in degrees, saturation and lightness */\nfunction hslOf([r, g, b]) {\n const [x, y, z] = [r / 255, g / 255, b / 255], max = Math.max(x, y, z), min = Math.min(x, y, z), l = (max + min) / 2, d = max - min\n if (!d) return [0, 0, l]\n const s = d / (1 - Math.abs(2 * l - 1)), h = max === x ? ((y - z) / d) % 6 : max === y ? (z - x) / d + 2 : (x - y) / d + 4\n return [(h * 60 + 360) % 360, s, l]\n}\n/** @param {number} h @param {number} s @param {number} l */\nfunction rgbFrom(h, s, l) {\n const c = (1 - Math.abs(2 * Math.min(1, Math.max(0, l)) - 1)) * Math.min(1, s), x = c * (1 - Math.abs(((h / 60) % 2) - 1)), m = Math.min(1, Math.max(0, l)) - c / 2\n const [p, q, u] = h < 60 ? [c, x, 0] : h < 120 ? [x, c, 0] : h < 180 ? [0, c, x] : h < 240 ? [0, x, c] : h < 300 ? [x, 0, c] : [c, 0, x]\n return [p + m, q + m, u + m].map((v) => v * 255)\n}\nconst NAMED = /** @type {Record<string, string>} */ ({ black: '000000', white: 'ffffff', gray: '808080', grey: '808080', red: 'ff0000', green: '008000', blue: '0000ff', yellow: 'ffff00' })\n\n/**\n * The colour an element holds, its own, its role's through the part's map, or (phClr) its style's, with the changes\n * PowerPoint makes to it: lighter or darker, a tint, a shade, see-through. @param {string} xml @param {Art} art @param {Colour | null} [ph]\n * @returns {Colour | null}\n */\nfunction colourOf(xml, art, ph = null) {\n const one = children(xml).find((part) => /^a:(srgbClr|schemeClr|sysClr|prstClr|scrgbClr|hslClr)$/.test(part.name))\n if (!one) return null\n const val = attr(one.tag, 'val') ?? '', number = (/** @type {string} */ key) => Number(attr(one.tag, key) ?? 0) / 100000\n let rgb = one.name === 'a:srgbClr' ? rgbOf(val) : one.name === 'a:sysClr' ? rgbOf(attr(one.tag, 'lastClr') ?? (val === 'window' ? 'ffffff' : '000000'))\n : one.name === 'a:schemeClr' ? (val === 'phClr' ? ph?.rgb ?? null : art.scheme[art.map[val] ?? val] ?? null) : one.name === 'a:prstClr' ? rgbOf(NAMED[val] ?? '808080')\n : one.name === 'a:scrgbClr' ? ['r', 'g', 'b'].map((key) => fromLinear(number(key))) : rgbFrom(Number(attr(one.tag, 'hue') ?? 0) / 60000, number('sat'), number('lum'))\n if (!rgb) return null\n let alpha = val === 'phClr' ? ph?.alpha ?? 1 : 1\n for (const change of children(one.inner)) {\n const by = Number(attr(change.tag, 'val') ?? 100000) / 100000, [h, s, l] = hslOf(rgb)\n if (change.name === 'a:alpha') alpha = by\n else if (change.name === 'a:alphaMod') alpha *= by\n else if (change.name === 'a:lumMod') rgb = rgbFrom(h, s, l * by)\n else if (change.name === 'a:lumOff') rgb = rgbFrom(h, s, l + by)\n else if (change.name === 'a:satMod') rgb = rgbFrom(h, s * by, l)\n else if (change.name === 'a:hueMod') rgb = rgbFrom((h * by) % 360, s, l)\n else if (change.name === 'a:hueOff') rgb = rgbFrom((h + by * 100000 / 60000 + 360) % 360, s, l)\n else if (change.name === 'a:shade') rgb = rgb.map((c) => fromLinear(toLinear(c) * by))\n else if (change.name === 'a:tint') rgb = rgb.map((c) => fromLinear(1 - (1 - toLinear(c)) * by))\n }\n return { rgb, alpha }\n}\n\n/** A picture of the part's, as a data: address to draw, once read; null where browsers draw none, or it is too large. @param {string | undefined} id @param {Art} art */\nasync function hrefOf(id, art) {\n const path = id ? art.rels.get(id) : undefined, read = path && art.files.get(path)\n if (!path || !read) return null\n const type = DRAWN[/\\.(\\w+)$/.exec(path)?.[1].toLowerCase() ?? ''], file = path.split('/').pop()\n if (!type) { art.noted.add(`the picture ${file} is in a format browsers don't draw`); return null }\n if (!art.pictures.has(path)) art.pictures.set(path, read().then((data) => (data.length > PICTURE_MB * 1024 * 1024 ? (art.noted.add(`the picture ${file} is larger than ${PICTURE_MB} MB`), null) : `data:${type};base64,${base64(data)}`)))\n const href = await art.pictures.get(path)\n if (href) art.used.add(path)\n return href ?? null\n}\n\n/**\n * How PowerPoint recolours a picture, as an SVG filter among the part's defs: its greys between two colours (duotone), its\n * brightness and contrast. @param {string} blip @param {Art} art @param {Colour | null} [ph]\n */\nfunction filterOf(blip, art, ph = null) {\n const duotone = child(blip, 'a:duotone'), lum = child(blip, 'a:lum')\n if (!duotone && !lum) return ''\n const id = `a${++art.ids.n}`, [dark, light] = children(duotone?.inner).map((one) => colourOf(one.xml, art, ph)?.rgb ?? [0, 0, 0])\n // Each colour from the grey a pixel is, as sRGB weighs it.\n const row = (/** @type {number} */ i) => ((d) => `${n(d * 0.2126)} ${n(d * 0.7152)} ${n(d * 0.0722)} 0 ${n(dark[i] / 255)}`)((light[i] - dark[i]) / 255)\n const [bright, contrast] = ['bright', 'contrast'].map((key) => Number(attr(lum?.tag ?? '', key) ?? 0) / 100000), slope = contrast < 0 ? 1 + contrast : 1 / Math.max(0.01, 1 - contrast)\n const funcs = ['R', 'G', 'B'].map((c) => `<feFunc${c} type=\"linear\" slope=\"${n(slope)}\" intercept=\"${n(bright + 0.5 * (1 - slope))}\"/>`).join('')\n art.defs.push(`<filter id=\"${id}\" color-interpolation-filters=\"sRGB\">${lum ? `<feComponentTransfer>${funcs}</feComponentTransfer>` : ''}${duotone && light ? `<feColorMatrix type=\"matrix\" values=\"${row(0)} ${row(1)} ${row(2)} 0 0 0 1 0\"/>` : ''}</filter>`)\n return ` filter=\"url(#${id})\"`\n}\n\n/**\n * How a fill or a line paints, as SVG's attributes: a colour, a gradient, a picture (the last two among the part's defs), or\n * none; undefined where the part gives none, so that its style's does. @param {string} xml what holds the fill @param {'fill' | 'stroke'} as @param {Art} art @param {Colour | null} [ph]\n * @returns {Promise<string | undefined>}\n */\nasync function paintOf(xml, as, art, ph = null) {\n for (const one of children(xml)) {\n if (one.name === 'a:noFill') return `${as}=\"none\"`\n if (one.name === 'a:solidFill' || one.name === 'a:pattFill') {\n const colour = colourOf(one.name === 'a:pattFill' ? child(one.inner, 'a:fgClr')?.inner ?? '' : one.inner, art, ph)\n return colour ? `${as}=\"${hexOf(colour.rgb)}\"${colour.alpha < 1 ? ` ${as}-opacity=\"${n(colour.alpha)}\"` : ''}` : `${as}=\"none\"`\n }\n if (one.name === 'a:gradFill') {\n const stops = children(child(one.inner, 'a:gsLst')?.inner).map((gs) => /** @type {const} */ ([Number(attr(gs.tag, 'pos') ?? 0) / 100000, colourOf(gs.inner, art, ph)])).sort((a, b) => a[0] - b[0])\n const id = `a${++art.ids.n}`, path = child(one.inner, 'a:path'), stop = stops.map(([at, colour]) => (colour ? `<stop offset=\"${n(at)}\" stop-color=\"${hexOf(colour.rgb)}\"${colour.alpha < 1 ? ` stop-opacity=\"${n(colour.alpha)}\"` : ''}/>` : '')).join('')\n if (!stop) return `${as}=\"none\"`\n if (path) {\n // From the middle of its rectangle out to the shape's corners.\n const rect = child(path.inner, 'a:fillToRect')?.tag ?? '', [l, t, r, b] = ['l', 't', 'r', 'b'].map((key) => Number(attr(rect, key) ?? 0) / 100000), x = (l + 1 - r) / 2, y = (t + 1 - b) / 2\n art.defs.push(`<radialGradient id=\"${id}\" cx=\"${n(x)}\" cy=\"${n(y)}\" r=\"${n(Math.hypot(Math.max(x, 1 - x), Math.max(y, 1 - y)))}\">${stop}</radialGradient>`)\n } else {\n const angle = (Number(attr(child(one.inner, 'a:lin')?.tag ?? '', 'ang') ?? 0) / 60000) * (Math.PI / 180), dx = Math.cos(angle) / 2, dy = Math.sin(angle) / 2\n art.defs.push(`<linearGradient id=\"${id}\" x1=\"${n(0.5 - dx)}\" y1=\"${n(0.5 - dy)}\" x2=\"${n(0.5 + dx)}\" y2=\"${n(0.5 + dy)}\">${stop}</linearGradient>`)\n }\n return `${as}=\"url(#${id})\"`\n }\n if (one.name === 'a:blipFill') {\n const blip = child(one.inner, 'a:blip'), href = await hrefOf(attr(blip?.tag ?? '', 'r:embed'), art), id = `a${++art.ids.n}`\n if (!href || as !== 'fill') return `${as}=\"none\"`\n const amount = attr(child(blip?.inner, 'a:alphaModFix')?.tag ?? '', 'amt')\n art.defs.push(`<pattern id=\"${id}\" width=\"1\" height=\"1\" patternContentUnits=\"objectBoundingBox\"><image width=\"1\" height=\"1\" preserveAspectRatio=\"none\"${filterOf(blip?.inner ?? '', art, ph)}${\n amount ? ` opacity=\"${n(Number(amount) / 100000)}\"` : ''} xlink:href=\"${href}\"/></pattern>`)\n return `fill=\"url(#${id})\"`\n }\n if (one.name === 'a:grpFill') return art.group ?? `${as}=\"none\"`\n }\n return undefined\n}\n\n/** A closed outline through points. @param {...number[]} points */\nconst poly = (...points) => `M${points.map(([x, y]) => `${n(x)} ${n(y)}`).join('L')}Z`\n/** A rectangle w by h with its corners rounded, from the top start: top-left, top-right, bottom-right, bottom-left. @param {number} w @param {number} h @param {number[]} r */\nconst rounded = (w, h, [a, b, c, d]) => `M${n(a)} 0H${n(w - b)}${b ? `A${n(b)} ${n(b)} 0 0 1 ${n(w)} ${n(b)}` : ''}V${n(h - c)}${c ? `A${n(c)} ${n(c)} 0 0 1 ${n(w - c)} ${n(h)}` : ''}H${n(d)}${\n d ? `A${n(d)} ${n(d)} 0 0 1 0 ${n(h - d)}` : ''}V${n(a)}${a ? `A${n(a)} ${n(a)} 0 0 1 ${n(a)} 0` : ''}Z`\n/**\n * PowerPoint's own shapes that templates draw with, as outlines in a box w by h; `a(name, fallback)` an adjustment as a share,\n * `m` the box's shorter side. @type {Record<string, (w: number, h: number, a: (name: string, fallback: number) => number, m: number) => string>}\n */\nconst SHAPES = {\n rect: (w, h) => poly([0, 0], [w, 0], [w, h], [0, h]),\n roundRect: (w, h, a, m) => rounded(w, h, Array(4).fill(m * a('adj', 16667))),\n round1Rect: (w, h, a, m) => rounded(w, h, [0, m * a('adj', 16667), 0, 0]),\n round2SameRect: (w, h, a, m) => rounded(w, h, [m * a('adj1', 16667), m * a('adj1', 16667), m * a('adj2', 0), m * a('adj2', 0)]),\n round2DiagRect: (w, h, a, m) => rounded(w, h, [m * a('adj1', 16667), m * a('adj2', 0), m * a('adj1', 16667), m * a('adj2', 0)]),\n snip1Rect: (w, h, a, m) => ((s) => poly([0, 0], [w - s, 0], [w, s], [w, h], [0, h]))(m * a('adj', 16667)),\n snip2SameRect: (w, h, a, m) => ((s) => poly([s, 0], [w - s, 0], [w, s], [w, h], [0, h], [0, s]))(m * a('adj1', 16667)),\n ellipse: (w, h) => `M0 ${n(h / 2)}A${n(w / 2)} ${n(h / 2)} 0 1 1 ${n(w)} ${n(h / 2)}A${n(w / 2)} ${n(h / 2)} 0 1 1 0 ${n(h / 2)}Z`,\n triangle: (w, h, a) => poly([w * a('adj', 50000), 0], [w, h], [0, h]),\n rtTriangle: (w, h) => poly([0, 0], [w, h], [0, h]),\n diamond: (w, h) => poly([w / 2, 0], [w, h / 2], [w / 2, h], [0, h / 2]),\n parallelogram: (w, h, a, m) => ((x) => poly([x, 0], [w, 0], [w - x, h], [0, h]))(m * a('adj', 25000)),\n trapezoid: (w, h, a, m) => ((x) => poly([x, 0], [w - x, 0], [w, h], [0, h]))(m * a('adj', 25000)),\n homePlate: (w, h, a, m) => ((x) => poly([0, 0], [x, 0], [w, h / 2], [x, h], [0, h]))(w - m * a('adj', 50000)),\n chevron: (w, h, a, m) => ((x) => poly([0, 0], [w - x, 0], [w, h / 2], [w - x, h], [0, h], [x, h / 2]))(m * a('adj', 50000)),\n pentagon: (w, h) => poly([w / 2, 0], [w, h * 0.382], [w * 0.809, h], [w * 0.191, h], [0, h * 0.382]),\n hexagon: (w, h, a, m) => ((x) => poly([x, 0], [w - x, 0], [w, h / 2], [w - x, h], [x, h], [0, h / 2]))(m * a('adj', 25000)),\n octagon: (w, h, a, m) => ((x) => poly([x, 0], [w - x, 0], [w, x], [w, h - x], [w - x, h], [x, h], [0, h - x], [0, x]))(m * a('adj', 29289)),\n star5: (w, h) => poly(...Array.from({ length: 10 }, (_, i) => ((r, t) => [w / 2 + (w / 2) * r * Math.cos(t), h / 2 + (h / 2) * r * Math.sin(t)])(i % 2 ? 0.382 : 1, -Math.PI / 2 + (i * Math.PI) / 5))),\n line: (w, h) => `M0 0L${n(w)} ${n(h)}`,\n bentConnector2: (w, h) => `M0 0H${n(w)}V${n(h)}`,\n bentConnector3: (w, h, a) => `M0 0H${n(w * a('adj1', 50000))}V${n(h)}H${n(w)}`,\n curvedConnector3: (w, h, a) => ((x) => `M0 0C${n(x)} 0 ${n(x)} ${n(h)} ${n(w)} ${n(h)}`)(w * a('adj1', 50000)),\n}\nObject.assign(SHAPES, { straightConnector1: SHAPES.line, flowChartProcess: SHAPES.rect, flowChartAlternateProcess: SHAPES.roundRect, flowChartDecision: SHAPES.diamond, flowChartConnector: SHAPES.ellipse })\n/** The shapes that are lines alone. */\nconst LINES = new Set(['line', 'straightConnector1', 'bentConnector2', 'bentConnector3', 'curvedConnector3'])\n/** A line's dashes, as a share of its width. */\nconst DASHES = /** @type {Record<string, number[]>} */ ({ dash: [4, 3], sysDash: [3, 1], dot: [1, 3], sysDot: [1, 1], lgDash: [8, 3], dashDot: [4, 3, 1, 3], lgDashDot: [8, 3, 1, 3], lgDashDotDot: [8, 3, 1, 3, 1, 3], sysDashDot: [3, 1, 1, 1], sysDashDotDot: [3, 1, 1, 1, 1, 1] })\n\n/**\n * A shape's outline in its own box, w by h, as the paths it is drawn with, each filled or stroked or both: one of\n * PowerPoint's own, or its own geometry; null where it has none, undefined where it is one deck doesn't know.\n * @param {string} spPr @param {number} w @param {number} h @returns {{ d: string, fill: boolean, stroke: boolean }[] | null | undefined}\n */\nfunction outlineOf(spPr, w, h) {\n const custom = child(spPr, 'a:custGeom')\n if (custom) {\n return children(child(custom.inner, 'a:pathLst')?.inner).filter((path) => path.name === 'a:path').flatMap((path) => {\n const pw = Number(attr(path.tag, 'w') ?? 0), ph = Number(attr(path.tag, 'h') ?? 0), sx = pw ? w / pw : 1 / EMU, sy = ph ? h / ph : 1 / EMU\n let d = '', at = [0, 0]\n for (const step of children(path.inner)) {\n const points = children(step.inner).filter((pt) => pt.name === 'a:pt').map((pt) => [Number(attr(pt.tag, 'x')) * sx, Number(attr(pt.tag, 'y')) * sy])\n const xy = points.map(([x, y]) => `${n(x)} ${n(y)}`).join(' ')\n if (step.name === 'a:moveTo') d += `M${xy}`\n else if (step.name === 'a:lnTo') d += `L${xy}`\n else if (step.name === 'a:cubicBezTo') d += `C${xy}`\n else if (step.name === 'a:quadBezTo') d += `Q${xy}`\n else if (step.name === 'a:close') d += 'Z'\n else if (step.name === 'a:arcTo') {\n // An arc on the ellipse its radii make, from where the path is, by the angles PowerPoint gives in 60,000ths of a degree.\n const [rx, ry] = [Number(attr(step.tag, 'wR') ?? 0) * sx, Number(attr(step.tag, 'hR') ?? 0) * sy], [start, sweep] = ['stAng', 'swAng'].map((key) => (Number(attr(step.tag, key) ?? 0) / 60000) * (Math.PI / 180))\n const end = [at[0] - rx * Math.cos(start) + rx * Math.cos(start + sweep), at[1] - ry * Math.sin(start) + ry * Math.sin(start + sweep)]\n d += `A${n(rx)} ${n(ry)} 0 ${Math.abs(sweep) > Math.PI ? 1 : 0} ${sweep > 0 ? 1 : 0} ${n(end[0])} ${n(end[1])}`\n at = end\n }\n if (points.length) at = points[points.length - 1]\n }\n return d && !d.includes('NaN') ? [{ d, fill: attr(path.tag, 'fill') !== 'none', stroke: !/^(0|false)$/.test(attr(path.tag, 'stroke') ?? '') }] : []\n })\n }\n const preset = child(spPr, 'a:prstGeom')\n if (!preset) return null\n const kind = attr(preset.tag, 'prst') ?? '', given = Object.fromEntries(children(child(preset.inner, 'a:avLst')?.inner).map((gd) => [attr(gd.tag, 'name'), Number(/^val\\s+(-?\\d+)$/.exec(attr(gd.tag, 'fmla') ?? '')?.[1])]))\n const d = SHAPES[kind]?.(w, h, (name, fallback) => (Number.isFinite(given[name]) ? given[name] : fallback) / 100000, Math.min(w, h))\n return d ? [{ d, fill: !LINES.has(kind), stroke: true }] : undefined\n}\n\n/**\n * Where a part sits, in points: its box, how SVG moves its own box there (its place and its turn about its middle), and\n * its flips. @param {Part | undefined} xfrm\n */\nfunction frameOf(xfrm) {\n const off = child(xfrm?.inner, 'a:off'), ext = child(xfrm?.inner, 'a:ext')\n if (!xfrm || !off || !ext) return null\n const [x, y, w, h] = [attr(off.tag, 'x'), attr(off.tag, 'y'), attr(ext.tag, 'cx'), attr(ext.tag, 'cy')].map((v) => Number(v ?? 0) / EMU)\n const turn = Number(attr(xfrm.tag, 'rot') ?? 0) / 60000, [fh, fv] = ['flipH', 'flipV'].map((key) => /^(1|true)$/.test(attr(xfrm.tag, key) ?? ''))\n return { x, y, w, h, move: `translate(${n(x)} ${n(y)})${turn ? ` rotate(${n(turn)} ${n(w / 2)} ${n(h / 2)})` : ''}`, flip: fh || fv ? ` matrix(${fh ? -1 : 1} 0 0 ${fv ? -1 : 1} ${fh ? n(w) : 0} ${fv ? n(h) : 0})` : '' }\n}\n\n/** A shape's fill: its own, else its style's, the theme's fill (or background fill) in the style's colour; else none. @param {string} spPr @param {string} style @param {Art} art */\nasync function fillOf(spPr, style, art) {\n const own = await paintOf(spPr, 'fill', art), ref = child(style, 'a:fillRef'), idx = Number(attr(ref?.tag ?? '', 'idx') ?? 0)\n const themed = idx > 1000 ? art.styles.bg[idx - 1001] : idx ? art.styles.fill[idx - 1] : undefined\n return own ?? (themed && ref && await paintOf(themed, 'fill', { ...art, rels: art.themeRels }, colourOf(ref.inner, art))) ?? 'fill=\"none\"'\n}\n\n/** A shape's line: its own, else its style's, the theme's line in the style's colour; its width and dashes; else none. @param {string} spPr @param {string} style @param {Art} art */\nasync function strokeOf(spPr, style, art) {\n const ln = child(spPr, 'a:ln'), ref = child(style, 'a:lnRef'), idx = Number(attr(ref?.tag ?? '', 'idx') ?? 0), themed = idx ? children(art.styles.line[idx - 1] ?? '')[0] : undefined\n const paint = (ln && await paintOf(ln.inner, 'stroke', art)) ?? (themed && ref && await paintOf(themed.inner, 'stroke', art, colourOf(ref.inner, art)))\n if (!paint || paint === 'stroke=\"none\"') return ''\n const width = Number(attr(ln?.tag ?? '', 'w') ?? attr(themed?.tag ?? '', 'w') ?? 9525) / EMU, dash = DASHES[attr(child(ln?.inner, 'a:prstDash')?.tag ?? child(themed?.inner, 'a:prstDash')?.tag ?? '', 'val') ?? '']\n return ` ${paint} stroke-width=\"${n(width)}\"${dash ? ` stroke-dasharray=\"${dash.map((one) => n(one * width)).join(' ')}\"` : ''}`\n}\n\n/**\n * A shape's words, as PowerPoint sets them in its box: each paragraph in its first run's size, weight, colour and face (the\n * theme's where it names one), aligned as it says, wrapped at the box's width as near as a face's average letter goes, the\n * whole at the top, middle or bottom; fields (a slide's number, its date) are left to deck.\n * @param {string} txBody @param {number} w @param {number} h @param {string} style @param {Art} art\n */\nfunction wordsIn(txBody, w, h, style, art) {\n const bodyPr = child(txBody, 'a:bodyPr'), inset = (/** @type {string} */ key, /** @type {number} */ fallback) => Number(attr(bodyPr?.tag ?? '', key) ?? fallback) / EMU\n const [l, t, r, b] = [inset('lIns', 91440), inset('tIns', 45720), inset('rIns', 91440), inset('bIns', 45720)], wraps = attr(bodyPr?.tag ?? '', 'wrap') !== 'none'\n const scale = Number(attr(child(bodyPr?.inner, 'a:normAutofit')?.tag ?? '', 'fontScale') ?? 100000) / 100000, level = child(child(txBody, 'a:lstStyle')?.inner, 'a:lvl1pPr'), given = child(level?.inner, 'a:defRPr')\n const fontRef = child(style, 'a:fontRef'), ink = (fontRef && colourOf(fontRef.inner, art)) ?? { rgb: art.scheme[art.map.tx1 ?? 'dk1'] ?? [0, 0, 0], alpha: 1 }\n const lines = /** @type {{ words: string, size: number, align: string, colour: Colour, face: string, bold: boolean, italic: boolean }[]} */ ([])\n for (const p of children(txBody).filter((one) => one.name === 'a:p')) {\n const runs = children(p.inner).filter((one) => one.name === 'a:r' || one.name === 'a:br'), rPr = child(runs.find((one) => one.name === 'a:r')?.inner, 'a:rPr') ?? child(p.inner, 'a:endParaRPr')\n const own = (/** @type {string} */ key) => attr(rPr?.tag ?? '', key) ?? attr(given?.tag ?? '', key)\n const size = (Number(own('sz') ?? 1800) / 100) * scale, align = attr(child(p.inner, 'a:pPr')?.tag ?? '', 'algn') ?? attr(level?.tag ?? '', 'algn') ?? 'l'\n const colour = colourOf(child(rPr?.inner, 'a:solidFill')?.inner ?? '', art) ?? colourOf(child(given?.inner, 'a:solidFill')?.inner ?? '', art) ?? ink\n const typeface = attr(child(rPr?.inner, 'a:latin')?.tag ?? '', 'typeface') ?? '+mn-lt', face = typeface.startsWith('+mj') ? art.faces.major : typeface.startsWith('+') ? art.faces.minor : typeface\n const text = runs.map((one) => (one.name === 'a:br' ? '\\n' : /<a:t(?:\\s[^>]*)?>([\\s\\S]*?)<\\/a:t>/.exec(one.inner)?.[1] ?? '')).join('')\n .replace(/(&[^;\\s]+;)|[^&]+/g, (some, entity) => entity ?? (own('cap') === 'all' ? some.toLocaleUpperCase() : some))\n const room = Math.max(1, Math.floor((w - l - r) / (size * (own('b') === '1' ? 0.6 : 0.55))))\n for (const line of text.split('\\n')) {\n // Wrapped where its words would pass the box's width.\n const fits = (/** @type {string} */ words) => words.replace(/&[^;\\s]+;/g, '_').length <= room\n const pieces = !wraps ? [line] : line.split(' ').reduce((/** @type {string[]} */ kept, word) => (kept.length && fits(`${kept[kept.length - 1]} ${word}`) ? [...kept.slice(0, -1), `${kept[kept.length - 1]} ${word}`] : [...kept, word]), [])\n for (const words of pieces.length ? pieces : ['']) lines.push({ words, size, align, colour, face, bold: own('b') === '1', italic: own('i') === '1' })\n }\n }\n const tall = lines.reduce((sum, line) => sum + line.size * 1.2, 0), anchor = attr(bodyPr?.tag ?? '', 'anchor') ?? 't'\n let top = anchor === 'ctr' ? t + (h - t - b - tall) / 2 : anchor === 'b' ? h - b - tall : t\n return lines.map((line) => {\n const y = top + line.size * 0.95, [x, at] = line.align === 'ctr' ? [l + (w - l - r) / 2, 'middle'] : line.align === 'r' ? [w - r, 'end'] : [l, 'start']\n top += line.size * 1.2\n return line.words.trim() ? `<text x=\"${n(x)}\" y=\"${n(y)}\" font-size=\"${n(line.size)}\" font-family=\"${[line.face.replace(/[\"'&<>]/g, ''), 'ui-sans-serif', 'system-ui', 'sans-serif'].filter(Boolean).map((one) => (/\\s/.test(one) ? `'${one}'` : one)).join(', ')}\" fill=\"${\n hexOf(line.colour.rgb)}\"${line.colour.alpha < 1 ? ` fill-opacity=\"${n(line.colour.alpha)}\"` : ''}${at === 'start' ? '' : ` text-anchor=\"${at}\"`}${line.bold ? ' font-weight=\"bold\"' : ''}${line.italic ? ' font-style=\"italic\"' : ''} xml:space=\"preserve\">${line.words}</text>` : ''\n }).join('')\n}\n\n/** A shape (or a line between shapes): its outline filled and stroked, its words over it; a placeholder is the grid's. @param {string} xml @param {Art} art */\nasync function shapeOf(xml, art) {\n if (/<p:ph\\b/.test((child(xml, 'p:nvSpPr') ?? child(xml, 'p:nvCxnSpPr'))?.inner ?? '')) return ''\n const spPr = child(xml, 'p:spPr')?.inner ?? '', style = child(xml, 'p:style')?.inner ?? '', at = frameOf(child(spPr, 'a:xfrm')), own = { ...art, defs: /** @type {string[]} */ ([]) }\n if (!at) return ''\n const paths = outlineOf(spPr, at.w, at.h)\n if (paths === undefined) own.noted.add(`the shape ${attr(child(spPr, 'a:prstGeom')?.tag ?? '', 'prst')} is left out`)\n const fill = paths?.some((one) => one.fill) ? await fillOf(spPr, style, own) : 'fill=\"none\"', stroke = paths?.some((one) => one.stroke) ? await strokeOf(spPr, style, own) : ''\n const drawn = (paths ?? []).filter((one) => (one.fill && fill !== 'fill=\"none\"') || (one.stroke && stroke)).map((one) => `<path d=\"${one.d}\" ${one.fill ? fill : 'fill=\"none\"'}${one.stroke ? stroke : ''}/>`).join('')\n const words = wordsIn(child(xml, 'p:txBody')?.inner ?? '', at.w, at.h, style, own)\n return `${own.defs.join('')}${drawn ? `<g transform=\"${at.move}${at.flip}\">${drawn}</g>` : ''}${words ? `<g transform=\"${at.move}\">${words}</g>` : ''}`\n}\n\n/** A picture where it sits, cropped as its template crops it, in its shape, see-through as it says, its line round it. @param {string} xml @param {Art} art */\nasync function pictureOf(xml, art) {\n if (/<p:ph\\b/.test(child(xml, 'p:nvPicPr')?.inner ?? '')) return ''\n const fill = child(xml, 'p:blipFill')?.inner ?? '', blip = child(fill, 'a:blip'), spPr = child(xml, 'p:spPr')?.inner ?? '', at = frameOf(child(spPr, 'a:xfrm'))\n // An SVG beside a picture PowerPoint draws in its stead.\n const svg = /<asvg:svgBlip\\b[^>]*\\br:embed=\"([^\"]+)\"/.exec(blip?.inner ?? '')?.[1], href = (svg && await hrefOf(svg, art)) || await hrefOf(attr(blip?.tag ?? '', 'r:embed'), art)\n if (!at || !href) return ''\n const crop = child(fill, 'a:srcRect')?.tag ?? '', [l, t, r, b] = ['l', 't', 'r', 'b'].map((key) => Number(attr(crop, key) ?? 0) / 100000), w = at.w / (1 - l - r || 1), h = at.h / (1 - t - b || 1)\n const amount = attr(child(blip?.inner, 'a:alphaModFix')?.tag ?? '', 'amt'), outline = outlineOf(spPr, at.w, at.h)?.[0], id = outline && !/\\bprst=\"rect\"/.test(spPr) ? `a${++art.ids.n}` : ''\n const own = { ...art, defs: /** @type {string[]} */ ([]) }, stroke = outline ? await strokeOf(spPr, child(xml, 'p:style')?.inner ?? '', own) : '', filter = filterOf(blip?.inner ?? '', own)\n return `${own.defs.join('')}<g transform=\"${at.move}${at.flip}\"${amount ? ` opacity=\"${n(Number(amount) / 100000)}\"` : ''}>${id ? `<clipPath id=\"${id}\"><path d=\"${outline?.d}\"/></clipPath><g clip-path=\"url(#${id})\">` : '<g>'}<svg width=\"${\n n(at.w)}\" height=\"${n(at.h)}\"><image x=\"${n(-l * w)}\" y=\"${n(-t * h)}\" width=\"${n(w)}\" height=\"${n(h)}\" preserveAspectRatio=\"none\"${filter} xlink:href=\"${href}\"/></svg></g>${stroke ? `<path d=\"${outline?.d}\" fill=\"none\"${stroke}/>` : ''}</g>`\n}\n\n/** A group: its shapes, from its own place and size into where it sits, filled where they take its fill. @param {string} xml @param {Art} art */\nasync function groupOf(xml, art) {\n const pr = child(xml, 'p:grpSpPr')?.inner ?? '', xfrm = child(pr, 'a:xfrm'), at = frameOf(xfrm), own = { ...art, defs: /** @type {string[]} */ ([]) }\n const [cx, cy, cw, ch] = [attr(child(xfrm?.inner, 'a:chOff')?.tag ?? '', 'x'), attr(child(xfrm?.inner, 'a:chOff')?.tag ?? '', 'y'), attr(child(xfrm?.inner, 'a:chExt')?.tag ?? '', 'cx'), attr(child(xfrm?.inner, 'a:chExt')?.tag ?? '', 'cy')].map((v) => Number(v ?? 0) / EMU)\n const inner = await drawTree(xml, { ...own, group: await paintOf(pr, 'fill', own) })\n if (!inner) return ''\n return `${own.defs.join('')}<g${at ? ` transform=\"${at.move}${at.flip} scale(${n(cw ? at.w / cw : 1)} ${n(ch ? at.h / ch : 1)}) translate(${n(-cx)} ${n(-cy)})\"` : ''}>${inner}</g>`\n}\n\n/** A tree of shapes, pictures and groups, drawn in its order; placeholders, tables and charts are left to the grid. @param {string} xml @param {Art} art @returns {Promise<string>} */\nasync function drawTree(xml, art) {\n let out = ''\n for (const one of children(xml)) {\n if (one.name === 'mc:AlternateContent') out += await drawTree((child(one.inner, 'mc:Fallback') ?? child(one.inner, 'mc:Choice'))?.inner ?? '', art)\n else if (one.name === 'p:sp' || one.name === 'p:cxnSp') out += await shapeOf(one.inner, art)\n else if (one.name === 'p:pic') out += await pictureOf(one.inner, art)\n else if (one.name === 'p:grpSp') out += await groupOf(one.inner, art)\n }\n return out\n}\n\n/**\n * A background: its colour where it is one (the first light where there is none), and the whole slide painted with it, its\n * own fill or its theme's (bgRef), a colour, a gradient or a picture. @param {string | undefined} bg @param {Art} art\n */\nasync function backOf(bg, art) {\n const pr = child(bg, 'p:bgPr'), ref = child(bg, 'p:bgRef'), idx = Number(attr(ref?.tag ?? '', 'idx') ?? 0), own = { ...art, defs: /** @type {string[]} */ ([]) }\n // A theme without its fills paints the reference's colour.\n const fill = pr?.inner ?? (idx > 1000 ? art.styles.bg[idx - 1001] : idx ? art.styles.fill[idx - 1] : undefined) ?? (ref ? '<a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>' : ''), ph = ref ? colourOf(ref.inner, art) : null\n const solid = child(fill, 'a:solidFill'), rgb = solid ? colourOf(solid.inner, art, ph)?.rgb ?? null : bg ? null : art.scheme.lt1 ?? [255, 255, 255]\n const paint = (await paintOf(fill, 'fill', pr ? own : { ...own, rels: art.themeRels }, ph)) ?? (rgb ? `fill=\"${hexOf(rgb)}\"` : undefined)\n return { rgb, svg: paint && paint !== 'fill=\"none\"' ? `${own.defs.join('')}<rect width=\"${n(art.size[0])}\" height=\"${n(art.size[1])}\" ${paint}/>` : '' }\n}\n\n/**\n * Something a layout's title says of its words, a pattern's first group: on the layout, else on the master's title, else in\n * the master's title style. @param {string} xml @param {string} masterXml @param {RegExp} pattern\n */\nfunction titleSays(xml, masterXml, pattern) {\n const title = (/** @type {string} */ part) => pattern.exec(/<p:txBody>[\\s\\S]*?<\\/p:txBody>/.exec([...part.matchAll(/<p:sp>[\\s\\S]*?<\\/p:sp>/g)].find(([sp]) => /<p:ph\\b[^>]*type=\"(title|ctrTitle)\"/.test(sp))?.[0] ?? '')?.[0] ?? '')?.[1]\n return title(xml) ?? title(masterXml) ?? pattern.exec(/<p:titleStyle>[\\s\\S]*?<\\/p:titleStyle>/.exec(masterXml)?.[0] ?? '')?.[1]\n}\n\n/** The colour a layout's words are, as its title is; else the first dark. @param {string} xml @param {string} masterXml @param {Art} art */\nfunction wordsOf(xml, masterXml, art) {\n const fill = titleSays(xml, masterXml, /<a:solidFill>([\\s\\S]*?)<\\/a:solidFill>/)\n return (fill && colourOf(fill, art)?.rgb) ?? art.scheme[art.map.tx1 ?? 'dk1'] ?? null\n}\n\n/**\n * A layer of art as a picture: an SVG of the slide's size in points, stretched to the slide, written out as a data: address\n * (its pictures inside it already base64, so not again). @param {string} drawn @param {number[]} size\n */\nconst svgOf = (drawn, [w, h]) => `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"${n(w)}\" height=\"${n(h)}\" viewBox=\"0 0 ${n(w)} ${n(h)}\" preserveAspectRatio=\"none\">${drawn}</svg>`)\n .replace(/%2F/g, '/').replace(/%2B/g, '+').replace(/%3D/g, '=')}`\n\n/**\n * Placeholders as a grid of slots: the titles the default slot, with the box under them across the same columns; the other\n * boxes by the names deck gave them (`body-right`, as its PowerPoint writes them), else `left`, `middle` and `right` side by\n * side, else `s1`, `s2`…; the margins left to deck, or, for a layout with art, the whole slide, each box where the template\n * has it. @param {{ type: string, name: string, box: number[] | null }[]} boxes @param {number} cx @param {number} cy @param {boolean} [whole]\n */\nfunction gridOf(boxes, cx, cy, whole = false) {\n const isTitle = (/** @type {{ type: string }} */ one) => ['title', 'ctrTitle', 'subTitle'].includes(one.type)\n const box = (/** @type {{ box: number[] | null }} */ one) => /** @type {number[]} */ (one.box)\n const across = (/** @type {number[]} */ a, /** @type {number[]} */ b) => Math.abs(a[0] - b[0]) < cx * 0.05 && Math.abs(a[2] - b[2]) < cx * 0.05 && a[1] > b[1]\n const heading = boxes.filter(isTitle), own = (/** @type {{ name: string }} */ one) => /^body-([a-z][a-z0-9-]{0,31})$/.exec(one.name)?.[1]\n const sorted = boxes.filter((one) => !isTitle(one)).sort((a, b) => box(a)[0] - box(b)[0] || box(a)[1] - box(b)[1])\n // The heading's slot's own words: the only box, or the one under the heading across its columns.\n const under = !heading.length ? undefined : sorted.length === 1 && !own(sorted[0]) && box(sorted[0])[1] >= box(heading[0])[1] ? sorted[0] : sorted.find((one) => own(one) === 'default' || (!own(one) && across(box(one), box(heading[0]))))\n const titles = under ? [...heading, under] : heading, others = sorted.filter((one) => one !== under)\n const union = (/** @type {number[][]} */ list) => (list.length ? ((xs, ys, xe, ye) => [xs, ys, xe - xs, ye - ys])(Math.min(...list.map((b) => b[0])), Math.min(...list.map((b) => b[1])),\n Math.max(...list.map((b) => b[0] + b[2])), Math.max(...list.map((b) => b[1] + b[3]))) : null)\n // The default slot: the heading and, when it is the only one, the box under it; else the heading, else the first box.\n const rest = titles.length ? others : others.slice(1)\n const first = titles.length ? /** @type {number[]} */ (union(titles.map(box))) : others.length ? box(others[0]) : [0, 0, cx, cy]\n const side = rest.every((one, i) => !i || box(one)[0] >= (box(rest[i - 1])[0] + box(rest[i - 1])[2]) * 0.98)\n const names = side && rest.length === 2 && titles.length ? ['left', 'right'] : side && rest.length === 3 && titles.length ? ['left', 'middle', 'right'] : side && rest.length === 1 ? ['right'] : side && rest.length === 2 ? ['middle', 'right']\n : rest.map((_, i) => `s${i + 1}`)\n /** @type {[string, number[]][]} */\n const slots = [['default', first], ...rest.map((one, i) => /** @type {[string, number[]]} */ ([own(one) ?? names[i], box(one)]))]\n // The grid's lines, near ones as one, then each cell the slot whose box holds its middle.\n const lines = (/** @type {number} */ from, /** @type {number} */ size, /** @type {number} */ total) => [...new Set([...(whole ? [0, total] : []), ...slots.flatMap(([, b]) => [b[from], b[from] + b[size]])])].sort((a, b) => a - b)\n .reduce((/** @type {number[]} */ kept, at) => (kept.length && at - kept[kept.length - 1] < total * 0.03 ? kept : [...kept, at]), [])\n const xs = lines(0, 2, cx), ys = lines(1, 3, cy)\n // Near enough to a box, but never a margin of the whole slide's.\n const near = whole ? 0.01 : 0.03, holds = (/** @type {number[]} */ b, /** @type {number} */ x, /** @type {number} */ y) => x >= b[0] - cx * near && x <= b[0] + b[2] + cx * near && y >= b[1] - cy * near && y <= b[1] + b[3] + cy * near\n const areas = ys.slice(1).map((y, r) => xs.slice(1).map((x, c) => slots.find(([, b]) => holds(b, (xs[c] + x) / 2, (ys[r] + y) / 2))?.[0] ?? '.'))\n if (!areas.length || !areas[0].length || !areas.flat().includes('default')) return null\n const fr = (/** @type {number[]} */ edges, /** @type {number} */ total) => (edges.length === 2 ? ['1fr'] : edges.slice(1).map((at, i) => `${Math.max(0.1, Math.round(((at - edges[i]) / total) * 100) / 10)}fr`))\n // A row that holds only the heading takes what it needs, but where art is drawn for it.\n const rows = fr(ys, cy).map((track, r) => (!whole && slots.length > 1 && areas[r].every((cell) => cell === 'default' || cell === '.') ? 'auto' : track))\n return { slots: slots.map(([one]) => one), areas: areas.map((row) => row.join(' ')).join(' | '), columns: fr(xs, cx).join(' '), rows: rows.join(' ') }\n}\n\n/** Bytes as base64, a piece at a time. @param {Uint8Array} bytes */\nfunction base64(bytes) {\n let binary = ''\n for (let i = 0; i < bytes.length; i += 0x8000) binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000))\n return btoa(binary)\n}\n\n/**\n * A kit's tokens in the W3C's Design Tokens format (DTCG 2025.10), as design tools read them: its colours light and\n * dark, its chart colours and its faces; `tokensFrom()` reads them back. @param {Record<string, any>} tokens\n */\nexport function tokensToDtcg(tokens) {\n const colour = (/** @type {unknown} */ value) => (typeof value === 'string' ? { $type: 'color', $value: value } : undefined)\n const group = (/** @type {Record<string, any>} */ own) => Object.fromEntries(Object.entries({ bg: own.paper, fg: own.ink, accent: own.primary, muted: own.muted, surface: own.soft }).flatMap(([key, value]) => (colour(value) ? [[key, colour(value)]] : [])))\n const fonts = tokens.fonts ?? {}\n return {\n color: { light: group(tokens), ...(tokens.dark && { dark: group(tokens.dark) }), ...(tokens.series && { series: Object.fromEntries(tokens.series.map((/** @type {string} */ one, /** @type {number} */ i) => [`s${i + 1}`, colour(one)])) }) },\n ...((fonts.heading || fonts.body) && { font: { ...(fonts.heading && { heading: { $type: 'fontFamily', $value: fonts.heading } }), ...(fonts.body && { body: { $type: 'fontFamily', $value: fonts.body } }) } }),\n }\n}\n"],
5
+ "mappings": "AAcA,IAAMA,GAAO,yBACPC,GAAQ,6DACRC,GAAO,CAAC,cAAe,oBAAqB,iBAAkB,cAAe,aAAc,aAAc,QAAS,uBAAwB,sBAAsB,EAChKC,GAA8B,CAAE,MAAO,CAAC,QAAS,SAAU,KAAK,EAAG,QAAS,CAAC,QAAS,SAAU,KAAK,EAAG,MAAO,CAAC,QAAS,OAAQ,MAAO,MAAM,EAAG,MAAO,CAAC,SAAU,QAAS,MAAM,EAAG,KAAM,CAAC,QAAS,MAAO,MAAM,CAAE,EAE7MC,GAAU,CAAC,UAAW,YAAa,aAAc,cAAc,EAM/DC,GAAUC,GAAW,OAAOA,GAAU,UAAYA,EAAM,QAAU,KAAW,mEAAmE,KAAKA,CAAK,EAAIA,EAAQ,KAMtKC,GAASD,GAAW,OAAOA,GAAU,UAAYA,EAAM,QAAU,SAAa,oGAAoG,KAAKA,CAAK,EAAIA,EAAQ,KAS9M,IAAME,GAA+B,CAC1C,KAAM,WACN,OAAQ,CAAC,EACT,SAAU,CAAC,EACX,QAAS,OAAO,YAAY,OAAO,QAA4C,CAC7E,QAAS,CAAE,MAAO,CAAE,GAAI,oBAAqB,GAAI,kBAAmB,EAAG,KAAM,mBAAoB,EACjG,MAAO,CAAE,MAAO,CAAE,GAAI,QAAS,GAAI,YAAa,EAAG,QAAS,SAAU,MAAO,OAAQ,MAAO,OAAQ,KAAM,MAAO,KAAM,cAAe,SAAU,EAAM,EACtJ,MAAO,CAAE,MAAO,CAAE,GAAI,eAAgB,GAAI,cAAe,EAAG,QAAS,SAAU,MAAO,OAAQ,MAAO,QAAS,KAAM,MAAO,KAAM,cAAe,SAAU,EAAM,EAChK,QAAS,CAAE,MAAO,CAAE,GAAI,UAAW,GAAI,SAAU,EAAG,QAAS,SAAU,MAAO,MAAO,MAAO,OAAQ,KAAM,iBAAkB,SAAU,EAAM,EAC5I,OAAQ,CAAE,MAAO,CAAE,GAAI,UAAW,GAAI,QAAS,EAAG,QAAS,SAAU,MAAO,SAAU,KAAM,YAAa,EACzG,UAAW,CAAE,MAAO,CAAE,GAAI,YAAa,GAAI,aAAc,EAAG,QAAS,SAAU,MAAO,SAAU,MAAO,QAAS,KAAM,YAAa,EACnI,KAAM,CAAE,MAAO,CAAE,GAAI,aAAc,GAAI,eAAgB,EAAG,QAAS,SAAU,MAAO,SAAU,MAAO,OAAQ,KAAM,YAAa,EAChI,MAAO,CAAE,MAAO,CAAE,GAAI,QAAS,GAAI,UAAW,EAAG,QAAS,SAAU,KAAM,YAAa,EACvF,IAAK,CAAE,MAAO,CAAE,GAAI,UAAW,GAAI,SAAU,EAAG,QAAS,SAAU,MAAO,SAAU,MAAO,OAAQ,MAAO,QAAS,KAAM,MAAO,KAAM,cAAe,SAAU,EAAM,EACrK,KAAM,CAAE,MAAO,CAAE,GAAI,OAAQ,GAAI,aAAc,EAAG,KAAM,OAAQ,KAAM,QAAS,SAAU,EAAM,EAC/F,KAAM,CAAE,MAAO,CAAE,GAAI,QAAS,GAAI,MAAO,EAAG,KAAM,OAAQ,KAAM,QAAS,SAAU,EAAM,EACzF,WAAY,CAAE,MAAO,CAAE,GAAI,cAAe,GAAI,eAAgB,EAAG,MAAO,CAAC,UAAW,OAAO,EAAG,MAAO,gBAAiB,QAAS,UAAW,KAAM,aAAc,EAC9J,kBAAmB,CAAE,MAAO,CAAE,GAAI,aAAc,GAAI,aAAc,EAAG,MAAO,CAAC,UAAW,OAAQ,QAAS,QAAQ,EAAG,MAAO,+CAAgD,QAAS,UAAW,KAAM,gBAAiB,KAAM,YAAa,EACzO,aAAc,CAAE,MAAO,CAAE,GAAI,gBAAiB,GAAI,gBAAiB,EAAG,MAAO,CAAC,UAAW,OAAQ,SAAU,OAAO,EAAG,MAAO,8CAA+C,QAAS,cAAe,KAAM,WAAY,KAAM,YAAa,EACxO,aAAc,CAAE,MAAO,CAAE,GAAI,eAAgB,GAAI,gBAAiB,EAAG,KAAM,uBAAwB,QAAS,QAAS,EACrH,cAAe,CAAE,MAAO,CAAE,GAAI,gBAAiB,GAAI,gBAAiB,EAAG,KAAM,uBAAwB,QAAS,QAAS,EACvH,MAAO,CAAE,MAAO,CAAE,GAAI,UAAW,GAAI,OAAQ,EAAG,KAAM,OAAQ,KAAM,QAAS,SAAU,EAAM,CAC/F,CAAE,EAAE,IAAI,CAAC,CAACC,EAAMC,CAAK,IAAM,CAACD,EAA6BE,GAASD,CAAK,EAAE,MAAO,CAAC,CAAC,CACpF,EAMO,SAASC,GAASD,EAAO,CAC9B,IAAME,EAAW,CAAC,EAClB,GAAI,CAACF,GAAS,OAAOA,GAAU,SAAU,MAAO,CAAE,OAAQ,KAAM,SAAU,CAAC,cAAc,CAAE,EAI3F,IAAMG,EAAU,CAAC,EACXC,EAAQ,MAAM,QAAQJ,EAAM,KAAK,GAAK,OAAOA,EAAM,OAAU,SAAW,CAACA,EAAM,KAAK,EAAE,KAAK,EAAE,IAAI,MAAM,EACzGA,EAAM,OAAS,OAAOA,EAAM,OAAU,SAAW,OAAO,QAAQA,EAAM,KAAK,EAAE,IAAI,CAAC,CAACD,EAAMM,CAAM,KAC3FA,GAAU,OAAOA,GAAW,WAAUF,EAAQJ,CAAI,EAAIO,GAAMD,CAAM,GAC/DN,IAAS,QAAU,UAAYA,EACvC,EAAI,CAAC,SAAS,EACXQ,EAAQ,CAAC,GAAG,IAAI,IAAIH,CAAK,CAAC,EAChC,GAAI,CAACG,EAAM,MAAOC,GAASC,GAAK,KAAKD,CAAI,CAAC,EAAG,MAAO,CAAE,OAAQ,KAAM,SAAU,CAAC,mCAAmC,CAAE,EAC/GD,EAAM,SAAS,SAAS,GAAGA,EAAM,QAAQ,SAAS,EAIvD,IAAMG,GADQ,MAAM,QAAQV,EAAM,KAAK,EAAIA,EAAM,MAAM,IAAwBW,GAAQ,CAACA,CAAG,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAI,OAAOX,EAAM,OAASO,EAAM,KAAK,GAAG,CAAC,EAAE,MAAM,OAAO,GAClJ,IAAKI,GAAQA,EAAI,KAAK,EAAE,QAAQ,SAAU,EAAE,EAAE,MAAM,KAAK,CAAC,EAAE,OAAQA,GAAQA,EAAI,QAAUA,EAAI,CAAC,CAAC,EAC7GC,EAAQF,EAAK,CAAC,GAAG,QAAU,EACjC,GAAI,CAACA,EAAK,QAAUA,EAAK,KAAMC,GAAQA,EAAI,SAAWC,CAAK,GAAKF,EAAK,KAAK,EAAE,KAAMG,GAASA,IAAS,KAAO,CAACN,EAAM,SAASM,CAAI,CAAC,EAAG,MAAO,CAAE,OAAQ,KAAM,SAAU,CAAC,wCAAwC,CAAE,EAC/M,QAAWL,KAAQD,EAAO,CACxB,IAAMO,EAAQJ,EAAK,QAAQ,CAACC,EAAKI,IAAMJ,EAAI,IAAI,CAACE,EAAMG,IAA+C,CAACH,EAAMG,EAAGD,CAAC,CAAE,CAAC,EAAE,OAAO,CAAC,CAACF,CAAI,IAAMA,IAASL,CAAI,EACrJ,GAAI,CAACM,EAAM,OAAQ,CAAMN,IAAS,WAAWN,EAAS,KAAK,QAAQM,CAAI,cAAc,EAAG,QAAS,CACjG,IAAMS,EAAKH,EAAM,IAAKI,GAAMA,EAAE,CAAC,CAAC,EAAGC,EAAKL,EAAM,IAAKI,GAAMA,EAAE,CAAC,CAAC,EAC7D,GAAIJ,EAAM,UAAY,KAAK,IAAI,GAAGG,CAAE,EAAI,KAAK,IAAI,GAAGA,CAAE,EAAI,IAAM,KAAK,IAAI,GAAGE,CAAE,EAAI,KAAK,IAAI,GAAGA,CAAE,EAAI,GAAI,MAAO,CAAE,OAAQ,KAAM,SAAU,CAAC,QAAQX,CAAI,qBAAqB,CAAE,CAC/K,CACA,IAAMY,EAAS,CAAoBC,EAA6BC,IAAU,CACxE,IAAMC,EAAOF,IAAU,OAAY,MAAMC,CAAK,EAAE,KAAK,KAAK,GAAK,MAAM,QAAQD,CAAK,EAAIA,EAAQ,OAAOA,CAAK,EAAE,MAAM,KAAK,GAAG,IAAI,MAAM,EACpI,OAAOE,EAAK,SAAWD,GAASC,EAAK,MAAOC,GAAMC,GAAM,KAAKD,CAAC,CAAC,EAAID,EAAO,IAC5E,EACMG,EAAUN,EAAOpB,EAAM,QAASY,CAAK,EAAGe,EAAYP,EAAOpB,EAAM,KAAMU,EAAK,MAAM,EACxF,GAAI,CAACgB,GAAW,CAACC,EAAW,MAAO,CAAE,OAAQ,KAAM,SAAU,CAAC,oFAAoF,CAAE,EACpJ,IAAMC,EAAO,CAAmCC,EAA2BC,IAAa,CACtF,IAAMT,EAAQ,OAAOrB,EAAM6B,CAAG,GAAKC,CAAQ,EAC3C,OAAwCC,GAAMF,CAAG,EAAI,SAASR,CAAK,EAC5DA,GADiEnB,EAAS,KAAK,GAAG2B,CAAG,IAAIR,CAAK,kBAAkBU,GAAMF,CAAG,EAAE,KAAK,IAAI,CAAC,EAAE,EAAUC,EAE1J,EACME,EAAQ,OAAOhC,EAAM,OAAU,UAAaA,EAAM,OAAS,OAAOA,EAAM,OAAU,SAAYA,EAAM,MAAQ,OAC5GiC,EAAM,MAAM,QAAQjC,EAAM,GAAG,GAAKA,EAAM,IAAI,QAAU,GAAKA,EAAM,IAAI,MAA8BkC,GAAQ,OAAOA,GAAQ,UAAYzB,GAAK,KAAKyB,CAAG,CAAC,EAAIlC,EAAM,IAAM,OACtKA,EAAM,MAAQ,QAAa,CAACiC,GAAK/B,EAAS,KAAK,4BAA4B,EAC/E,IAAMiC,EAA4BC,GAAO,OAAOA,GAAM,SAAWA,EAAE,MAAM,EAAG,GAAG,EAAI,OACnF,MAAO,CACL,OAA+B,CAC7B,MAAAJ,EAAO,OAAQG,EAAMnC,EAAM,MAAM,EAAG,SAAUmC,EAAMnC,EAAM,QAAQ,EAAG,WAAYmC,EAAMnC,EAAM,UAAU,EAAG,MAAAO,EAAO,QAAAJ,EAAS,MAAOO,EAAM,QAAAgB,EAAS,KAAMC,EACtJ,MAAOC,EAAK,QAAS,OAAO,EAAG,QAASA,EAAK,UAAW,OAAO,EAAG,MAAOA,EAAK,QAAS,OAAO,EAAG,MAAOA,EAAK,QAAS,QAAQ,EAAG,KAAMA,EAAK,OAAQ,OAAO,EAC3J,KAAMS,GAAK,SAASrC,EAAM,IAAI,EAAIA,EAAM,KAAOO,EAAM,OAAS,EAAI,aAAe,oBAAqB,SAAUP,EAAM,WAAa,GAAO,IAAAiC,CAC5I,EACA,SAAA/B,CACF,CACF,CAGA,SAASI,GAAMN,EAAO,CAEpB,IAAMsC,EAAO,CAAC,EACd,QAAWT,IAAO,CAAC,YAAa,YAAa,iBAAkB,mBAAmB,EAAO,OAAO,UAAU7B,EAAM6B,CAAG,CAAC,GAAK7B,EAAM6B,CAAG,EAAI,IAAGS,EAAKT,CAAG,EAAI7B,EAAM6B,CAAG,GAC9J,OAAI,MAAM,QAAQ7B,EAAM,KAAK,GAAKA,EAAM,MAAM,SAAW,GAAKA,EAAM,MAAM,MAAM,OAAO,SAAS,IAAGsC,EAAK,MAAQtC,EAAM,OAClH,OAAOA,EAAM,UAAa,YAAWsC,EAAK,SAAWtC,EAAM,UAC3D,OAAOA,EAAM,MAAS,UAAY,iBAAiB,KAAKA,EAAM,IAAI,IAAGsC,EAAK,KAAOtC,EAAM,MACpFsC,CACT,CAQO,SAASC,GAAWvC,EAAO,CAChC,GAAI,CAACA,GAAS,OAAOA,GAAU,SAAU,MAAO,CAAC,EACjD,GAAI,CAAC,KAAK,UAAUA,CAAK,EAAE,SAAS,UAAU,EAAG,OAAOA,EACxD,IAAMqB,EAA4BG,GAAOA,GAAK,OAAOA,GAAM,UAAY,WAAYA,EAAIA,EAAE,OAASA,EAE5FgB,EAA6BhB,GAAM,CAAE,IAAMY,EAAIf,EAAMG,CAAC,EAAG,OAAO,OAAOY,GAAM,SAAWA,EAAI,OAAOA,GAAG,KAAQ,SAAW,GAAGA,EAAE,GAAG,GAAG,OAAOA,EAAE,OAAU,UAAYA,EAAE,MAAQ,EAAI,KAAK,MAAM,KAAK,IAAI,EAAGA,EAAE,KAAK,EAAI,GAAG,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,EAAI,EAAE,GAAK,MAAU,EACzQK,EAA2BjB,GAAM,CAAE,IAAMY,EAAIf,EAAMG,CAAC,EAAG,OAAO,MAAM,QAAQY,CAAC,EAAIA,EAAE,IAAI,MAAM,EAAI,OAAOA,GAAM,SAAW,CAACA,CAAC,EAAI,MAAU,EACzIM,EAA8B,CAAE,GAAI,QAAS,WAAY,QAAS,MAAO,QAAS,GAAI,MAAO,KAAM,MAAO,IAAK,MAAO,OAAQ,UAAW,QAAS,UAAW,MAAO,QAAS,QAAS,OAAQ,KAAM,MAAO,EAC3MC,EAA4BC,GAAM,OAAO,YAAY,OAAO,QAAQA,GAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAACC,CAAC,IAAMA,KAAKH,CAAK,EAAE,IAAI,CAAC,CAACG,EAAGrB,CAAC,IAAM,CAACkB,EAAyCG,CAAE,EAAGL,EAAOhB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAEY,CAAC,IAAMA,CAAC,CAAC,EACxMU,EAAU9C,EAAM,OAASA,EAAM,QAAU,CAAC,EAE1C+C,EAAS,CAAE,GAAGJ,EAAMG,CAAO,EAAG,GAAGH,EAAMG,EAAQ,KAAK,CAAE,EACtDE,EAAOL,EAAMG,EAAQ,IAAI,EAC3B,OAAO,KAAKE,CAAI,EAAE,SAAQD,EAAO,KAAOC,GAC5C,IAAMC,EAAQjD,EAAM,MAAQA,EAAM,YAAc,CAAC,EAC3CkD,EAAUT,EAAKQ,EAAM,SAAWA,EAAM,SAAWA,EAAM,IAAI,EAAGE,EAAOV,EAAKQ,EAAM,MAAQA,EAAM,MAAQA,EAAM,IAAI,EACtH,OAAIC,GAAWC,KAAMJ,EAAO,MAAQ,CAAE,QAASG,GAAWC,EAAM,KAAMA,GAAQD,CAAQ,GAC/EH,CACT,CAOO,SAASK,MAAaC,EAAM,CAEjC,IAAMC,EAAM,CAAE,KAAM,WAAY,OAAQ,CAAC,EAAG,QAAS,CAAE,GAAGxD,GAAS,OAAQ,EAAG,SAAU,CAAC,CAAE,EACrFI,EAAW,CAAC,EAClB,QAAWF,KAASqD,EAClB,GAAI,GAACrD,GAAS,OAAOA,GAAU,UAE/B,IADI,OAAOA,EAAM,MAAS,WAAUsD,EAAI,KAAOtD,EAAM,MACjDA,EAAM,QAAU,OAAOA,EAAM,QAAW,SAAU,CACpD,IAAMuD,EAAOhB,GAAWvC,EAAM,MAAM,EAAGgD,EAAOO,EAAK,MAAQ,OAAOA,EAAK,MAAS,SAAW,CAAE,GAAGD,EAAI,OAAO,KAAM,GAAGC,EAAK,IAAK,EAAID,EAAI,OAAO,KAC7IA,EAAI,OAAS,CAAE,GAAGA,EAAI,OAAQ,GAAGC,EAAM,GAAIP,GAAQ,CAAE,KAAAA,CAAK,CAAG,CAC/D,CACA,OAAW,CAACjD,EAAMyD,CAAO,IAAK,OAAO,QAAQxD,EAAM,UAAY,CAAC,CAAC,EAC3DS,GAAK,KAAKV,CAAI,GAAK0D,GAAMD,CAAO,EAAGF,EAAI,SAASvD,CAAI,EAAIyD,EACvDtD,EAAS,KAAK,WAAWH,CAAI,gCAAgC,EAEpE,OAAW,CAACA,EAAM2D,CAAU,IAAK,OAAO,QAAQ1D,EAAM,SAAWA,EAAM,OAAS,CAAC,CAAC,EAAG,CACnF,GAAI,CAACS,GAAK,KAAKV,CAAI,EAAG,CAAEG,EAAS,KAAK,UAAUH,CAAI,sBAAsB,EAAG,QAAS,CACtF,GAAI2D,IAAe,GAAO,CAAM3D,IAAS,WAAW,OAAOuD,EAAI,QAAQvD,CAAI,EAAG,QAAS,CACvF,GAAM,CAAE,OAAA4D,EAAQ,SAAUC,CAAM,EAAI3D,GAASyD,CAAU,EACvDxD,EAAS,KAAK,GAAG0D,EAAM,IAAKC,GAAM,UAAU9D,CAAI,KAAK8D,CAAC,EAAE,CAAC,EACrDF,IAAQL,EAAI,QAAQvD,CAAI,EAAI4D,EAClC,EAEF,OAAW,CAACG,EAAOf,CAAM,GAAiE,CAAC,CAAC,OAAQO,EAAI,MAAM,EAAG,CAAC,YAAaA,EAAI,OAAO,IAAI,CAAC,EACzIP,GAAQ,OAAS,QAAa,CAACgB,GAAOhB,EAAO,IAAI,IAAK7C,EAAS,KAAK,GAAG4D,CAAK,uFAAuF,EAAG,OAAOf,EAAO,MAE1L,OAAIO,EAAI,OAAO,SAAW,QAAa,CAACU,GAAQ,SAASV,EAAI,OAAO,MAAM,IAAKpD,EAAS,KAAK,UAAUoD,EAAI,OAAO,MAAM,kBAAkBU,GAAQ,KAAK,IAAI,CAAC,EAAE,EAAG,OAAOV,EAAI,OAAO,QAC5K,CAAE,IAAAA,EAAK,SAAApD,CAAS,CACzB,CC9GO,SAAS+D,GAAMC,EAAOC,EAAQ,CAAC,IAAK,IAAK,GAAG,EAAG,CACpD,IAAMC,EAAO,OAAOF,CAAK,EAAE,KAAK,EAAGG,EAAS,4CAA4C,KAAKD,CAAI,IAAI,CAAC,EAAGE,EAAM,sBAAsB,KAAKF,CAAI,IAAI,CAAC,EAAE,MAAM,SAAS,EAAE,OAAO,OAAO,EAC9KG,EAAQ,CAAuBC,EAA4BC,IAAWD,EAAK,SAAS,GAAG,EAAK,WAAWA,CAAI,EAAI,IAAOC,EAAQ,OAAOD,CAAI,EACzI,CAACE,EAAGC,EAAGC,EAAGC,EAAI,CAAC,EAAIR,GAAUA,EAAO,OAAS,EAAI,CAAC,GAAGA,CAAM,EAAE,IAAKS,GAAMA,EAAIA,CAAC,EAA6BT,EAAO,MAAM,KAAK,GAAI,IAAI,CAACU,EAAGC,IAAM,SAASD,EAAG,EAAE,GAAKC,EAAI,EAAI,IAAM,EAAE,EACnLV,GAAK,SAAW,GAAKA,GAAK,SAAW,EAAIA,EAAI,IAAI,CAACE,EAAMQ,IAAMT,EAAMC,EAAMQ,EAAI,EAAI,EAAI,GAAG,CAAC,EAAI,CAAC,EACnG,OAAON,IAAM,QAAa,CAACA,EAAGC,EAAGC,CAAC,EAAE,MAAOE,GAAMA,GAAK,GAAKA,GAAK,GAAG,GAAKD,GAAK,GAAKA,GAAK,EAAII,GAAMC,GAAIf,EAAO,CAACO,EAAGC,EAAGC,CAAC,EAAGC,CAAC,CAAC,EAAI,IAC/H,CAMA,IAAMM,GAASC,GAA+CA,EAAE,IAAKC,GAAM,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKA,CAAC,CAAC,CAAC,CAAC,EAG9GC,GAAM,CAACC,EAAGC,EAAGC,IAA+CF,EAAE,IAAI,CAACH,EAAGM,IAAMN,GAAKI,EAAEE,CAAC,EAAIN,GAAKK,CAAC,EAGpG,SAASE,GAAUC,EAAK,CACtB,GAAM,CAACC,EAAGC,EAAGN,CAAC,EAAII,EAAI,IAAKR,GAAM,CAAE,IAAMW,EAAIX,EAAI,IAAK,OAAOW,GAAK,OAAUA,EAAI,QAAUA,EAAI,MAAS,QAAU,GAAI,CAAC,EACtH,MAAO,OAASF,EAAI,MAASC,EAAI,MAASN,CAC5C,CAGO,SAASQ,GAAST,EAAGC,EAAG,CAC7B,GAAM,CAACS,EAAGC,CAAC,EAAI,CAACP,GAAUJ,CAAC,EAAGI,GAAUH,CAAC,CAAC,EAAE,KAAK,CAACW,EAAGC,IAAMA,EAAID,CAAC,EAChE,OAAQF,EAAI,MAASC,EAAI,IAC3B,CC9FA,IAAMG,GAA6C,CAAE,cAAe,QAAS,oBAAqB,UAAW,iBAAkB,UAAW,cAAe,kBAAmB,aAAc,SAAU,MAAO,MAAO,EAC5MC,GAAO,CAAC,cAAe,oBAAqB,iBAAkB,cAAe,aAAc,aAAc,QAAS,uBAAwB,sBAAsB,EAChKC,GAAkD,CAAE,IAAK,YAAa,IAAK,aAAc,KAAM,aAAc,IAAK,YAAa,IAAK,eAAgB,EAEpJC,GAA+C,CAAE,GAAGD,GAAU,KAAM,aAAc,IAAK,WAAY,EACnGE,GAAa,EAAGC,GAAS,EAEzBC,EAAM,MAGZ,SAASC,GAAMC,EAAO,CACpB,IAAMC,EAAO,IAAI,SAASD,EAAM,OAAQA,EAAM,WAAYA,EAAM,UAAU,EACtEE,EAAMF,EAAM,OAAS,GACzB,KAAOE,GAAO,GAAKD,EAAK,UAAUC,EAAK,EAAI,IAAM,WAAYA,IAC7D,GAAIA,EAAM,EAAG,MAAM,IAAI,MAAM,uBAAuB,EAEpD,IAAMC,EAAQ,IAAI,IAClB,QAASC,EAAKH,EAAK,UAAUC,EAAM,GAAI,EAAI,EAAGG,EAAIJ,EAAK,UAAUC,EAAM,GAAI,EAAI,EAAGG,EAAI,EAAGA,IAAK,CAC5F,IAAMC,EAASL,EAAK,UAAUG,EAAK,GAAI,EAAI,EAAGG,EAAON,EAAK,UAAUG,EAAK,GAAI,EAAI,EAAGI,EAAO,IAAI,YAAY,EAAE,OAAOR,EAAM,SAASI,EAAK,GAAIA,EAAK,GAAKH,EAAK,UAAUG,EAAK,GAAI,EAAI,CAAC,CAAC,EAC9KK,EAAQR,EAAK,UAAUG,EAAK,GAAI,EAAI,EAAGM,EAAQD,EAAQ,GAAKR,EAAK,UAAUQ,EAAQ,GAAI,EAAI,EAAIR,EAAK,UAAUQ,EAAQ,GAAI,EAAI,EAAGE,EAAOX,EAAM,SAASU,EAAOA,EAAQH,CAAI,EAChLJ,EAAM,IAAIK,EAAM,SAAaF,IAAW,EAAIK,EAAO,IAAI,WAAW,MAAM,IAAI,SAAS,IAAI,KAAK,CAA0BA,CAAK,CAAC,EAAE,OAAO,EAAE,YAAY,IAAI,oBAAoB,aAAa,CAAC,CAAC,EAAE,YAAY,CAAC,CAAE,EAC7MP,GAAM,GAAKH,EAAK,UAAUG,EAAK,GAAI,EAAI,EAAIH,EAAK,UAAUG,EAAK,GAAI,EAAI,EAAIH,EAAK,UAAUG,EAAK,GAAI,EAAI,CACzG,CACA,OAAOD,CACT,CAGA,IAAMS,EAAO,CAACC,EAAKL,IAAS,IAAI,OAAO,MAAMA,CAAI,YAAY,EAAE,KAAKK,CAAG,IAAI,CAAC,EAEtEC,GAAU,CAACC,EAAMC,IAAS,IAAI,IAAI,CAAC,GAAGD,EAAK,SAAS,wBAAwB,CAAC,EAAE,IAAI,CAAC,CAACE,CAAG,IAAM,CAAC,OAAOL,EAAKK,EAAK,IAAI,CAAC,EAAG,IAAI,IAAI,OAAOL,EAAKK,EAAK,QAAQ,CAAC,EAAG,WAAWD,CAAI,GAAG,EAAE,SAAS,MAAM,CAAC,CAAC,CAAC,CAAC,EAO1M,eAAsBE,GAAgBlB,EAAO,CAAE,KAAAQ,CAAK,EAAI,CAAC,EAAG,CAC1D,IAAML,EAAQJ,GAAMC,CAAK,EAAGmB,EAAoC,CAAC,EAC3DC,EAAO,MAA6BC,GAAS,IAAI,YAAY,EAAE,OAAO,MAAOlB,EAAM,IAAIkB,CAAI,IAAI,GAAK,IAAI,WAAa,EAErHC,EAAS,CAAC,GAAGnB,EAAM,KAAK,CAAC,EAAE,OAAQkB,GAAS,mDAAmD,KAAKA,CAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EACzH,GAAI,CAACC,EAAQ,MAAM,IAAI,MAAM,4CAA4C,EACzE,IAAMC,EAAOD,EAAO,MAAM,GAAG,EAAE,CAAC,EAAGE,EAAY,MAAMJ,EAAKE,CAAM,EAAGG,EAAaX,GAAQ,MAAMM,EAAKE,EAAO,QAAQ,WAAY,eAAe,CAAC,EAAG,GAAGC,CAAI,eAAe,EACjKG,EAAY,CAAC,GAAGD,EAAW,OAAO,CAAC,EAAE,KAAMJ,GAAS,wBAAwB,KAAKA,CAAI,CAAC,GAAK,GAAGE,CAAI,oBAAqBI,EAAQ,MAAMP,EAAKM,CAAS,EACnJ,CAACE,EAAIC,CAAE,GAAMtB,GAAS,CAAC,OAAOK,EAAKL,EAAM,IAAI,GAAK,OAAQ,EAAG,OAAOK,EAAKL,EAAM,IAAI,GAAK,MAAO,CAAC,GAAG,mBAAmB,KAAK,MAAMa,EAAK,GAAGG,CAAI,mBAAmB,CAAC,IAAI,CAAC,GAAK,EAAE,EAG7KO,EAA+BjB,GAAQ,OAAO,YAAY,CAAC,IAAI,6CAA6C,KAAKA,CAAG,IAAI,CAAC,GAAK,IAAI,SAAS,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC,CAAEkB,EAAKC,CAAK,IAAM,CAACD,EAAKC,CAAK,CAAC,CAAC,EACnMC,EAAY,CAAE,IAAK,MAAO,IAAK,MAAO,IAAK,MAAO,IAAK,MAAO,GAAGH,EAAMN,CAAS,CAAE,EAClFU,EAAS,OAAO,YAAY,CAAC,GAAGP,EAAM,SAAS,0HAA0H,CAAC,EAAE,IAAI,CAAC,CAAC,CAAEQ,EAAMH,CAAK,IAAM,CAACG,EAAM,IAAIH,EAAM,YAAY,CAAC,EAAE,CAAC,CAAC,EACvOI,EAA8BC,GAASzB,EAAK,IAAI,OAAO,MAAMyB,CAAI,8BAA8B,EAAE,KAAKV,CAAK,IAAI,CAAC,EAAE,QAAQ,mBAAoB,EAAE,GAAK,GAAI,UAAU,EACnK,CAACW,EAASC,CAAI,EAAI,CAACH,EAAK,WAAW,EAAGA,EAAK,WAAW,CAAC,EAAE,IAAKnB,GAASA,GAAO,CAACA,EAAI,WAAW,GAAG,EAAI,CAACA,EAAK,gBAAiB,YAAa,YAAY,EAAI,IAAK,EAE9JuB,EAAS,OAAO,YAA+C,CAAC,CAAC,QAASP,EAAU,GAAG,EAAG,CAAC,MAAOA,EAAU,GAAG,EAAG,CAAC,UAAW,SAAS,EAAG,CAAC,QAASA,EAAU,GAAG,EAAG,CAAC,OAAQA,EAAU,GAAG,CAAC,EAAG,OAAO,CAAC,CAAC,CAAEE,CAAI,IAAMD,EAAOC,CAAI,CAAC,EAAE,IAAI,CAAC,CAACJ,EAAKI,CAAI,IAAM,CAACJ,EAAKG,EAAOC,CAAI,CAAC,CAAC,CAAC,EAC1QM,EAAU,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAAE,IAAKpC,GAAM6B,EAAO,SAAS7B,CAAC,EAAE,CAAC,EAAE,OAAO,OAAO,EAC9EoC,EAAQ,SAAQD,EAAO,OAASC,IAChCH,GAAWC,KAAMC,EAAO,MAAQ,CAAE,QAASF,GAAWC,EAAM,KAAMA,GAAQD,CAAQ,GAGtF,IAAII,EAAW,GACf,OAAW,CAACC,CAAG,IAAKnB,EAAU,SAAS,2BAA2B,EAAG,CACnE,IAAMH,EAAOI,EAAW,IAAI,OAAOb,EAAK,kBAAkB,KAAK+B,CAAG,IAAI,CAAC,GAAK,GAAI,SAAS,CAAC,CAAC,EAAGC,EAAOlD,GAAS,WAAW,KAAK2B,GAAQ,EAAE,IAAI,CAAC,EAAE,YAAY,GAAK,EAAE,EAClK,GAAI,CAACA,GAAQ,CAACuB,GAAQ,CAACzC,EAAM,IAAIkB,CAAI,EAAG,SACxC,IAAMV,EAAO,MAAMR,EAAM,IAAIkB,CAAI,IAAI,EAAGwB,EAAMlC,GAAQ,QAAQiC,CAAI,WAAWE,GAAOnC,CAAI,CAAC,GACzF,GAAI,CAACoC,GAAOF,CAAG,EAAG,CAAE1B,EAAS,KAAK,YAAYE,EAAK,MAAM,GAAG,EAAE,IAAI,CAAC,wBAAwB,EAAG,KAAM,CACpG,GAAM,CAAC2B,EAAGC,EAAC,GAAMC,GAAQ,CAAC,OAAOtC,EAAKsC,EAAK,GAAG,GAAK,CAAC,EAAG,OAAOtC,EAAKsC,EAAK,GAAG,GAAK,CAAC,CAAC,GAAG,iBAAiB,KAAKP,CAAG,IAAI,CAAC,GAAK,EAAE,EAC1H,OAAO,OAAOH,EAAQ,CAAE,KAAMK,EAAK,OAAQ,GAAGI,GAAIpB,EAAK,EAAI,MAAQ,QAAQ,IAAImB,EAAIpB,EAAK,EAAI,QAAU,KAAK,EAAG,CAAC,EAC/Gc,EAAWrB,EACX,KACF,CAGA,IAAM8B,EAA+BC,GAASC,EAAS,IAAI,OAAO,MAAMD,CAAI,oBAAoBA,CAAI,GAAG,EAAE,KAAKzB,CAAK,IAAI,CAAC,GAAK,EAAE,EAAE,IAAKV,GAAQA,EAAI,GAAG,EAE/IqC,EAAM,CAAE,OAAQ,OAAO,YAAY,OAAO,QAAQpB,CAAM,EAAE,IAAI,CAAC,CAACC,EAAMoB,CAAG,IAAM,CAACpB,EAAMqB,GAAMD,EAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAG,IAAKtB,EAAW,KAAMR,EAAY,MAAAtB,EAAO,KAAM,CAACyB,EAAK9B,EAAK+B,EAAK/B,CAAG,EACpL,UAAWgB,GAAQ,MAAMM,EAAKM,EAAU,QAAQ,WAAY,eAAe,CAAC,EAAGA,EAAU,QAAQ,WAAY,EAAE,CAAC,EAChH,OAAQ,CAAE,KAAMyB,EAAM,cAAc,EAAG,KAAMA,EAAM,YAAY,EAAG,GAAIA,EAAM,gBAAgB,CAAE,EAAG,MAAO,CAAE,MAAOf,EAAK,WAAW,GAAK,GAAI,MAAOA,EAAK,WAAW,GAAK,EAAG,EACzK,SAAU,IAAI,IAAO,KAAM,IAAI,IAAO,MAAO,IAAI,IAAO,IAAK,CAAE,EAAG,CAAE,EAAG,KAAM,CAAC,CAAE,EAE5EqB,EAAa,IAAI,IACjBC,EAAmDC,GAAQF,EAAW,IAAI,KAAK,UAAUE,CAAG,CAAC,GAAKF,EAAW,IAAI,KAAK,UAAUE,CAAG,GAAKC,GAASC,GAASC,GAAOtC,CAAS,EAAG,CAAE,GAAG8B,EAAK,IAAAK,EAAK,KAAAC,EAAM,IAAK,CAAE,EAAG,CAAE,CAAE,CAAC,EACpN,KAAMG,IAAS,CAAE,IAAAA,EAAK,KAAAH,CAAK,EAAE,GAAG,IAAI,GAAK,CAAC,EAAE,IAAI,KAAK,UAAUD,CAAG,CAAC,EAEhEK,EAA+C,OAAO,YAAY,CAAC,CAAC/B,EAAU,IAAK,MAAM,EAAG,CAAC,UAAW,MAAM,EAAG,CAACA,EAAU,IAAK,KAAK,EAAG,CAACA,EAAU,IAAK,OAAO,CAAC,EAAE,OAAO,CAAC,CAACE,CAAI,IAAMD,EAAOC,CAAI,CAAC,EAAE,IAAI,CAAC,CAACA,EAAM8B,CAAK,IAAM,CAAC/B,EAAOC,CAAI,EAAG8B,CAAK,CAAC,CAAC,EACjP,CAACC,EAAKD,CAAK,EAAI,CAACX,EAAI,OAAOrB,EAAU,GAAG,GAAK,CAAC,EAAG,EAAG,CAAC,EAAGqB,EAAI,OAAOrB,EAAU,GAAG,GAAK,CAAC,IAAK,IAAK,GAAG,CAAC,EAGpGkC,EAAgCtD,GAAQ,CAAC,GAAGA,EAAI,SAAS,yBAAyB,CAAC,EAAE,QAAQ,CAAC,CAACuD,CAAE,IAAM,CAC3G,IAAMC,EAAK,gBAAgB,KAAKD,CAAE,IAAI,CAAC,EACvC,GAAI,CAACC,EAAI,MAAO,CAAC,EACjB,IAAMnB,EAAM,iBAAiB,KAAKkB,CAAE,IAAI,CAAC,EAAGE,EAAM,iBAAiB,KAAKF,CAAE,IAAI,CAAC,EAC/E,MAAO,CAAC,CAAE,KAAMxD,EAAKyD,EAAI,MAAM,GAAK,OAAQ,KAAMzD,EAAK,mBAAmB,KAAKwD,CAAE,IAAI,CAAC,GAAK,GAAI,MAAM,GAAK,GAAI,IAAKlB,GAAOoB,EAAM,CAAC,OAAO1D,EAAKsC,EAAK,GAAG,CAAC,EAAG,OAAOtC,EAAKsC,EAAK,GAAG,CAAC,EAAG,OAAOtC,EAAK0D,EAAK,IAAI,CAAC,EAAG,OAAO1D,EAAK0D,EAAK,IAAI,CAAC,CAAC,EAAI,IAAK,CAAC,CAC7O,CAAC,EACKC,EAAcJ,EAAO3C,CAAS,EAE9BgD,EAAU,CAAC,EAAGC,EAAkD,CAAC,EAEjEC,EAAQ,CAAuBC,EAA6BC,IAAU,CAC1E,IAAM/B,EAAM8B,EAAQE,GAAMC,GAAMH,EAAOrB,EAAI,IAAI,CAAC,EAAI,KAEpD,GADIqB,GAAS,CAAC9B,GAAK1B,EAAS,KAAK,UAAUyD,CAAK,uCAAuC/E,EAAM,KAAK,EAC9F,CAACgD,EAAK,MAAO,CAAC,EAClB,IAAIkC,EAAO,WACX,QAASC,EAAI,EAAGA,EAAInC,EAAI,OAAQmC,IAAKD,EAAO,KAAK,KAAKA,EAAOlC,EAAI,WAAWmC,CAAC,EAAG,QAAQ,IAAM,EAC9F,OAAAP,EAAS,OAAOM,EAAK,SAAS,EAAE,CAAC,EAAE,EAAIlC,EAChC,CAAC,OAAOkC,EAAK,SAAS,EAAE,CAAC,EAAE,CACpC,EACME,EAAQ,CAAC,GAAGxD,EAAW,OAAO,CAAC,EAAE,OAAQJ,GAAS,qCAAqC,KAAKA,CAAI,CAAC,EAAE,KAAK,CAAC6D,EAAGC,IAAM,OAAO,cAAc,KAAKD,CAAC,IAAI,CAAC,CAAC,EAAI,OAAO,cAAc,KAAKC,CAAC,IAAI,CAAC,CAAC,CAAC,EAC/L,QAAW9D,KAAQ4D,EAAO,CACxB,IAAMpE,EAAM,MAAMO,EAAKC,CAAI,EAAG+D,GAASxE,EAAK,kBAAkB,KAAKC,CAAG,IAAI,CAAC,GAAK,GAAI,MAAM,GAAK,IAAI,QAAQ,SAAU,GAAG,EAAE,KAAK,EACzHwE,EAAQlB,EAAOtD,CAAG,EAAE,OAAQI,GAAQ,CAAC,CAAC,KAAM,MAAO,QAAQ,EAAE,SAASA,EAAI,IAAI,CAAC,EAAE,IAAKA,IAAS,CAAE,GAAGA,EAAK,IAAKA,EAAI,KAAOsD,EAAY,KAAMe,IAAMA,GAAE,OAASrE,EAAI,MAASA,EAAI,OAAS,YAAcqE,GAAE,OAAS,OAAQ,GAAG,KAAO,IAAK,EAAE,EAC3O,OAAQrE,GAAQA,EAAI,GAAG,EACpBc,EAAMvC,GAAI4F,CAAK,IAAMA,EAAM,YAAY,EAAE,UAAU,MAAM,EAAE,QAAQ,cAAe,GAAG,EAAE,QAAQ,WAAY,EAAE,EAAE,QAAQ,UAAW,IAAI,EAAE,MAAM,EAAG,EAAE,GAAK,UAAUH,EAAM,QAAQ5D,CAAI,EAAI,CAAC,IAGzLkE,EAAO,CAAE,GAAGjC,EAAK,IAAK,CAAE,GAAGrB,EAAW,GAAGH,EAAMjB,CAAG,CAAE,EAAG,KAAMC,GAAQ,MAAMM,EAAKC,EAAK,QAAQ,WAAY,eAAe,CAAC,EAAGA,EAAK,QAAQ,WAAY,EAAE,CAAC,EAAG,KAAM,IAAI,IAAO,IAAK,CAAE,EAAG,CAAE,CAAE,EAC1LmE,GAAMC,GAAK5E,CAAG,EAAG6E,EAAO,MAAMC,GAAOH,IAAOC,GAAKjE,CAAS,EAAG,CAAE,GAAG+D,EAAM,IAAK,CAAE,EAAG,CAAE,EAAG,GAAI,CAACC,IAAO,CAAE,KAAM/D,CAAW,CAAG,CAAC,EAC1HmE,GAAQ,gDAAgD,KAAK/E,CAAG,EAAI,CAAE,IAAK,GAAI,KAAM,IAAI,GAAM,EAAI,MAAM6C,EAAU6B,EAAK,GAAG,EAC3HM,GAAO,MAAMhC,GAASC,GAAOjD,CAAG,EAAG0E,CAAI,EAAGO,GAAQC,GAAQlF,EAAKW,EAAW+D,CAAI,EAAGpD,GAAOuD,EAAK,IAAM1B,EAAMgC,GAAMN,EAAK,GAAG,CAAC,EAAI,OAE5HO,GAAQH,IAASI,GAASJ,GAAO5B,CAAG,EAAIgC,GAASJ,GAAO7B,CAAK,EAC7DkC,GAAQhE,KAAS,OAAS,OAAS8D,KAAUL,GAAM,KAAOC,IAAQ,CAAC1D,IAAQ,MAAQA,KAASuD,EAAK,KAAOQ,GAASR,EAAK,IAAKxB,CAAG,EAAIgC,GAASR,EAAK,IAAKzB,CAAK,EAAI,MAAQ,SACtKmC,GAAS,CAAC,GAAG1B,EAAMyB,KAAUhE,GAAO,GAAKuD,EAAK,IAAKN,GAASrD,CAAG,EAAG,GAAG2C,EAAMkB,GAAM,IAAKR,GAASrD,CAAG,EAAG,GAAG2C,EAAMmB,GAAMT,GAASrD,CAAG,CAAC,EACjIsE,GAASC,GAAOjB,EAAOzD,EAAIC,EAAIuE,GAAO,OAAS,CAAC,EACtD,GAAI,CAACC,GAAQ,CAAElF,EAAS,KAAK,UAAUiE,GAASrD,CAAG,+CAA+C,EAAG,QAAS,CAC9G,IAAMwE,GAAO7D,IAAa6C,EAAK,KAAK,IAAI7C,CAAQ,GAAKkD,GAAM,KAAK,IAAIlD,CAAQ,GAAK,OAAS8D,GAAS,QAAQzE,CAAG,GAAG,MAAQ,QAEnH0E,GAA+C,CAAE,IAAK,SAAU,EAAG,KAAM,EAAGC,GAAU7F,EAAKW,EAAW,yCAAyC,GAAK,EAAE,GAAK,QACjKgD,EAAQzC,CAAG,EAAI,CAAE,MAAOqD,GAASrD,EAAK,GAAGsE,GAAQ,MAAOF,GAAO,MAAOd,EAAM,KAAMpE,GAAQA,EAAI,OAAS,UAAU,EAAI,OAAS,SAAU,KAAAsF,GAAM,MAAAE,GAC5I,GAAIpB,EAAM,KAAMpE,GAAQA,EAAI,OAAS,UAAU,GAAK,CAAE,QAAS,QAAS,EAAI,KAAMxB,GAAK,SAAS2F,CAAK,EAAIA,EAAQiB,GAAO,MAAM,OAAS,EAAI,aAAe,oBAC1J,SAAU,4BAA4B,KAAKxF,CAAG,EAAG,GAAIuF,GAAO,QAAU,CAAE,IAAKA,EAAO,CAAG,CAC3F,CAEI,OAAO,OAAO5B,CAAO,EAAE,KAAM6B,GAAWA,EAAO,GAAG,IAAG7D,EAAO,KAAO,OAAO,YAAY,CAAC,QAAS,MAAO,QAAS,MAAM,EAAE,OAAQT,GAAQS,EAAOT,CAAG,CAAC,EAAE,IAAKA,GAAQ,CAACA,EAAKS,EAAOT,CAAG,CAAC,CAAC,CAAC,GACzL,IAAM4E,EAASC,GAAU,CAAE,KAAMpG,GAAQ,WAAY,OAAAgC,EAAQ,QAAAgC,EAAS,SAAAC,CAAS,CAAC,EAChF,MAAO,CAAE,IAAK,CAAE,GAAGkC,EAAO,IAAK,KAAMnG,GAAQ,UAAW,EAAG,SAAU,CAAC,GAAGW,EAAU,GAAGmC,EAAI,MAAO,GAAGqD,EAAO,QAAQ,CAAE,CACvH,CAcA,SAAStD,EAASxC,EAAM,GAAI,CAC1B,IAAMgG,EAA6B,CAAC,EAChCC,EAAQ,EAAGC,EAAM,GAAI/F,EAAO,EAAGZ,EAAK,EACxC,QAAWkF,KAAKzE,EAAI,SAAS,6BAA6B,EAAG,CAC3D,IAAMmG,EAA+B1B,EAAE,MACnCA,EAAE,CAAC,EAAS,EAAEwB,IAAU,GAAGD,EAAI,KAAK,CAAE,KAAMvB,EAAE,CAAC,EAAG,IAAAyB,EAAK,MAAOlG,EAAI,MAAMG,EAAMgG,CAAK,EAAG,IAAKnG,EAAI,MAAMT,EAAI4G,EAAQ1B,EAAE,CAAC,EAAE,MAAM,CAAE,CAAC,EAC1HA,EAAE,CAAC,EAAUwB,GAAOD,EAAI,KAAK,CAAE,KAAMvB,EAAE,CAAC,EAAG,IAAKA,EAAE,CAAC,EAAG,MAAO,GAAI,IAAKA,EAAE,CAAC,CAAE,CAAC,EAC3EwB,MAAWC,EAAMzB,EAAE,CAAC,EAAGlF,EAAK4G,EAAOhG,EAAOgG,EAAQ1B,EAAE,CAAC,EAAE,OACnE,CACA,OAAOuB,CACT,CAEA,IAAMI,EAAQ,CAACpG,EAAKL,IAAS6C,EAASxC,CAAG,EAAE,KAAMI,GAAQA,EAAI,OAAST,CAAI,EAEpEsD,GAAUjD,GAAQ,kCAAkC,KAAKA,CAAG,IAAI,CAAC,GAAK,GAEtE4E,GAAQ5E,GAAQ,2BAA2B,KAAKA,CAAG,IAAI,CAAC,EAExDR,EAAK2B,GAAU,OAAO,KAAK,MAAMA,EAAQ,GAAG,EAAI,GAAG,EAGnDgE,GAASkB,GAAQ,IAAIA,EAAI,IAAKC,GAAM,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKA,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAErHC,GAAYD,IAAQA,GAAK,MAAQ,OAAUA,EAAI,QAAUA,EAAI,MAAS,QAAU,IAEhFE,GAAcC,GAAM,KAAOA,GAAK,SAAYA,EAAI,MAAQ,MAAQ,KAAK,IAAI,EAAGA,CAAC,IAAM,EAAI,KAAO,MAEpG,SAASC,GAAM,CAACC,EAAGC,EAAGtC,CAAC,EAAG,CACxB,GAAM,CAACnC,EAAGC,EAAGyE,CAAC,EAAI,CAACF,EAAI,IAAKC,EAAI,IAAKtC,EAAI,GAAG,EAAGwC,EAAM,KAAK,IAAI3E,EAAGC,EAAGyE,CAAC,EAAGE,EAAM,KAAK,IAAI5E,EAAGC,EAAGyE,CAAC,EAAG,GAAKC,EAAMC,GAAO,EAAGC,EAAIF,EAAMC,EAChI,GAAI,CAACC,EAAG,MAAO,CAAC,EAAG,EAAG,CAAC,EACvB,IAAMC,EAAID,GAAK,EAAI,KAAK,IAAI,EAAI,EAAI,CAAC,GACrC,MAAO,GADsCF,IAAQ3E,GAAMC,EAAIyE,GAAKG,EAAK,EAAIF,IAAQ1E,GAAKyE,EAAI1E,GAAK6E,EAAI,GAAK7E,EAAIC,GAAK4E,EAAI,GAC5G,GAAK,KAAO,IAAKC,EAAG,CAAC,CACpC,CAEA,SAASC,EAAQC,EAAGF,EAAGG,EAAG,CACxB,IAAMd,GAAK,EAAI,KAAK,IAAI,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGc,CAAC,CAAC,EAAI,CAAC,GAAK,KAAK,IAAI,EAAGH,CAAC,EAAG9E,EAAImE,GAAK,EAAI,KAAK,IAAMa,EAAI,GAAM,EAAK,CAAC,GAAI1C,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG2C,CAAC,CAAC,EAAId,EAAI,EAC5J,CAACe,EAAGC,EAAGC,CAAC,EAAIJ,EAAI,GAAK,CAACb,EAAGnE,EAAG,CAAC,EAAIgF,EAAI,IAAM,CAAChF,EAAGmE,EAAG,CAAC,EAAIa,EAAI,IAAM,CAAC,EAAGb,EAAGnE,CAAC,EAAIgF,EAAI,IAAM,CAAC,EAAGhF,EAAGmE,CAAC,EAAIa,EAAI,IAAM,CAAChF,EAAG,EAAGmE,CAAC,EAAI,CAACA,EAAG,EAAGnE,CAAC,EACvI,MAAO,CAACkF,EAAI5C,EAAG6C,EAAI7C,EAAG8C,EAAI9C,CAAC,EAAE,IAAKgC,GAAMA,EAAI,GAAG,CACjD,CACA,IAAMe,GAA+C,CAAE,MAAO,SAAU,MAAO,SAAU,KAAM,SAAU,KAAM,SAAU,IAAK,SAAU,MAAO,SAAU,KAAM,SAAU,OAAQ,QAAS,EAO1L,SAASC,EAASzH,EAAKyC,EAAKe,EAAK,KAAM,CACrC,IAAMpD,EAAMoC,EAASxC,CAAG,EAAE,KAAMwB,GAAS,yDAAyD,KAAKA,EAAK,IAAI,CAAC,EACjH,GAAI,CAACpB,EAAK,OAAO,KACjB,IAAMsH,EAAM3H,EAAKK,EAAI,IAAK,KAAK,GAAK,GAAIuH,EAAgCzG,GAAQ,OAAOnB,EAAKK,EAAI,IAAKc,CAAG,GAAK,CAAC,EAAI,IAC9GmF,EAAMjG,EAAI,OAAS,YAAcuC,GAAM+E,CAAG,EAAItH,EAAI,OAAS,WAAauC,GAAM5C,EAAKK,EAAI,IAAK,SAAS,IAAMsH,IAAQ,SAAW,SAAW,SAAS,EAClJtH,EAAI,OAAS,cAAiBsH,IAAQ,QAAUlE,GAAI,KAAO,KAAOf,EAAI,OAAOA,EAAI,IAAIiF,CAAG,GAAKA,CAAG,GAAK,KAAQtH,EAAI,OAAS,YAAcuC,GAAM6E,GAAME,CAAG,GAAK,QAAQ,EACpKtH,EAAI,OAAS,aAAe,CAAC,IAAK,IAAK,GAAG,EAAE,IAAKc,GAAQsF,GAAWmB,EAAOzG,CAAG,CAAC,CAAC,EAAIgG,EAAQ,OAAOnH,EAAKK,EAAI,IAAK,KAAK,GAAK,CAAC,EAAI,IAAOuH,EAAO,KAAK,EAAGA,EAAO,KAAK,CAAC,EACvK,GAAI,CAACtB,EAAK,OAAO,KACjB,IAAIuB,EAAQF,IAAQ,QAAUlE,GAAI,OAAS,EAAI,EAC/C,QAAWqE,KAAUrF,EAASpC,EAAI,KAAK,EAAG,CACxC,IAAM0H,EAAK,OAAO/H,EAAK8H,EAAO,IAAK,KAAK,GAAK,GAAM,EAAI,IAAQ,CAACV,EAAGF,EAAGG,CAAC,EAAIV,GAAML,CAAG,EAChFwB,EAAO,OAAS,UAAWD,EAAQE,EAC9BD,EAAO,OAAS,aAAcD,GAASE,EACvCD,EAAO,OAAS,WAAYxB,EAAMa,EAAQC,EAAGF,EAAGG,EAAIU,CAAE,EACtDD,EAAO,OAAS,WAAYxB,EAAMa,EAAQC,EAAGF,EAAGG,EAAIU,CAAE,EACtDD,EAAO,OAAS,WAAYxB,EAAMa,EAAQC,EAAGF,EAAIa,EAAIV,CAAC,EACtDS,EAAO,OAAS,WAAYxB,EAAMa,EAASC,EAAIW,EAAM,IAAKb,EAAGG,CAAC,EAC9DS,EAAO,OAAS,WAAYxB,EAAMa,GAASC,EAAIW,EAAK,IAAS,IAAQ,KAAO,IAAKb,EAAGG,CAAC,EACrFS,EAAO,OAAS,UAAWxB,EAAMA,EAAI,IAAKC,GAAME,GAAWD,GAASD,CAAC,EAAIwB,CAAE,CAAC,EAC5ED,EAAO,OAAS,WAAUxB,EAAMA,EAAI,IAAKC,GAAME,GAAW,GAAK,EAAID,GAASD,CAAC,GAAKwB,CAAE,CAAC,EAChG,CACA,MAAO,CAAE,IAAAzB,EAAK,MAAAuB,CAAM,CACtB,CAGA,eAAeG,GAAOC,EAAIvF,EAAK,CAC7B,IAAMjC,EAAOwH,EAAKvF,EAAI,KAAK,IAAIuF,CAAE,EAAI,OAAWC,EAAOzH,GAAQiC,EAAI,MAAM,IAAIjC,CAAI,EACjF,GAAI,CAACA,GAAQ,CAACyH,EAAM,OAAO,KAC3B,IAAMlG,EAAOjD,GAAM,WAAW,KAAK0B,CAAI,IAAI,CAAC,EAAE,YAAY,GAAK,EAAE,EAAG0H,EAAO1H,EAAK,MAAM,GAAG,EAAE,IAAI,EAC/F,GAAI,CAACuB,EAAQ,OAAAU,EAAI,MAAM,IAAI,eAAeyF,CAAI,qCAAqC,EAAU,KACxFzF,EAAI,SAAS,IAAIjC,CAAI,GAAGiC,EAAI,SAAS,IAAIjC,EAAMyH,EAAK,EAAE,KAAMnI,GAAUA,EAAK,OAASf,GAAa,KAAO,MAAQ0D,EAAI,MAAM,IAAI,eAAeyF,CAAI,mBAAmBnJ,EAAU,KAAK,EAAG,MAAQ,QAAQgD,CAAI,WAAWE,GAAOnC,CAAI,CAAC,EAAG,CAAC,EAC1O,IAAMqI,EAAO,MAAM1F,EAAI,SAAS,IAAIjC,CAAI,EACxC,OAAI2H,GAAM1F,EAAI,KAAK,IAAIjC,CAAI,EACpB2H,GAAQ,IACjB,CAMA,SAASC,GAASC,EAAM5F,EAAKe,EAAK,KAAM,CACtC,IAAM8E,EAAUlC,EAAMiC,EAAM,WAAW,EAAGE,EAAMnC,EAAMiC,EAAM,OAAO,EACnE,GAAI,CAACC,GAAW,CAACC,EAAK,MAAO,GAC7B,IAAMP,EAAK,IAAI,EAAEvF,EAAI,IAAI,CAAC,GAAI,CAAC+F,EAAMpD,CAAK,EAAI5C,EAAS8F,GAAS,KAAK,EAAE,IAAKlI,GAAQqH,EAASrH,EAAI,IAAKqC,EAAKe,CAAE,GAAG,KAAO,CAAC,EAAG,EAAG,CAAC,CAAC,EAE1HiF,EAA6BtE,IAAQ6C,GAAM,GAAGxH,EAAEwH,EAAI,KAAM,CAAC,IAAIxH,EAAEwH,EAAI,KAAM,CAAC,IAAIxH,EAAEwH,EAAI,KAAM,CAAC,MAAMxH,EAAEgJ,EAAKrE,CAAC,EAAI,GAAG,CAAC,KAAKiB,EAAMjB,CAAC,EAAIqE,EAAKrE,CAAC,GAAK,GAAG,EACjJ,CAACuE,EAAQrD,CAAQ,EAAI,CAAC,SAAU,UAAU,EAAE,IAAKnE,GAAQ,OAAOnB,EAAKwI,GAAK,KAAO,GAAIrH,CAAG,GAAK,CAAC,EAAI,GAAM,EAAGyH,EAAQtD,EAAW,EAAI,EAAIA,EAAW,EAAI,KAAK,IAAI,IAAM,EAAIA,CAAQ,EAChLuD,EAAQ,CAAC,IAAK,IAAK,GAAG,EAAE,IAAKtC,GAAM,UAAUA,CAAC,yBAAyB9G,EAAEmJ,CAAK,CAAC,gBAAgBnJ,EAAEkJ,EAAS,IAAO,EAAIC,EAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAChJ,OAAAlG,EAAI,KAAK,KAAK,eAAeuF,CAAE,wCAAwCO,EAAM,wBAAwBK,CAAK,yBAA2B,EAAE,GAAGN,GAAWlD,EAAQ,wCAAwCqD,EAAI,CAAC,CAAC,IAAIA,EAAI,CAAC,CAAC,IAAIA,EAAI,CAAC,CAAC,gBAAkB,EAAE,WAAW,EACvP,iBAAiBT,CAAE,IAC5B,CAOA,eAAea,EAAQ7I,EAAK8I,EAAIrG,EAAKe,EAAK,KAAM,CAC9C,QAAWpD,KAAOoC,EAASxC,CAAG,EAAG,CAC/B,GAAII,EAAI,OAAS,WAAY,MAAO,GAAG0I,CAAE,UACzC,GAAI1I,EAAI,OAAS,eAAiBA,EAAI,OAAS,aAAc,CAC3D,IAAM2I,EAAStB,EAASrH,EAAI,OAAS,aAAegG,EAAMhG,EAAI,MAAO,SAAS,GAAG,OAAS,GAAKA,EAAI,MAAOqC,EAAKe,CAAE,EACjH,OAAOuF,EAAS,GAAGD,CAAE,KAAK3D,GAAM4D,EAAO,GAAG,CAAC,IAAIA,EAAO,MAAQ,EAAI,IAAID,CAAE,aAAatJ,EAAEuJ,EAAO,KAAK,CAAC,IAAM,EAAE,GAAK,GAAGD,CAAE,SACxH,CACA,GAAI1I,EAAI,OAAS,aAAc,CAC7B,IAAM4I,EAAQxG,EAAS4D,EAAMhG,EAAI,MAAO,SAAS,GAAG,KAAK,EAAE,IAAK6I,GAA6B,CAAC,OAAOlJ,EAAKkJ,EAAG,IAAK,KAAK,GAAK,CAAC,EAAI,IAAQxB,EAASwB,EAAG,MAAOxG,EAAKe,CAAE,CAAC,CAAE,EAAE,KAAK,CAACa,EAAGC,IAAMD,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,EAC5L0D,EAAK,IAAI,EAAEvF,EAAI,IAAI,CAAC,GAAIjC,EAAO4F,EAAMhG,EAAI,MAAO,QAAQ,EAAG8I,EAAOF,EAAM,IAAI,CAAC,CAACzJ,EAAIwJ,CAAM,IAAOA,EAAS,iBAAiBvJ,EAAED,CAAE,CAAC,iBAAiB4F,GAAM4D,EAAO,GAAG,CAAC,IAAIA,EAAO,MAAQ,EAAI,kBAAkBvJ,EAAEuJ,EAAO,KAAK,CAAC,IAAM,EAAE,KAAO,EAAG,EAAE,KAAK,EAAE,EACzP,GAAI,CAACG,EAAM,MAAO,GAAGJ,CAAE,UACvB,GAAItI,EAAM,CAER,IAAM2I,EAAO/C,EAAM5F,EAAK,MAAO,cAAc,GAAG,KAAO,GAAI,CAAC4G,EAAGgC,EAAGzC,EAAG,CAAC,EAAI,CAAC,IAAK,IAAK,IAAK,GAAG,EAAE,IAAKzF,GAAQ,OAAOnB,EAAKoJ,EAAMjI,CAAG,GAAK,CAAC,EAAI,GAAM,EAAGiB,GAAKiF,EAAI,EAAIT,GAAK,EAAGvE,GAAKgH,EAAI,EAAI,GAAK,EAC3L3G,EAAI,KAAK,KAAK,uBAAuBuF,CAAE,SAASxI,EAAE2C,CAAC,CAAC,SAAS3C,EAAE4C,CAAC,CAAC,QAAQ5C,EAAE,KAAK,MAAM,KAAK,IAAI2C,EAAG,EAAIA,CAAC,EAAG,KAAK,IAAIC,EAAG,EAAIA,CAAC,CAAC,CAAC,CAAC,KAAK8G,CAAI,mBAAmB,CAC5J,KAAO,CACL,IAAMG,EAAS,OAAOtJ,EAAKqG,EAAMhG,EAAI,MAAO,OAAO,GAAG,KAAO,GAAI,KAAK,GAAK,CAAC,EAAI,KAAU,KAAK,GAAK,KAAMkJ,EAAK,KAAK,IAAID,CAAK,EAAI,EAAGE,EAAK,KAAK,IAAIF,CAAK,EAAI,EAC3J5G,EAAI,KAAK,KAAK,uBAAuBuF,CAAE,SAASxI,EAAE,GAAM8J,CAAE,CAAC,SAAS9J,EAAE,GAAM+J,CAAE,CAAC,SAAS/J,EAAE,GAAM8J,CAAE,CAAC,SAAS9J,EAAE,GAAM+J,CAAE,CAAC,KAAKL,CAAI,mBAAmB,CACrJ,CACA,MAAO,GAAGJ,CAAE,UAAUd,CAAE,IAC1B,CACA,GAAI5H,EAAI,OAAS,aAAc,CAC7B,IAAMiI,EAAOjC,EAAMhG,EAAI,MAAO,QAAQ,EAAG+H,EAAO,MAAMJ,GAAOhI,EAAKsI,GAAM,KAAO,GAAI,SAAS,EAAG5F,CAAG,EAAGuF,EAAK,IAAI,EAAEvF,EAAI,IAAI,CAAC,GACzH,GAAI,CAAC0F,GAAQW,IAAO,OAAQ,MAAO,GAAGA,CAAE,UACxC,IAAMU,EAASzJ,EAAKqG,EAAMiC,GAAM,MAAO,eAAe,GAAG,KAAO,GAAI,KAAK,EACzE,OAAA5F,EAAI,KAAK,KAAK,gBAAgBuF,CAAE,wHAAwHI,GAASC,GAAM,OAAS,GAAI5F,EAAKe,CAAE,CAAC,GAC1LgG,EAAS,aAAahK,EAAE,OAAOgK,CAAM,EAAI,GAAM,CAAC,IAAM,EAAE,gBAAgBrB,CAAI,eAAe,EACtF,cAAcH,CAAE,IACzB,CACA,GAAI5H,EAAI,OAAS,YAAa,OAAOqC,EAAI,OAAS,GAAGqG,CAAE,SACzD,CAEF,CAGA,IAAMW,EAAO,IAAIC,IAAW,IAAIA,EAAO,IAAI,CAAC,CAACvH,EAAGC,CAAC,IAAM,GAAG5C,EAAE2C,CAAC,CAAC,IAAI3C,EAAE4C,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC,IAE7EuH,GAAU,CAACC,EAAGzC,EAAG,CAAC9C,EAAGC,EAAGgC,EAAGU,CAAC,IAAM,IAAIxH,EAAE6E,CAAC,CAAC,MAAM7E,EAAEoK,EAAItF,CAAC,CAAC,GAAGA,EAAI,IAAI9E,EAAE8E,CAAC,CAAC,IAAI9E,EAAE8E,CAAC,CAAC,UAAU9E,EAAEoK,CAAC,CAAC,IAAIpK,EAAE8E,CAAC,CAAC,GAAK,EAAE,IAAI9E,EAAE2H,EAAIb,CAAC,CAAC,GAAGA,EAAI,IAAI9G,EAAE8G,CAAC,CAAC,IAAI9G,EAAE8G,CAAC,CAAC,UAAU9G,EAAEoK,EAAItD,CAAC,CAAC,IAAI9G,EAAE2H,CAAC,CAAC,GAAK,EAAE,IAAI3H,EAAEwH,CAAC,CAAC,GAC5LA,EAAI,IAAIxH,EAAEwH,CAAC,CAAC,IAAIxH,EAAEwH,CAAC,CAAC,YAAYxH,EAAE2H,EAAIH,CAAC,CAAC,GAAK,EAAE,IAAIxH,EAAE6E,CAAC,CAAC,GAAGA,EAAI,IAAI7E,EAAE6E,CAAC,CAAC,IAAI7E,EAAE6E,CAAC,CAAC,UAAU7E,EAAE6E,CAAC,CAAC,KAAO,EAAE,IAKjGwF,EAAS,CACb,KAAM,CAACD,EAAGzC,IAAMsC,EAAK,CAAC,EAAG,CAAC,EAAG,CAACG,EAAG,CAAC,EAAG,CAACA,EAAGzC,CAAC,EAAG,CAAC,EAAGA,CAAC,CAAC,EACnD,UAAW,CAACyC,EAAGzC,EAAG9C,EAAGI,IAAMkF,GAAQC,EAAGzC,EAAG,MAAM,CAAC,EAAE,KAAK1C,EAAIJ,EAAE,MAAO,KAAK,CAAC,CAAC,EAC3E,WAAY,CAACuF,EAAGzC,EAAG9C,EAAGI,IAAMkF,GAAQC,EAAGzC,EAAG,CAAC,EAAG1C,EAAIJ,EAAE,MAAO,KAAK,EAAG,EAAG,CAAC,CAAC,EACxE,eAAgB,CAACuF,EAAGzC,EAAG9C,EAAGI,IAAMkF,GAAQC,EAAGzC,EAAG,CAAC1C,EAAIJ,EAAE,OAAQ,KAAK,EAAGI,EAAIJ,EAAE,OAAQ,KAAK,EAAGI,EAAIJ,EAAE,OAAQ,CAAC,EAAGI,EAAIJ,EAAE,OAAQ,CAAC,CAAC,CAAC,EAC9H,eAAgB,CAACuF,EAAGzC,EAAG9C,EAAGI,IAAMkF,GAAQC,EAAGzC,EAAG,CAAC1C,EAAIJ,EAAE,OAAQ,KAAK,EAAGI,EAAIJ,EAAE,OAAQ,CAAC,EAAGI,EAAIJ,EAAE,OAAQ,KAAK,EAAGI,EAAIJ,EAAE,OAAQ,CAAC,CAAC,CAAC,EAC9H,UAAW,CAACuF,EAAGzC,EAAG9C,EAAGI,KAAQwC,GAAMwC,EAAK,CAAC,EAAG,CAAC,EAAG,CAACG,EAAI3C,EAAG,CAAC,EAAG,CAAC2C,EAAG3C,CAAC,EAAG,CAAC2C,EAAGzC,CAAC,EAAG,CAAC,EAAGA,CAAC,CAAC,GAAG1C,EAAIJ,EAAE,MAAO,KAAK,CAAC,EACxG,cAAe,CAACuF,EAAGzC,EAAG9C,EAAGI,KAAQwC,GAAMwC,EAAK,CAACxC,EAAG,CAAC,EAAG,CAAC2C,EAAI3C,EAAG,CAAC,EAAG,CAAC2C,EAAG3C,CAAC,EAAG,CAAC2C,EAAGzC,CAAC,EAAG,CAAC,EAAGA,CAAC,EAAG,CAAC,EAAGF,CAAC,CAAC,GAAGxC,EAAIJ,EAAE,OAAQ,KAAK,CAAC,EACrH,QAAS,CAACuF,EAAGzC,IAAM,MAAM3H,EAAE2H,EAAI,CAAC,CAAC,IAAI3H,EAAEoK,EAAI,CAAC,CAAC,IAAIpK,EAAE2H,EAAI,CAAC,CAAC,UAAU3H,EAAEoK,CAAC,CAAC,IAAIpK,EAAE2H,EAAI,CAAC,CAAC,IAAI3H,EAAEoK,EAAI,CAAC,CAAC,IAAIpK,EAAE2H,EAAI,CAAC,CAAC,YAAY3H,EAAE2H,EAAI,CAAC,CAAC,IAC/H,SAAU,CAACyC,EAAGzC,EAAG9C,IAAMoF,EAAK,CAACG,EAAIvF,EAAE,MAAO,GAAK,EAAG,CAAC,EAAG,CAACuF,EAAGzC,CAAC,EAAG,CAAC,EAAGA,CAAC,CAAC,EACpE,WAAY,CAACyC,EAAGzC,IAAMsC,EAAK,CAAC,EAAG,CAAC,EAAG,CAACG,EAAGzC,CAAC,EAAG,CAAC,EAAGA,CAAC,CAAC,EACjD,QAAS,CAACyC,EAAGzC,IAAMsC,EAAK,CAACG,EAAI,EAAG,CAAC,EAAG,CAACA,EAAGzC,EAAI,CAAC,EAAG,CAACyC,EAAI,EAAGzC,CAAC,EAAG,CAAC,EAAGA,EAAI,CAAC,CAAC,EACtE,cAAe,CAACyC,EAAGzC,EAAG9C,EAAGI,KAAQtC,GAAMsH,EAAK,CAACtH,EAAG,CAAC,EAAG,CAACyH,EAAG,CAAC,EAAG,CAACA,EAAIzH,EAAGgF,CAAC,EAAG,CAAC,EAAGA,CAAC,CAAC,GAAG1C,EAAIJ,EAAE,MAAO,IAAK,CAAC,EACpG,UAAW,CAACuF,EAAGzC,EAAG9C,EAAGI,KAAQtC,GAAMsH,EAAK,CAACtH,EAAG,CAAC,EAAG,CAACyH,EAAIzH,EAAG,CAAC,EAAG,CAACyH,EAAGzC,CAAC,EAAG,CAAC,EAAGA,CAAC,CAAC,GAAG1C,EAAIJ,EAAE,MAAO,IAAK,CAAC,EAChG,UAAW,CAACuF,EAAGzC,EAAG9C,EAAGI,KAAQtC,GAAMsH,EAAK,CAAC,EAAG,CAAC,EAAG,CAACtH,EAAG,CAAC,EAAG,CAACyH,EAAGzC,EAAI,CAAC,EAAG,CAAChF,EAAGgF,CAAC,EAAG,CAAC,EAAGA,CAAC,CAAC,GAAGyC,EAAInF,EAAIJ,EAAE,MAAO,GAAK,CAAC,EAC5G,QAAS,CAACuF,EAAGzC,EAAG9C,EAAGI,KAAQtC,GAAMsH,EAAK,CAAC,EAAG,CAAC,EAAG,CAACG,EAAIzH,EAAG,CAAC,EAAG,CAACyH,EAAGzC,EAAI,CAAC,EAAG,CAACyC,EAAIzH,EAAGgF,CAAC,EAAG,CAAC,EAAGA,CAAC,EAAG,CAAChF,EAAGgF,EAAI,CAAC,CAAC,GAAG1C,EAAIJ,EAAE,MAAO,GAAK,CAAC,EAC1H,SAAU,CAACuF,EAAGzC,IAAMsC,EAAK,CAACG,EAAI,EAAG,CAAC,EAAG,CAACA,EAAGzC,EAAI,IAAK,EAAG,CAACyC,EAAI,KAAOzC,CAAC,EAAG,CAACyC,EAAI,KAAOzC,CAAC,EAAG,CAAC,EAAGA,EAAI,IAAK,CAAC,EACnG,QAAS,CAACyC,EAAGzC,EAAG9C,EAAGI,KAAQtC,GAAMsH,EAAK,CAACtH,EAAG,CAAC,EAAG,CAACyH,EAAIzH,EAAG,CAAC,EAAG,CAACyH,EAAGzC,EAAI,CAAC,EAAG,CAACyC,EAAIzH,EAAGgF,CAAC,EAAG,CAAChF,EAAGgF,CAAC,EAAG,CAAC,EAAGA,EAAI,CAAC,CAAC,GAAG1C,EAAIJ,EAAE,MAAO,IAAK,CAAC,EAC1H,QAAS,CAACuF,EAAGzC,EAAG9C,EAAGI,KAAQtC,GAAMsH,EAAK,CAACtH,EAAG,CAAC,EAAG,CAACyH,EAAIzH,EAAG,CAAC,EAAG,CAACyH,EAAGzH,CAAC,EAAG,CAACyH,EAAGzC,EAAIhF,CAAC,EAAG,CAACyH,EAAIzH,EAAGgF,CAAC,EAAG,CAAChF,EAAGgF,CAAC,EAAG,CAAC,EAAGA,EAAIhF,CAAC,EAAG,CAAC,EAAGA,CAAC,CAAC,GAAGsC,EAAIJ,EAAE,MAAO,KAAK,CAAC,EAC1I,MAAO,CAACuF,EAAGzC,IAAMsC,EAAK,GAAG,MAAM,KAAK,CAAE,OAAQ,EAAG,EAAG,CAACK,EAAG3F,KAAO,CAACwC,EAAGyC,IAAM,CAACQ,EAAI,EAAKA,EAAI,EAAKjD,EAAI,KAAK,IAAIyC,CAAC,EAAGjC,EAAI,EAAKA,EAAI,EAAKR,EAAI,KAAK,IAAIyC,CAAC,CAAC,GAAGjF,EAAI,EAAI,KAAQ,EAAG,CAAC,KAAK,GAAK,EAAKA,EAAI,KAAK,GAAM,CAAC,CAAC,CAAC,EACtM,KAAM,CAACyF,EAAGzC,IAAM,QAAQ3H,EAAEoK,CAAC,CAAC,IAAIpK,EAAE2H,CAAC,CAAC,GACpC,eAAgB,CAACyC,EAAGzC,IAAM,QAAQ3H,EAAEoK,CAAC,CAAC,IAAIpK,EAAE2H,CAAC,CAAC,GAC9C,eAAgB,CAACyC,EAAGzC,EAAG9C,IAAM,QAAQ7E,EAAEoK,EAAIvF,EAAE,OAAQ,GAAK,CAAC,CAAC,IAAI7E,EAAE2H,CAAC,CAAC,IAAI3H,EAAEoK,CAAC,CAAC,GAC5E,iBAAkB,CAACA,EAAGzC,EAAG9C,KAAQlC,GAAM,QAAQ3C,EAAE2C,CAAC,CAAC,MAAM3C,EAAE2C,CAAC,CAAC,IAAI3C,EAAE2H,CAAC,CAAC,IAAI3H,EAAEoK,CAAC,CAAC,IAAIpK,EAAE2H,CAAC,CAAC,IAAIyC,EAAIvF,EAAE,OAAQ,GAAK,CAAC,CAC/G,EACA,OAAO,OAAOwF,EAAQ,CAAE,mBAAoBA,EAAO,KAAM,iBAAkBA,EAAO,KAAM,0BAA2BA,EAAO,UAAW,kBAAmBA,EAAO,QAAS,mBAAoBA,EAAO,OAAQ,CAAC,EAE5M,IAAME,GAAQ,IAAI,IAAI,CAAC,OAAQ,qBAAsB,iBAAkB,iBAAkB,kBAAkB,CAAC,EAEtGC,GAAkD,CAAE,KAAM,CAAC,EAAG,CAAC,EAAG,QAAS,CAAC,EAAG,CAAC,EAAG,IAAK,CAAC,EAAG,CAAC,EAAG,OAAQ,CAAC,EAAG,CAAC,EAAG,OAAQ,CAAC,EAAG,CAAC,EAAG,QAAS,CAAC,EAAG,EAAG,EAAG,CAAC,EAAG,UAAW,CAAC,EAAG,EAAG,EAAG,CAAC,EAAG,aAAc,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAAG,WAAY,CAAC,EAAG,EAAG,EAAG,CAAC,EAAG,cAAe,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,CAAE,EAOpR,SAASC,GAAUC,EAAMN,EAAGzC,EAAG,CAC7B,IAAMgD,EAAS/D,EAAM8D,EAAM,YAAY,EACvC,GAAIC,EACF,OAAO3H,EAAS4D,EAAM+D,EAAO,MAAO,WAAW,GAAG,KAAK,EAAE,OAAQ3J,GAASA,EAAK,OAAS,QAAQ,EAAE,QAASA,GAAS,CAClH,IAAM4J,EAAK,OAAOrK,EAAKS,EAAK,IAAK,GAAG,GAAK,CAAC,EAAGgD,EAAK,OAAOzD,EAAKS,EAAK,IAAK,GAAG,GAAK,CAAC,EAAG6J,EAAKD,EAAKR,EAAIQ,EAAK,EAAInL,EAAKqL,EAAK9G,EAAK2D,EAAI3D,EAAK,EAAIvE,EACnI+H,EAAI,GAAIzH,EAAK,CAAC,EAAG,CAAC,EACtB,QAAWgL,KAAQ/H,EAAShC,EAAK,KAAK,EAAG,CACvC,IAAMkJ,EAASlH,EAAS+H,EAAK,KAAK,EAAE,OAAQC,GAAOA,EAAG,OAAS,MAAM,EAAE,IAAKA,GAAO,CAAC,OAAOzK,EAAKyK,EAAG,IAAK,GAAG,CAAC,EAAIH,EAAI,OAAOtK,EAAKyK,EAAG,IAAK,GAAG,CAAC,EAAIF,CAAE,CAAC,EAC7IG,EAAKf,EAAO,IAAI,CAAC,CAACvH,EAAGC,CAAC,IAAM,GAAG5C,EAAE2C,CAAC,CAAC,IAAI3C,EAAE4C,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,EAC7D,GAAImI,EAAK,OAAS,WAAYvD,GAAK,IAAIyD,CAAE,WAChCF,EAAK,OAAS,SAAUvD,GAAK,IAAIyD,CAAE,WACnCF,EAAK,OAAS,eAAgBvD,GAAK,IAAIyD,CAAE,WACzCF,EAAK,OAAS,cAAevD,GAAK,IAAIyD,CAAE,WACxCF,EAAK,OAAS,UAAWvD,GAAK,YAC9BuD,EAAK,OAAS,UAAW,CAEhC,GAAM,CAACG,EAAIC,CAAE,EAAI,CAAC,OAAO5K,EAAKwK,EAAK,IAAK,IAAI,GAAK,CAAC,EAAIF,EAAI,OAAOtK,EAAKwK,EAAK,IAAK,IAAI,GAAK,CAAC,EAAID,CAAE,EAAG,CAACzK,EAAO+K,CAAK,EAAI,CAAC,QAAS,OAAO,EAAE,IAAK1J,GAAS,OAAOnB,EAAKwK,EAAK,IAAKrJ,CAAG,GAAK,CAAC,EAAI,KAAU,KAAK,GAAK,IAAI,EAC1M7B,EAAM,CAACE,EAAG,CAAC,EAAImL,EAAK,KAAK,IAAI7K,CAAK,EAAI6K,EAAK,KAAK,IAAI7K,EAAQ+K,CAAK,EAAGrL,EAAG,CAAC,EAAIoL,EAAK,KAAK,IAAI9K,CAAK,EAAI8K,EAAK,KAAK,IAAI9K,EAAQ+K,CAAK,CAAC,EACrI5D,GAAK,IAAIxH,EAAEkL,CAAE,CAAC,IAAIlL,EAAEmL,CAAE,CAAC,MAAM,KAAK,IAAIC,CAAK,EAAI,KAAK,GAAK,EAAI,CAAC,IAAIA,EAAQ,EAAI,EAAI,CAAC,IAAIpL,EAAEH,EAAI,CAAC,CAAC,CAAC,IAAIG,EAAEH,EAAI,CAAC,CAAC,CAAC,GAC7GE,EAAKF,CACP,CACIqK,EAAO,SAAQnK,EAAKmK,EAAOA,EAAO,OAAS,CAAC,EAClD,CACA,OAAO1C,GAAK,CAACA,EAAE,SAAS,KAAK,EAAI,CAAC,CAAE,EAAAA,EAAG,KAAMjH,EAAKS,EAAK,IAAK,MAAM,IAAM,OAAQ,OAAQ,CAAC,cAAc,KAAKT,EAAKS,EAAK,IAAK,QAAQ,GAAK,EAAE,CAAE,CAAC,EAAI,CAAC,CACpJ,CAAC,EAEH,IAAMqK,EAASzE,EAAM8D,EAAM,YAAY,EACvC,GAAI,CAACW,EAAQ,OAAO,KACpB,IAAMC,EAAO/K,EAAK8K,EAAO,IAAK,MAAM,GAAK,GAAIE,EAAQ,OAAO,YAAYvI,EAAS4D,EAAMyE,EAAO,MAAO,SAAS,GAAG,KAAK,EAAE,IAAKG,GAAO,CAACjL,EAAKiL,EAAG,IAAK,MAAM,EAAG,OAAO,kBAAkB,KAAKjL,EAAKiL,EAAG,IAAK,MAAM,GAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EACtNhE,EAAI6C,EAAOiB,CAAI,IAAIlB,EAAGzC,EAAG,CAACxH,EAAMsL,KAAc,OAAO,SAASF,EAAMpL,CAAI,CAAC,EAAIoL,EAAMpL,CAAI,EAAIsL,GAAY,IAAQ,KAAK,IAAIrB,EAAGzC,CAAC,CAAC,EACnI,OAAOH,EAAI,CAAC,CAAE,EAAAA,EAAG,KAAM,CAAC+C,GAAM,IAAIe,CAAI,EAAG,OAAQ,EAAK,CAAC,EAAI,MAC7D,CAMA,SAASI,GAAQC,EAAM,CACrB,IAAM9I,EAAM+D,EAAM+E,GAAM,MAAO,OAAO,EAAG1H,EAAM2C,EAAM+E,GAAM,MAAO,OAAO,EACzE,GAAI,CAACA,GAAQ,CAAC9I,GAAO,CAACoB,EAAK,OAAO,KAClC,GAAM,CAACtB,EAAGC,EAAGwH,EAAGzC,CAAC,EAAI,CAACpH,EAAKsC,EAAI,IAAK,GAAG,EAAGtC,EAAKsC,EAAI,IAAK,GAAG,EAAGtC,EAAK0D,EAAI,IAAK,IAAI,EAAG1D,EAAK0D,EAAI,IAAK,IAAI,CAAC,EAAE,IAAKgD,GAAM,OAAOA,GAAK,CAAC,EAAIxH,CAAG,EACjImM,EAAO,OAAOrL,EAAKoL,EAAK,IAAK,KAAK,GAAK,CAAC,EAAI,IAAO,CAACE,EAAIC,CAAE,EAAI,CAAC,QAAS,OAAO,EAAE,IAAKpK,GAAQ,aAAa,KAAKnB,EAAKoL,EAAK,IAAKjK,CAAG,GAAK,EAAE,CAAC,EAChJ,MAAO,CAAE,EAAAiB,EAAG,EAAAC,EAAG,EAAAwH,EAAG,EAAAzC,EAAG,KAAM,aAAa3H,EAAE2C,CAAC,CAAC,IAAI3C,EAAE4C,CAAC,CAAC,IAAIgJ,EAAO,WAAW5L,EAAE4L,CAAI,CAAC,IAAI5L,EAAEoK,EAAI,CAAC,CAAC,IAAIpK,EAAE2H,EAAI,CAAC,CAAC,IAAM,EAAE,GAAI,KAAMkE,GAAMC,EAAK,WAAWD,EAAK,GAAK,CAAC,QAAQC,EAAK,GAAK,CAAC,IAAID,EAAK7L,EAAEoK,CAAC,EAAI,CAAC,IAAI0B,EAAK9L,EAAE2H,CAAC,EAAI,CAAC,IAAM,EAAG,CAC5N,CAGA,eAAeoE,GAAOrB,EAAMsB,EAAO/I,EAAK,CACtC,IAAMkC,EAAM,MAAMkE,EAAQqB,EAAM,OAAQzH,CAAG,EAAGgJ,EAAMrF,EAAMoF,EAAO,WAAW,EAAGE,EAAM,OAAO3L,EAAK0L,GAAK,KAAO,GAAI,KAAK,GAAK,CAAC,EACtHE,EAASD,EAAM,IAAOjJ,EAAI,OAAO,GAAGiJ,EAAM,IAAI,EAAIA,EAAMjJ,EAAI,OAAO,KAAKiJ,EAAM,CAAC,EAAI,OACzF,OAAO/G,IAAQgH,GAAUF,GAAO,MAAM5C,EAAQ8C,EAAQ,OAAQ,CAAE,GAAGlJ,EAAK,KAAMA,EAAI,SAAU,EAAGgF,EAASgE,EAAI,MAAOhJ,CAAG,CAAC,IAAM,aAC/H,CAGA,eAAemJ,GAAS1B,EAAMsB,EAAO/I,EAAK,CACxC,IAAMoJ,EAAKzF,EAAM8D,EAAM,MAAM,EAAGuB,EAAMrF,EAAMoF,EAAO,SAAS,EAAGE,EAAM,OAAO3L,EAAK0L,GAAK,KAAO,GAAI,KAAK,GAAK,CAAC,EAAGE,EAASD,EAAMlJ,EAASC,EAAI,OAAO,KAAKiJ,EAAM,CAAC,GAAK,EAAE,EAAE,CAAC,EAAI,OACtKI,GAASD,GAAM,MAAMhD,EAAQgD,EAAG,MAAO,SAAUpJ,CAAG,KAAOkJ,GAAUF,GAAO,MAAM5C,EAAQ8C,EAAO,MAAO,SAAUlJ,EAAKgF,EAASgE,EAAI,MAAOhJ,CAAG,CAAC,GACrJ,GAAI,CAACqJ,GAASA,IAAU,gBAAiB,MAAO,GAChD,IAAMC,EAAQ,OAAOhM,EAAK8L,GAAI,KAAO,GAAI,GAAG,GAAK9L,EAAK4L,GAAQ,KAAO,GAAI,GAAG,GAAK,IAAI,EAAI1M,EAAK+M,EAAOhC,GAAOjK,EAAKqG,EAAMyF,GAAI,MAAO,YAAY,GAAG,KAAOzF,EAAMuF,GAAQ,MAAO,YAAY,GAAG,KAAO,GAAI,KAAK,GAAK,EAAE,EACnN,MAAO,IAAIG,CAAK,kBAAkBtM,EAAEuM,CAAK,CAAC,IAAIC,EAAO,sBAAsBA,EAAK,IAAK5L,GAAQZ,EAAEY,EAAM2L,CAAK,CAAC,EAAE,KAAK,GAAG,CAAC,IAAM,EAAE,EAChI,CAQA,SAASE,GAAQC,EAAQtC,EAAGzC,EAAGqE,EAAO/I,EAAK,CACzC,IAAM0J,EAAS/F,EAAM8F,EAAQ,UAAU,EAAGE,EAAQ,CAAuBlL,EAA2B+J,IAAa,OAAOlL,EAAKoM,GAAQ,KAAO,GAAIjL,CAAG,GAAK+J,CAAQ,EAAIhM,EAC9J,CAACmI,EAAGgC,EAAGzC,EAAGrC,CAAC,EAAI,CAAC8H,EAAM,OAAQ,KAAK,EAAGA,EAAM,OAAQ,KAAK,EAAGA,EAAM,OAAQ,KAAK,EAAGA,EAAM,OAAQ,KAAK,CAAC,EAAGC,EAAQtM,EAAKoM,GAAQ,KAAO,GAAI,MAAM,IAAM,OACrJG,EAAQ,OAAOvM,EAAKqG,EAAM+F,GAAQ,MAAO,eAAe,GAAG,KAAO,GAAI,WAAW,GAAK,GAAM,EAAI,IAAQI,EAAQnG,EAAMA,EAAM8F,EAAQ,YAAY,GAAG,MAAO,WAAW,EAAGnB,EAAQ3E,EAAMmG,GAAO,MAAO,UAAU,EAC9MC,EAAUpG,EAAMoF,EAAO,WAAW,EAAGnI,GAAOmJ,GAAW/E,EAAS+E,EAAQ,MAAO/J,CAAG,IAAM,CAAE,IAAKA,EAAI,OAAOA,EAAI,IAAI,KAAO,KAAK,GAAK,CAAC,EAAG,EAAG,CAAC,EAAG,MAAO,CAAE,EACvJgK,EAAuI,CAAC,EAC9I,QAAWpF,KAAK7E,EAAS0J,CAAM,EAAE,OAAQ9L,GAAQA,EAAI,OAAS,KAAK,EAAG,CACpE,IAAMsM,EAAOlK,EAAS6E,EAAE,KAAK,EAAE,OAAQjH,GAAQA,EAAI,OAAS,OAASA,EAAI,OAAS,MAAM,EAAGuM,EAAMvG,EAAMsG,EAAK,KAAMtM,GAAQA,EAAI,OAAS,KAAK,GAAG,MAAO,OAAO,GAAKgG,EAAMiB,EAAE,MAAO,cAAc,EACzL1C,EAA6BzD,GAAQnB,EAAK4M,GAAK,KAAO,GAAIzL,CAAG,GAAKnB,EAAKgL,GAAO,KAAO,GAAI7J,CAAG,EAC5FxB,EAAQ,OAAOiF,EAAI,IAAI,GAAK,IAAI,EAAI,IAAO2H,EAAO1G,EAAQ7F,EAAKqG,EAAMiB,EAAE,MAAO,OAAO,GAAG,KAAO,GAAI,MAAM,GAAKtH,EAAKwM,GAAO,KAAO,GAAI,MAAM,GAAK,IAChJxD,EAAStB,EAASrB,EAAMuG,GAAK,MAAO,aAAa,GAAG,OAAS,GAAIlK,CAAG,GAAKgF,EAASrB,EAAM2E,GAAO,MAAO,aAAa,GAAG,OAAS,GAAItI,CAAG,GAAKY,EAC3IuJ,EAAW7M,EAAKqG,EAAMuG,GAAK,MAAO,SAAS,GAAG,KAAO,GAAI,UAAU,GAAK,SAAUpL,EAAOqL,EAAS,WAAW,KAAK,EAAInK,EAAI,MAAM,MAAQmK,EAAS,WAAW,GAAG,EAAInK,EAAI,MAAM,MAAQmK,EACrLrM,EAAOmM,EAAK,IAAKtM,GAASA,EAAI,OAAS,OAAS;AAAA,EAAO,qCAAqC,KAAKA,EAAI,KAAK,IAAI,CAAC,GAAK,EAAG,EAAE,KAAK,EAAE,EACnI,QAAQ,qBAAsB,CAACyM,EAAMC,IAAWA,IAAWnI,EAAI,KAAK,IAAM,MAAQkI,EAAK,kBAAkB,EAAIA,EAAK,EAC/GE,EAAO,KAAK,IAAI,EAAG,KAAK,OAAOnD,EAAIxC,EAAIT,IAAMjH,GAAQiF,EAAI,GAAG,IAAM,IAAM,GAAM,KAAM,CAAC,EAC3F,QAAWqI,KAAQzM,EAAK,MAAM;AAAA,CAAI,EAAG,CAEnC,IAAM0M,EAA8BhI,GAAUA,EAAM,QAAQ,aAAc,GAAG,EAAE,QAAU8H,EACnFG,EAAUb,EAAiBW,EAAK,MAAM,GAAG,EAAE,OAAO,CAAyBG,EAAMC,IAAUD,EAAK,QAAUF,EAAK,GAAGE,EAAKA,EAAK,OAAS,CAAC,CAAC,IAAIC,CAAI,EAAE,EAAI,CAAC,GAAGD,EAAK,MAAM,EAAG,EAAE,EAAG,GAAGA,EAAKA,EAAK,OAAS,CAAC,CAAC,IAAIC,CAAI,EAAE,EAAI,CAAC,GAAGD,EAAMC,CAAI,EAAI,CAAC,CAAC,EAApN,CAACJ,CAAI,EAC7B,QAAW/H,KAASiI,EAAO,OAASA,EAAS,CAAC,EAAE,EAAGT,EAAM,KAAK,CAAE,MAAAxH,EAAO,KAAAvF,EAAM,MAAAkG,EAAO,OAAAmD,EAAQ,KAAAxH,EAAM,KAAMoD,EAAI,GAAG,IAAM,IAAK,OAAQA,EAAI,GAAG,IAAM,GAAI,CAAC,CACtJ,CACF,CACA,IAAM0I,EAAOZ,EAAM,OAAO,CAACa,EAAKN,IAASM,EAAMN,EAAK,KAAO,IAAK,CAAC,EAAGO,EAASxN,EAAKoM,GAAQ,KAAO,GAAI,QAAQ,GAAK,IAC9GqB,EAAMD,IAAW,MAAQnE,GAAKjC,EAAIiC,EAAI9E,EAAI+I,GAAQ,EAAIE,IAAW,IAAMpG,EAAI7C,EAAI+I,EAAOjE,EAC1F,OAAOqD,EAAM,IAAKO,GAAS,CACzB,IAAM5K,EAAIoL,EAAMR,EAAK,KAAO,IAAM,CAAC7K,EAAG5C,CAAE,EAAIyN,EAAK,QAAU,MAAQ,CAAC5F,GAAKwC,EAAIxC,EAAIT,GAAK,EAAG,QAAQ,EAAIqG,EAAK,QAAU,IAAM,CAACpD,EAAIjD,EAAG,KAAK,EAAI,CAACS,EAAG,OAAO,EACtJ,OAAAoG,GAAOR,EAAK,KAAO,IACZA,EAAK,MAAM,KAAK,EAAI,YAAYxN,EAAE2C,CAAC,CAAC,QAAQ3C,EAAE4C,CAAC,CAAC,gBAAgB5C,EAAEwN,EAAK,IAAI,CAAC,kBAAkB,CAACA,EAAK,KAAK,QAAQ,WAAY,EAAE,EAAG,gBAAiB,YAAa,YAAY,EAAE,OAAO,OAAO,EAAE,IAAK5M,GAAS,KAAK,KAAKA,CAAG,EAAI,IAAIA,CAAG,IAAMA,CAAI,EAAE,KAAK,IAAI,CAAC,WAC/P+E,GAAM6H,EAAK,OAAO,GAAG,CAAC,IAAIA,EAAK,OAAO,MAAQ,EAAI,kBAAkBxN,EAAEwN,EAAK,OAAO,KAAK,CAAC,IAAM,EAAE,GAAGzN,IAAO,QAAU,GAAK,iBAAiBA,CAAE,GAAG,GAAGyN,EAAK,KAAO,sBAAwB,EAAE,GAAGA,EAAK,OAAS,uBAAyB,EAAE,yBAAyBA,EAAK,KAAK,UAAY,EACvR,CAAC,EAAE,KAAK,EAAE,CACZ,CAGA,eAAeS,GAAQzN,EAAKyC,EAAK,CAC/B,GAAI,UAAU,MAAM2D,EAAMpG,EAAK,UAAU,GAAKoG,EAAMpG,EAAK,aAAa,IAAI,OAAS,EAAE,EAAG,MAAO,GAC/F,IAAMkK,EAAO9D,EAAMpG,EAAK,QAAQ,GAAG,OAAS,GAAIwL,EAAQpF,EAAMpG,EAAK,SAAS,GAAG,OAAS,GAAIT,EAAK2L,GAAQ9E,EAAM8D,EAAM,QAAQ,CAAC,EAAGvF,EAAM,CAAE,GAAGlC,EAAK,KAA+B,CAAC,CAAG,EACpL,GAAI,CAAClD,EAAI,MAAO,GAChB,IAAM6E,EAAQ6F,GAAUC,EAAM3K,EAAG,EAAGA,EAAG,CAAC,EACpC6E,IAAU,QAAWO,EAAI,MAAM,IAAI,aAAa5E,EAAKqG,EAAM8D,EAAM,YAAY,GAAG,KAAO,GAAI,MAAM,CAAC,cAAc,EACpH,IAAMwD,EAAOtJ,GAAO,KAAMhE,GAAQA,EAAI,IAAI,EAAI,MAAMmL,GAAOrB,EAAMsB,EAAO7G,CAAG,EAAI,cAAegJ,EAASvJ,GAAO,KAAMhE,GAAQA,EAAI,MAAM,EAAI,MAAMwL,GAAS1B,EAAMsB,EAAO7G,CAAG,EAAI,GACvKb,GAASM,GAAS,CAAC,GAAG,OAAQhE,GAASA,EAAI,MAAQsN,IAAS,eAAmBtN,EAAI,QAAUuN,CAAO,EAAE,IAAKvN,GAAQ,YAAYA,EAAI,CAAC,KAAKA,EAAI,KAAOsN,EAAO,aAAa,GAAGtN,EAAI,OAASuN,EAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAChN1I,EAAQgH,GAAQ7F,EAAMpG,EAAK,UAAU,GAAG,OAAS,GAAIT,EAAG,EAAGA,EAAG,EAAGiM,EAAO7G,CAAG,EACjF,MAAO,GAAGA,EAAI,KAAK,KAAK,EAAE,CAAC,GAAGb,EAAQ,iBAAiBvE,EAAG,IAAI,GAAGA,EAAG,IAAI,KAAKuE,CAAK,OAAS,EAAE,GAAGmB,EAAQ,iBAAiB1F,EAAG,IAAI,KAAK0F,CAAK,OAAS,EAAE,EACvJ,CAGA,eAAe2I,GAAU5N,EAAKyC,EAAK,CACjC,GAAI,UAAU,KAAK2D,EAAMpG,EAAK,WAAW,GAAG,OAAS,EAAE,EAAG,MAAO,GACjE,IAAM0N,EAAOtH,EAAMpG,EAAK,YAAY,GAAG,OAAS,GAAIqI,EAAOjC,EAAMsH,EAAM,QAAQ,EAAGxD,EAAO9D,EAAMpG,EAAK,QAAQ,GAAG,OAAS,GAAIT,EAAK2L,GAAQ9E,EAAM8D,EAAM,QAAQ,CAAC,EAExJhH,EAAM,0CAA0C,KAAKmF,GAAM,OAAS,EAAE,IAAI,CAAC,EAAGF,EAAQjF,GAAO,MAAM6E,GAAO7E,EAAKT,CAAG,GAAM,MAAMsF,GAAOhI,EAAKsI,GAAM,KAAO,GAAI,SAAS,EAAG5F,CAAG,EAChL,GAAI,CAAClD,GAAM,CAAC4I,EAAM,MAAO,GACzB,IAAM0F,EAAOzH,EAAMsH,EAAM,WAAW,GAAG,KAAO,GAAI,CAACtG,EAAGgC,EAAGzC,EAAGrC,CAAC,EAAI,CAAC,IAAK,IAAK,IAAK,GAAG,EAAE,IAAKpD,GAAQ,OAAOnB,EAAK8N,EAAM3M,CAAG,GAAK,CAAC,EAAI,GAAM,EAAG0I,EAAIrK,EAAG,GAAK,EAAI6H,EAAIT,GAAK,GAAIQ,EAAI5H,EAAG,GAAK,EAAI6J,EAAI9E,GAAK,GAC3LkF,EAASzJ,EAAKqG,EAAMiC,GAAM,MAAO,eAAe,GAAG,KAAO,GAAI,KAAK,EAAGyF,EAAU7D,GAAUC,EAAM3K,EAAG,EAAGA,EAAG,CAAC,IAAI,CAAC,EAAGyI,EAAK8F,GAAW,CAAC,gBAAgB,KAAK5D,CAAI,EAAI,IAAI,EAAEzH,EAAI,IAAI,CAAC,GAAK,GACpLkC,EAAM,CAAE,GAAGlC,EAAK,KAA+B,CAAC,CAAG,EAAGkL,EAASG,EAAU,MAAMlC,GAAS1B,EAAM9D,EAAMpG,EAAK,SAAS,GAAG,OAAS,GAAI2E,CAAG,EAAI,GAAIoJ,EAAS3F,GAASC,GAAM,OAAS,GAAI1D,CAAG,EAC3L,MAAO,GAAGA,EAAI,KAAK,KAAK,EAAE,CAAC,iBAAiBpF,EAAG,IAAI,GAAGA,EAAG,IAAI,IAAIiK,EAAS,aAAahK,EAAE,OAAOgK,CAAM,EAAI,GAAM,CAAC,IAAM,EAAE,IAAIxB,EAAK,iBAAiBA,CAAE,cAAc8F,GAAS,CAAC,oCAAoC9F,CAAE,MAAQ,KAAK,eAC9NxI,EAAED,EAAG,CAAC,CAAC,aAAaC,EAAED,EAAG,CAAC,CAAC,eAAeC,EAAE,CAAC4H,EAAIwC,CAAC,CAAC,QAAQpK,EAAE,CAAC4J,EAAIjC,CAAC,CAAC,YAAY3H,EAAEoK,CAAC,CAAC,aAAapK,EAAE2H,CAAC,CAAC,+BAA+B4G,CAAM,gBAAgB5F,CAAI,gBAAgBwF,EAAS,YAAYG,GAAS,CAAC,gBAAgBH,CAAM,KAAO,EAAE,MAChP,CAGA,eAAeK,GAAQhO,EAAKyC,EAAK,CAC/B,IAAMwL,EAAK7H,EAAMpG,EAAK,WAAW,GAAG,OAAS,GAAImL,EAAO/E,EAAM6H,EAAI,QAAQ,EAAG1O,EAAK2L,GAAQC,CAAI,EAAGxG,EAAM,CAAE,GAAGlC,EAAK,KAA+B,CAAC,CAAG,EAC9I,CAAC1B,EAAIC,EAAIkN,EAAIC,CAAE,EAAI,CAACpO,EAAKqG,EAAM+E,GAAM,MAAO,SAAS,GAAG,KAAO,GAAI,GAAG,EAAGpL,EAAKqG,EAAM+E,GAAM,MAAO,SAAS,GAAG,KAAO,GAAI,GAAG,EAAGpL,EAAKqG,EAAM+E,GAAM,MAAO,SAAS,GAAG,KAAO,GAAI,IAAI,EAAGpL,EAAKqG,EAAM+E,GAAM,MAAO,SAAS,GAAG,KAAO,GAAI,IAAI,CAAC,EAAE,IAAK1E,GAAM,OAAOA,GAAK,CAAC,EAAIxH,CAAG,EACzQmP,EAAQ,MAAMpL,GAAShD,EAAK,CAAE,GAAG2E,EAAK,MAAO,MAAMkE,EAAQoF,EAAI,OAAQtJ,CAAG,CAAE,CAAC,EACnF,OAAKyJ,EACE,GAAGzJ,EAAI,KAAK,KAAK,EAAE,CAAC,KAAKpF,EAAK,eAAeA,EAAG,IAAI,GAAGA,EAAG,IAAI,UAAUC,EAAE0O,EAAK3O,EAAG,EAAI2O,EAAK,CAAC,CAAC,IAAI1O,EAAE2O,EAAK5O,EAAG,EAAI4O,EAAK,CAAC,CAAC,eAAe3O,EAAE,CAACuB,CAAE,CAAC,IAAIvB,EAAE,CAACwB,CAAE,CAAC,KAAO,EAAE,IAAIoN,CAAK,OAD3J,EAErB,CAGA,eAAepL,GAAShD,EAAKyC,EAAK,CAChC,IAAIuD,EAAM,GACV,QAAW5F,KAAOoC,EAASxC,CAAG,EACxBI,EAAI,OAAS,sBAAuB4F,GAAO,MAAMhD,IAAUoD,EAAMhG,EAAI,MAAO,aAAa,GAAKgG,EAAMhG,EAAI,MAAO,WAAW,IAAI,OAAS,GAAIqC,CAAG,EACzIrC,EAAI,OAAS,QAAUA,EAAI,OAAS,UAAW4F,GAAO,MAAMyH,GAAQrN,EAAI,MAAOqC,CAAG,EAClFrC,EAAI,OAAS,QAAS4F,GAAO,MAAM4H,GAAUxN,EAAI,MAAOqC,CAAG,EAC3DrC,EAAI,OAAS,YAAW4F,GAAO,MAAMgI,GAAQ5N,EAAI,MAAOqC,CAAG,GAEtE,OAAOuD,CACT,CAMA,eAAelB,GAAOuJ,EAAI5L,EAAK,CAC7B,IAAMwL,EAAK7H,EAAMiI,EAAI,QAAQ,EAAG5C,EAAMrF,EAAMiI,EAAI,SAAS,EAAG3C,EAAM,OAAO3L,EAAK0L,GAAK,KAAO,GAAI,KAAK,GAAK,CAAC,EAAG9G,EAAM,CAAE,GAAGlC,EAAK,KAA+B,CAAC,CAAG,EAEzJiL,EAAOO,GAAI,QAAUvC,EAAM,IAAOjJ,EAAI,OAAO,GAAGiJ,EAAM,IAAI,EAAIA,EAAMjJ,EAAI,OAAO,KAAKiJ,EAAM,CAAC,EAAI,UAAeD,EAAM,wDAA0D,IAAKjI,EAAKiI,EAAMhE,EAASgE,EAAI,MAAOhJ,CAAG,EAAI,KACzN6L,EAAQlI,EAAMsH,EAAM,aAAa,EAAGrH,EAAMiI,EAAQ7G,EAAS6G,EAAM,MAAO7L,EAAKe,CAAE,GAAG,KAAO,KAAO6K,EAAK,KAAO5L,EAAI,OAAO,KAAO,CAAC,IAAK,IAAK,GAAG,EAC5IqJ,EAAS,MAAMjD,EAAQ6E,EAAM,OAAQO,EAAKtJ,EAAM,CAAE,GAAGA,EAAK,KAAMlC,EAAI,SAAU,EAAGe,CAAE,IAAO6C,EAAM,SAASlB,GAAMkB,CAAG,CAAC,IAAM,QAC/H,MAAO,CAAE,IAAAA,EAAK,IAAKyF,GAASA,IAAU,cAAgB,GAAGnH,EAAI,KAAK,KAAK,EAAE,CAAC,gBAAgBnF,EAAEiD,EAAI,KAAK,CAAC,CAAC,CAAC,aAAajD,EAAEiD,EAAI,KAAK,CAAC,CAAC,CAAC,KAAKqJ,CAAK,KAAO,EAAG,CACzJ,CAMA,SAASjG,GAAU7F,EAAKW,EAAW4N,EAAS,CAC1C,IAAMhK,EAA+B/C,GAAS+M,EAAQ,KAAK,iCAAiC,KAAK,CAAC,GAAG/M,EAAK,SAAS,yBAAyB,CAAC,EAAE,KAAK,CAAC,CAAC+B,CAAE,IAAM,sCAAsC,KAAKA,CAAE,CAAC,IAAI,CAAC,GAAK,EAAE,IAAI,CAAC,GAAK,EAAE,IAAI,CAAC,EACzO,OAAOgB,EAAMvE,CAAG,GAAKuE,EAAM5D,CAAS,GAAK4N,EAAQ,KAAK,yCAAyC,KAAK5N,CAAS,IAAI,CAAC,GAAK,EAAE,IAAI,CAAC,CAChI,CAGA,SAASuE,GAAQlF,EAAKW,EAAW8B,EAAK,CACpC,IAAMiL,EAAO7H,GAAU7F,EAAKW,EAAW,wCAAwC,EAC/E,OAAQ+M,GAAQjG,EAASiG,EAAMjL,CAAG,GAAG,MAAQA,EAAI,OAAOA,EAAI,IAAI,KAAO,KAAK,GAAK,IACnF,CAMA,IAAMwB,GAAQ,CAACH,EAAO,CAAC8F,EAAGzC,CAAC,IAAM,sBAAsB,mBAAmB,6FAA6F3H,EAAEoK,CAAC,CAAC,aAAapK,EAAE2H,CAAC,CAAC,kBAAkB3H,EAAEoK,CAAC,CAAC,IAAIpK,EAAE2H,CAAC,CAAC,gCAAgCrD,CAAK,QAAQ,EACpQ,QAAQ,OAAQ,GAAG,EAAE,QAAQ,OAAQ,GAAG,EAAE,QAAQ,OAAQ,GAAG,CAAC,GAQjE,SAAS2B,GAAOjB,EAAOzD,EAAIC,EAAIwN,EAAQ,GAAO,CAC5C,IAAMC,EAA2CrO,GAAQ,CAAC,QAAS,WAAY,UAAU,EAAE,SAASA,EAAI,IAAI,EACtGsO,EAA+CtO,GAAiCA,EAAI,IACpFuO,EAAS,CAAyBtK,EAA2BC,IAAM,KAAK,IAAID,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,EAAIvD,EAAK,KAAQ,KAAK,IAAIsD,EAAE,CAAC,EAAIC,EAAE,CAAC,CAAC,EAAIvD,EAAK,KAAQsD,EAAE,CAAC,EAAIC,EAAE,CAAC,EACvJ7C,EAAU+C,EAAM,OAAOiK,CAAO,EAAG9J,EAAuCvE,GAAQ,gCAAgC,KAAKA,EAAI,IAAI,IAAI,CAAC,EAClIwO,EAASpK,EAAM,OAAQpE,GAAQ,CAACqO,EAAQrO,CAAG,CAAC,EAAE,KAAK,CAACiE,EAAGC,IAAMoK,EAAIrK,CAAC,EAAE,CAAC,EAAIqK,EAAIpK,CAAC,EAAE,CAAC,GAAKoK,EAAIrK,CAAC,EAAE,CAAC,EAAIqK,EAAIpK,CAAC,EAAE,CAAC,CAAC,EAE3GS,EAAStD,EAAQ,OAAqBmN,EAAO,SAAW,GAAK,CAACjK,EAAIiK,EAAO,CAAC,CAAC,GAAKF,EAAIE,EAAO,CAAC,CAAC,EAAE,CAAC,GAAKF,EAAIjN,EAAQ,CAAC,CAAC,EAAE,CAAC,EAAImN,EAAO,CAAC,EAAIA,EAAO,KAAMxO,GAAQuE,EAAIvE,CAAG,IAAM,WAAc,CAACuE,EAAIvE,CAAG,GAAKuO,EAAOD,EAAItO,CAAG,EAAGsO,EAAIjN,EAAQ,CAAC,CAAC,CAAC,CAAE,EAA3M,OAC1BoN,EAAS9J,EAAQ,CAAC,GAAGtD,EAASsD,CAAK,EAAItD,EAASqN,EAASF,EAAO,OAAQxO,GAAQA,IAAQ2E,CAAK,EAC7FgK,EAAmCxM,GAAUA,EAAK,QAAU,CAACyM,EAAIC,EAAIC,EAAIC,IAAO,CAACH,EAAIC,EAAIC,EAAKF,EAAIG,EAAKF,CAAE,GAAG,KAAK,IAAI,GAAG1M,EAAK,IAAK+B,GAAMA,EAAE,CAAC,CAAC,CAAC,EAAG,KAAK,IAAI,GAAG/B,EAAK,IAAK+B,GAAMA,EAAE,CAAC,CAAC,CAAC,EACrL,KAAK,IAAI,GAAG/B,EAAK,IAAK+B,GAAMA,EAAE,CAAC,EAAIA,EAAE,CAAC,CAAC,CAAC,EAAG,KAAK,IAAI,GAAG/B,EAAK,IAAK+B,GAAMA,EAAE,CAAC,EAAIA,EAAE,CAAC,CAAC,CAAC,CAAC,EAAI,KAEpF8K,EAAOP,EAAO,OAASC,EAASA,EAAO,MAAM,CAAC,EAC9CO,EAAQR,EAAO,OAAkCE,EAAMF,EAAO,IAAIH,CAAG,CAAC,EAAKI,EAAO,OAASJ,EAAII,EAAO,CAAC,CAAC,EAAI,CAAC,EAAG,EAAG/N,EAAIC,CAAE,EACzHsO,EAAOF,EAAK,MAAM,CAAChP,EAAK+D,IAAM,CAACA,GAAKuK,EAAItO,CAAG,EAAE,CAAC,IAAMsO,EAAIU,EAAKjL,EAAI,CAAC,CAAC,EAAE,CAAC,EAAIuK,EAAIU,EAAKjL,EAAI,CAAC,CAAC,EAAE,CAAC,GAAK,GAAI,EACrGoL,EAAQD,GAAQF,EAAK,SAAW,GAAKP,EAAO,OAAS,CAAC,OAAQ,OAAO,EAAIS,GAAQF,EAAK,SAAW,GAAKP,EAAO,OAAS,CAAC,OAAQ,SAAU,OAAO,EAAIS,GAAQF,EAAK,SAAW,EAAI,CAAC,OAAO,EAAIE,GAAQF,EAAK,SAAW,EAAI,CAAC,SAAU,OAAO,EAC5OA,EAAK,IAAI,CAACtF,EAAG3F,IAAM,IAAIA,EAAI,CAAC,EAAE,EAE5BqL,EAAQ,CAAC,CAAC,UAAWH,CAAK,EAAG,GAAGD,EAAK,IAAI,CAAChP,EAAK+D,IAAyC,CAACQ,EAAIvE,CAAG,GAAKmP,EAAMpL,CAAC,EAAGuK,EAAItO,CAAG,CAAC,CAAE,CAAC,EAE1HqM,EAAQ,CAAuBtM,EAA4BT,EAA4B+P,IAAU,CAAC,GAAG,IAAI,IAAI,CAAC,GAAIjB,EAAQ,CAAC,EAAGiB,CAAK,EAAI,CAAC,EAAI,GAAGD,EAAM,QAAQ,CAAC,CAAC,CAAElL,CAAC,IAAM,CAACA,EAAEnE,CAAI,EAAGmE,EAAEnE,CAAI,EAAImE,EAAE5E,CAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC2E,EAAGC,IAAMD,EAAIC,CAAC,EAChO,OAAO,CAAyB6I,EAAM5N,IAAQ4N,EAAK,QAAU5N,EAAK4N,EAAKA,EAAK,OAAS,CAAC,EAAIsC,EAAQ,IAAOtC,EAAO,CAAC,GAAGA,EAAM5N,CAAE,EAAI,CAAC,CAAC,EAC/HyP,EAAKvC,EAAM,EAAG,EAAG1L,CAAE,EAAGkO,EAAKxC,EAAM,EAAG,EAAGzL,CAAE,EAEzC0O,EAAOlB,EAAQ,IAAO,IAAMmB,EAAQ,CAAyBrL,EAAyB,EAAyBlC,IAAM,GAAKkC,EAAE,CAAC,EAAIvD,EAAK2O,GAAQ,GAAKpL,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAIvD,EAAK2O,GAAQtN,GAAKkC,EAAE,CAAC,EAAItD,EAAK0O,GAAQtN,GAAKkC,EAAE,CAAC,EAAIA,EAAE,CAAC,EAAItD,EAAK0O,EAC/NE,EAAQX,EAAG,MAAM,CAAC,EAAE,IAAI,CAAC7M,EAAGuE,IAAMqI,EAAG,MAAM,CAAC,EAAE,IAAI,CAAC7M,EAAGmE,IAAMkJ,EAAM,KAAK,CAAC,CAAC,CAAElL,CAAC,IAAMqL,EAAMrL,GAAI0K,EAAG1I,CAAC,EAAInE,GAAK,GAAI8M,EAAGtI,CAAC,EAAIvE,GAAK,CAAC,CAAC,IAAI,CAAC,GAAK,GAAG,CAAC,EAChJ,GAAI,CAACwN,EAAM,QAAU,CAACA,EAAM,CAAC,EAAE,QAAU,CAACA,EAAM,KAAK,EAAE,SAAS,SAAS,EAAG,OAAO,KACnF,IAAMC,EAAK,CAAyBC,EAA6BL,IAAWK,EAAM,SAAW,EAAI,CAAC,KAAK,EAAIA,EAAM,MAAM,CAAC,EAAE,IAAI,CAACvQ,EAAI4E,IAAM,GAAG,KAAK,IAAI,GAAK,KAAK,OAAQ5E,EAAKuQ,EAAM3L,CAAC,GAAKsL,EAAS,GAAG,EAAI,EAAE,CAAC,IAAI,EAEzMM,EAAOF,EAAGZ,EAAIjO,CAAE,EAAE,IAAI,CAACgP,EAAOrJ,IAAO,CAAC6H,GAASgB,EAAM,OAAS,GAAKI,EAAMjJ,CAAC,EAAE,MAAOsJ,GAASA,IAAS,WAAaA,IAAS,GAAG,EAAI,OAASD,CAAM,EACvJ,MAAO,CAAE,MAAOR,EAAM,IAAI,CAAC,CAACpP,CAAG,IAAMA,CAAG,EAAG,MAAOwP,EAAM,IAAKnH,GAAQA,EAAI,KAAK,GAAG,CAAC,EAAE,KAAK,KAAK,EAAG,QAASoH,EAAGb,EAAIjO,CAAE,EAAE,KAAK,GAAG,EAAG,KAAMgP,EAAK,KAAK,GAAG,CAAE,CACvJ,CAGA,SAAS9N,GAAO9C,EAAO,CACrB,IAAI+Q,EAAS,GACb,QAAS/L,EAAI,EAAGA,EAAIhF,EAAM,OAAQgF,GAAK,MAAQ+L,GAAU,OAAO,aAAa,GAAG/Q,EAAM,SAASgF,EAAGA,EAAI,KAAM,CAAC,EAC7G,OAAO,KAAK+L,CAAM,CACpB,CAMO,SAASC,GAAaxO,EAAQ,CACnC,IAAMoH,EAAiC5H,GAAW,OAAOA,GAAU,SAAW,CAAE,MAAO,QAAS,OAAQA,CAAM,EAAI,OAC5GiP,EAA4CzL,GAAQ,OAAO,YAAY,OAAO,QAAQ,CAAE,GAAIA,EAAI,MAAO,GAAIA,EAAI,IAAK,OAAQA,EAAI,QAAS,MAAOA,EAAI,MAAO,QAASA,EAAI,IAAK,CAAC,EAAE,QAAQ,CAAC,CAACzD,EAAKC,CAAK,IAAO4H,EAAO5H,CAAK,EAAI,CAAC,CAACD,EAAK6H,EAAO5H,CAAK,CAAC,CAAC,EAAI,CAAC,CAAE,CAAC,EACxPkP,EAAQ1O,EAAO,OAAS,CAAC,EAC/B,MAAO,CACL,MAAO,CAAE,MAAOyO,EAAMzO,CAAM,EAAG,GAAIA,EAAO,MAAQ,CAAE,KAAMyO,EAAMzO,EAAO,IAAI,CAAE,EAAI,GAAIA,EAAO,QAAU,CAAE,OAAQ,OAAO,YAAYA,EAAO,OAAO,IAAI,CAAuBvB,EAA2B+D,IAAM,CAAC,IAAIA,EAAI,CAAC,GAAI4E,EAAO3I,CAAG,CAAC,CAAC,CAAC,CAAE,CAAG,EAC7O,IAAKiQ,EAAM,SAAWA,EAAM,OAAS,CAAE,KAAM,CAAE,GAAIA,EAAM,SAAW,CAAE,QAAS,CAAE,MAAO,aAAc,OAAQA,EAAM,OAAQ,CAAE,EAAI,GAAIA,EAAM,MAAQ,CAAE,KAAM,CAAE,MAAO,aAAc,OAAQA,EAAM,IAAK,CAAE,CAAG,CAAE,CAC/M,CACF",
6
+ "names": ["NAME", "TRACK", "PPTX", "ENUMS", "CORNERS", "logoOf", "value", "artOf", "STANDARD", "name", "given", "layoutOf", "problems", "budgets", "named", "budget", "clean", "slots", "slot", "NAME", "rows", "row", "width", "cell", "cells", "y", "x", "xs", "c", "ys", "tracks", "value", "count", "list", "t", "TRACK", "columns", "rowTracks", "pick", "key", "fallback", "ENUMS", "label", "art", "one", "words", "v", "PPTX", "kept", "tokensFrom", "colour", "face", "NAMES", "group", "g", "k", "colours", "tokens", "dark", "fonts", "heading", "body", "mergeKits", "kits", "kit", "next", "picture", "artOf", "definition", "layout", "found", "p", "where", "logoOf", "CORNERS", "rgbOf", "value", "under", "text", "digits", "css", "share", "part", "whole", "r", "g", "b", "a", "c", "h", "i", "round", "mix", "round", "c", "v", "mix", "a", "b", "t", "i", "luminance", "rgb", "r", "g", "s", "contrast", "x", "y", "p", "q", "OWN", "PPTX", "PICTURES", "DRAWN", "PICTURE_MB", "ART_MB", "EMU", "unzip", "bytes", "view", "end", "files", "at", "n", "method", "size", "name", "local", "start", "data", "attr", "xml", "targets", "rels", "from", "one", "kitFromTemplate", "problems", "text", "path", "master", "root", "masterXml", "masterRels", "themePath", "theme", "cx", "cy", "mapOf", "key", "value", "masterMap", "scheme", "role", "face", "part", "heading", "body", "tokens", "accents", "logoPath", "pic", "type", "url", "base64", "logoOf", "x", "y", "off", "lists", "list", "children", "art", "hex", "rgbOf", "underneath", "masterArt", "map", "used", "drawTree", "treeOf", "svg", "roles", "paper", "ink", "placed", "sp", "ph", "ext", "masterBoxes", "layouts", "pictures", "layer", "drawn", "where", "artOf", "svgOf", "hash", "i", "paths", "a", "b", "title", "boxes", "m", "here", "own", "bgOf", "back", "backOf", "under", "mine", "words", "wordsOf", "hexOf", "light", "contrast", "sheet", "layers", "layout", "gridOf", "logo", "STANDARD", "align", "titleSays", "merged", "mergeKits", "out", "depth", "tag", "index", "child", "rgb", "c", "toLinear", "fromLinear", "v", "hslOf", "r", "g", "z", "max", "min", "d", "s", "rgbFrom", "h", "l", "p", "q", "u", "NAMED", "colourOf", "val", "number", "alpha", "change", "by", "hrefOf", "id", "read", "file", "href", "filterOf", "blip", "duotone", "lum", "dark", "row", "bright", "slope", "funcs", "paintOf", "as", "colour", "stops", "gs", "stop", "rect", "t", "angle", "dx", "dy", "amount", "poly", "points", "rounded", "w", "SHAPES", "_", "LINES", "DASHES", "outlineOf", "spPr", "custom", "pw", "sx", "sy", "step", "pt", "xy", "rx", "ry", "sweep", "preset", "kind", "given", "gd", "fallback", "frameOf", "xfrm", "turn", "fh", "fv", "fillOf", "style", "ref", "idx", "themed", "strokeOf", "ln", "paint", "width", "dash", "wordsIn", "txBody", "bodyPr", "inset", "wraps", "scale", "level", "fontRef", "lines", "runs", "rPr", "typeface", "some", "entity", "room", "line", "fits", "pieces", "kept", "word", "tall", "sum", "anchor", "top", "shapeOf", "fill", "stroke", "pictureOf", "crop", "outline", "filter", "groupOf", "pr", "cw", "ch", "inner", "bg", "solid", "pattern", "whole", "isTitle", "box", "across", "sorted", "titles", "others", "union", "xs", "ys", "xe", "ye", "rest", "first", "side", "names", "slots", "total", "near", "holds", "areas", "fr", "edges", "rows", "track", "cell", "binary", "tokensToDtcg", "group", "fonts"]
7
+ }
@@ -1,8 +1,8 @@
1
1
  export { createDeck, markdownOf } from './deck.js';
2
2
  export { parseDeck } from './parse.js';
3
3
  export { renderSlide } from './render.js';
4
- export { STANDARD, mergeKits, layoutOf, inferLayout, labelOf, tokensFrom } from './kit.js';
5
- export { tokensOf, schemeOf, LOOKS, readable, contrast } from './look.js';
4
+ export { STANDARD, CORNERS, mergeKits, layoutOf, logoOf, inferLayout, labelOf, tokensFrom } from './kit.js';
5
+ export { tokensOf, schemeOf, LOOKS, readable, contrast, rgbOf } from './look.js';
6
6
  export { readDeckFile, writeDeckFile, rendererUrl, escape, unescape } from './file.js';
7
7
  export { toPptx } from './pptx.js';
8
8
  export { defaultBlocks, libraryAt } from './blocks.js';
@@ -21,14 +21,29 @@ export type Layout = {
21
21
  justify: 'start' | 'center' | 'end';
22
22
  paper: 'paper' | 'fill' | 'ink' | 'soft';
23
23
  title: 'normal' | 'large' | 'huge';
24
+ logo: 'big' | 'small' | 'none';
24
25
  pptx: string;
25
26
  numbered: boolean;
27
+ art?: string[];
26
28
  };
27
29
  export type Kit = {
28
30
  name?: string;
29
31
  tokens: Record<string, any>;
30
32
  layouts: Record<string, Layout>;
33
+ pictures: Record<string, string>;
31
34
  };
35
+ /** The corners a logo sits in, as `logoAt` names them, the first by default. */
36
+ export declare const CORNERS: string[];
37
+ /**
38
+ * A logo as a kit holds it: a picture inside the kit, PNG, JPEG, GIF, WebP or SVG as a data: address of 512 KB at most,
39
+ * never an address to fetch; else null. @param {unknown} value
40
+ */
41
+ export declare const logoOf: (value: unknown) => string | null;
42
+ /**
43
+ * A picture of a kit's, a layer of a layout's art drawn behind its words over the whole slide: a picture inside the kit as a
44
+ * logo is, or an SVG written out (`data:image/svg+xml,…`), of 3 MB at most, never an address to fetch; else null. @param {unknown} value
45
+ */
46
+ export declare const artOf: (value: unknown) => string | null;
32
47
  /** The names brains give the usual layouts, for the ones deck has. */
33
48
  export declare const ALIASES: Record<string, string>;
34
49
  /** deck's own kit: the usual layouts, the ones Slidev names and the ones PowerPoint has, as data. */
@@ -44,13 +59,14 @@ export declare function layoutOf(given: any): {
44
59
  /**
45
60
  * Design tokens as the W3C's Design Tokens format (DTCG 2025.10) writes them, read into a kit's:
46
61
  * `color.light` and `color.dark` groups (bg, surface, fg, muted, accent) or flat colours, `font.sans`
47
- * and the like; each `$value` a hex string or a colour object with its `hex`. Tokens already flat
62
+ * and the like; each `$value` a colour string or a colour object with its `hex` and `alpha`. Tokens already flat
48
63
  * pass through. @param {any} given @returns {Record<string, any>}
49
64
  */
50
65
  export declare function tokensFrom(given: any): Record<string, any>;
51
66
  /**
52
- * Kits merged, the later over the earlier: their tokens, and their layouts by name, each checked.
53
- * @param {...any} kits @returns {{ kit: Kit, problems: string[] }}
67
+ * Kits merged, the later over the earlier: their tokens, their dark ones within theirs, their layouts by name and their
68
+ * pictures, each checked; a layout given as false is taken away, but the default. A logo that isn't a picture inside the
69
+ * kit is dropped. @param {...any} kits @returns {{ kit: Kit, problems: string[] }}
54
70
  */
55
71
  export declare function mergeKits(...kits: any[]): {
56
72
  kit: Kit;
@@ -6,6 +6,7 @@ export type Tokens = {
6
6
  radius: number;
7
7
  muted?: string;
8
8
  soft?: string;
9
+ series?: string[];
9
10
  dark?: Record<string, string>;
10
11
  fonts?: {
11
12
  heading: string[];
@@ -22,7 +23,7 @@ export type Scheme = {
22
23
  soft: string;
23
24
  series: string[];
24
25
  };
25
- /** @typedef {{ paper: string, ink: string, primary: string, voice: string, radius: number, muted?: string, soft?: string, dark?: Record<string, string>, fonts?: { heading: string[], body: string[] } }} Tokens */
26
+ /** @typedef {{ paper: string, ink: string, primary: string, voice: string, radius: number, muted?: string, soft?: string, series?: string[], dark?: Record<string, string>, fonts?: { heading: string[], body: string[] } }} Tokens */
26
27
  /** @typedef {{ paper: string, ink: string, muted: string, line: string, primary: string, onPrimary: string, soft: string, series: string[] }} Scheme */
27
28
  /** Looks a deck can name (`theme:`), each a handful of tokens. */
28
29
  export declare const LOOKS: Record<string, Tokens>;
@@ -42,8 +43,12 @@ export declare function tokensOf(settings: Record<string, any>, project?: Partia
42
43
  * @param {Tokens} tokens @param {'light' | 'dark'} scheme @returns {Scheme}
43
44
  */
44
45
  export declare function schemeOf(tokens: Tokens, scheme: 'light' | 'dark'): Scheme;
45
- /** @param {string} value @returns {[number, number, number] | null} */
46
- export declare function hex(value: string): [number, number, number] | null;
46
+ /**
47
+ * A colour as deck reads one, as red, green and blue: `#rgb` or `#rrggbb` (`#rgba`, `#rrggbbaa` with an alpha), `rgb()` or
48
+ * `rgba()` as CSS writes them, by commas or spaces, the alpha after a comma or a slash; one see-through is seen over `under`,
49
+ * white unless said. @param {string} value @param {number[]} [under] @returns {[number, number, number] | null}
50
+ */
51
+ export declare function rgbOf(value: string, under?: number[]): [number, number, number] | null;
47
52
  /** @param {number[]} rgb */
48
53
  export declare const css: (rgb: number[]) => string;
49
54
  /** WCAG's contrast ratio. @param {number[]} a @param {number[]} b */