pepperscore 0.1.0 → 0.1.1
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.
- package/README.md +3 -1
- package/dist/index.js +1711 -1705
- package/dist/index.js.map +1 -1
- package/dist/lib/prefs.d.ts +6 -0
- package/dist/lib/render.d.ts +6 -2
- package/dist/lib/stave-scale.d.ts +7 -0
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["__import_glob__0_0_","__import_glob__0_1_","__import_glob__0_2_","__import_glob__0_3_","__import_glob__0_4_","__import_glob__0_5_","__import_glob__0_6_","__import_glob__0_7_","__import_glob__0_8_","__import_glob__0_9_","__import_glob__0_10_","__import_glob__0_11_","__import_glob__0_12_","__import_glob__0_13_","__import_glob__0_14_","__import_glob__0_15_","manifest","children","empty","MB","LETTERS","NATURAL_PC","mod","parseXml","normalized","import.meta.ROLLDOWN_FILE_URL__qW_jskMFMLPjEZ3z72c7Q","import.meta.ROLLDOWN_FILE_URL_0pc1L3x1BPCEbbDBS1Y0dg","clamp","settle","done","_Fragment","_Fragment","alto_saxophone_default","bari_saxophone_default","bassguitar_default","cello_default","clarinet_default","double_bass_default","drum_kit_default","flute_default","guitar_default","microphone_default","piano_default","tenor_saxophone_default","trombone_default","trumpet_default","viola_default","violin_default","gm_soundfont_manifest_default","\"piano\"","\"guitar\"","\"bassguitar\"","\"flute\"","\"clarinet\"","\"trumpet\"","\"trombone\"","\"violin\"","\"viola\"","\"cello\"","\"microphone\"","\"program\"","\"soundfont\"","\"icon\"","\"localPack\"","\"family\"","\"id\"","\"label\"","iconUrls","GM_FAMILIES","iconFor","id","GM_SOUNDS","entry","gmSoundfontLabel","INSTRUMENTS","voice","instrumentForProgram","program","gmProgramForSoundfont","name","isGmSoundfont","word","instrumentDetails","item","ucfirst","semitones","pitch","s","step","octave","alter","midiPitch","names","altered","pc","midi","instrumentForName","n","exampleScore","notes","index","beat","chord","gcd","a","b","fraction","d","g","fromNumber","value","sign","x","h0","h1","k0","k1","i","h2","k2","maxDenominator","rest","parseFraction","text","rational","decimal","scale","addFraction","compareFraction","fractionValue","formatFraction","ZERO","XmlError","detail","offset","PREDEFINED","ILLEGAL_CHARS","isWhite","c","isNameStart","isNameChar","localNameOf","colon","validCodePoint","code","scanXml","bodyStart","entities","stack","root","rootClosed","sawDoctype","fail","at","decode","out","from","amp","raw","semi","ref","hex","digits","ch","normalizeLines","attributeValue","literal","readName","start","skipWhite","expect","quoted","quote","close","characterData","end","lines","doctype","handler","comment","processingInstruction","target","lt","next","open","attributes","selfClosing","white","attributeStart","attributeName","valueAt","other","XmlElement","parentElement","attribute","last","walk","element","XmlTreeBuilder","capture","parseXmlTree","builder","endingNumbers","result","range","token","number","navigationWord","words","isEmptyNavigation","nav","attachNavigation","part","score","navigation","measure","resolveCodaSigns","jump","likeChildren","el","likeFirst","musicXmlNavigationReader","SOUND","ending","divisions","cursor","barlines","duration","repeat","barline","times","diagnostics","directions","sounds","direction","explicit","sound","codaGlyph","types","type","segnoGlyph","hasCodaGlyph","musicXmlNavigation","measureCount","sourceMeasures","read","musicXmlTextNavigation","xml","meiNavigation","measures","FUNC","left","right","ancestor","numbers","marks","mark","inside","abcDecorationWord","decoration","FAMILIES","inventoryFromCounts","featureCounts","family","tags","total","tag","rootLocalName","count","countElements","local","children$1","node","child","empty$1","durationBeats","dur","dots","normalizedScore","p","m","playbackCollector","markDiagnostics","partPedals","current","visitNote","note","notations","silent","art","durationScale","velocityDelta","fermata","meaningful","state","damper","down","pedals","pedal","changes","pedalDiagnostics","readPlaybackMarks","collector","timewise","measureIndex","timewiseParts","parent","kind","done","error","timewiseMarks","parts","drum","position","head","GM_DRUM_NOTATION","DRUM_FALLBACK","drumNotation","staffLoc","encoder","decoder","xmlId","staffDefXmlId","partId","escape","sourceFeatureInventory","format","textOf","source","makeSourceDocument","bytes","args","original","engraving","inventory","document","IdentityBuilder","match","identity","sourceIds","durationPieces","values","beats","v","base","percussionPosition","notation","meiPitch","continuation","pieceIndex","accidental","tie","percussion","placement","meiEvent","lyric","layerXml","tokens","tupletKey","beamEndPending","closeTop","top","closeTuplet","closeBeam","rests","length","piece","segment","segments","gap","tuplet","written","inTuplet","key","pieces","scoreToMei","meter","staffDefs","jumpTarget","staves","incoming","sourceMeasure","nominal","absolute","measureStart","overlapStart","overlapEnd","layers","ends","preferred","layer","staffIndex","harmonies","tempo","reference","lastBeat","tstamp","startsRepeat","bars","sectionXml","endings","j","withEngravingDocument","engravingText","identityForScore","STAVE_SCALE_MIN","STAVE_SCALE_STEP","clampStaveScale","min","STAVE_SCALE_FLOOR","deviceClass","ENDLESS_STAVE_SCALE","minimumDefaultStaveScale","device","clampBpm","bpm","legacyStorageKey","prefix","hash","instruments","legacyInstruments","roundConstants","rotate","shift","Sha256","take","tail","y","sigma0","sigma1","e","f","h","sum1","choose","t1","t2","sha256Hex","fileSourceFor","textSource","validZoom","zoom","validSettingsAndParts","settings","parseLegacyFileState","sha256","migrateFileState","legacy","parseFileState","buildFileState","hidden","hiddenIds","volumes","keyFlip","view","MB$1","MAX_SCORE_FILE_BYTES","MXL_MAX_SCORE_BYTES","formatMb","extractMxlScore","entries","listing","unzipSync","file","container","path","declared","strFromU8","files","LETTERS$1","NATURAL_PC$1","SHARP_ORDER","FLAT_ORDER","MAJOR_BY_FIFTHS","MINOR_BY_FIFTHS","DEFAULT_MAJOR_FIFTHS","SHARP_MAJOR_FIFTHS","mod$1","accidentalText","alterOf","char","accidentals","signatureAlter","fifths","keyFromFifths","tonic","mode","enharmonicFlip","chooseKey","majorPc","pitchClass","options","transposeInterval","delta","to","up","steps","size","simple","perfect","difference","quality","withOctave","spelled","spells","letterIndex","letterStep","distance","neighbour","spellPitch","context","diatonic","allowed","degree","letter","raised","flatSpelling","prev","sides","sharp","flat","spellChordSymbol","symbol","unicode","suffix","INSTRUMENT_SPELLING","INSTRUMENT_FAMILY","spellingProfileFor","LETTERS","NATURAL_PC","mod","parseInterval","intervalFifths","chromatic","transposeSpelled","interval","midiOf","foldFifths","viewKey","flip","staff","respellLine","single","NAME","alterOfText","sum","moveChordSymbol","move","moved","intervals","sourceTransposition","soundingMidi","viewInterval","transposition","movedByView","viewProfile","sameMidi","scoreForView","viewMoved","referencePlan","global","pitchView","measureKeys","order","line","tiedFrom","back","previous","pitchIndex","noteIndex","spellingSpecFor","staffOf","keys","measureKey","first","transposeReadout","spokenKey","musicXmlPlaybackMarks","ROADMAP_MAX_SEGMENTS","ROADMAP_MAX_REPLAY","measureLengths","max","edgeRepeats","edges","lengths","bar","units","cuts","cut","edge","inner","atStart","atEnd","points","unit","lastEndings","list","k","traverse","visits","trailingPass","jumped","codaJumped","repeatStack","lastRepeatEnd","spentImplicit","limit","segno","finalEnding","pass","taken","endingSkipped","after","pos","roadmapFromNavigation","visit","buildRoadmap","generatedSegments","roadmap","resolveRoadmap","message","version","starts","label","resolved","performed","EPS","FERMATA_HOLD","GRACE_BEATS","GRACE_TOTAL","dynamics","scoreOffsets","here","slices","occurrences","sameBar","nextBar","occurrence","tempoPoints","byBeat","offsets","old","tempoAt","point","directionVelocity","sourcePartId","dynamicPoints","groups","velocity","velocityFor","valueBeat","valueOwn","openWedges","completed","targetBeat","own","staffId","wedge","span","progress","documentXml","GRACE_FLOOR_SECONDS","buildBaseTimeline","partDiagnostics","full","exactLengths","initialBpm","unitsPerBeat","markFor","dynamicGroups","built","override","performedSlices","performedPedals","eventSource","events","positions","openTies","graceFloor","elapsed","slice","horizon","boundaries","baseAt","limited","secondsPerBeat","inSlice","fermataStarts","holdMap","seconds","holds","heldBefore","hold","inclusive","secondsAt","release","carried","positionBeats","sourceId","change","graceGroups","graceBeat","dynamicList","pedalSource","group","principal","opening","pitchMark","soundingEnd","tieKey","event","eventSources","applySustainPedal","timelineEnd","pieceEnd","deriveTimeline","visible","playbackScale","timeline","transposable","scaledEvent","playbackDuration","playbackPositionAt","positionAtSeconds","playbackEventsFrom","shifts","scaled","playbackMidis","partIds","registered","registerBaseTimeline","baseTimelineFor","known","resolve","spans","downAt","byKey","clamped","ratio","scoreBeat","active","latest","activeNoteIds","children","parseXml$1","doc","empty","parseMei","everything","all","defs","def","parseKey","sig","defKey","defMode","defMeter","meterNow","defaultKey","staffKeys","defaultMode","staffModes","measureState","openingMeter","openingKey","beatType","alteredByKey","accidValues","innerBarlines","clef","staffKey","bySourceId","layerIndex","eventIndex","form","actual","normal","beam","grace","noteEls","pitches","accidChild","gestural","shown","pitchKey","prior","parsed","harmony","targetStaff","stamp","targetStart","titles","title","subtitle","composer","openingDef","parseAbc","abcjs","tune","keyAccidentals","firstStaff","map","voiceIndex","pendingStart","openEnding","lastFilled","barlineCodas","pendingBarlineCoda","navigationWords","applyWord","leading","accidentalMap","triplet","tupletInfo","fromKey","chordSymbol","syllable","content","wasToCoda","pair","before","parseMidi","toneMidi","Midi","buffer","measureSize","ppq","t","track","ti","remaining","tieStop","tieStart","sounding","inForce","parsing","cancelImports","channel","runImport","worker","resolveHash","resolveResult","rejectHash","rejectResult","reject","stop","data","request","sizeKnown","importScoreFile","job","readOnMainThread","handled","importMusicXmlText","rewrap","binary","qualities","pitchName","inferChordSymbol","classes","bass","lowest","pattern","rootPitch","VerovioError","isSuperseded","isOutOfMemory","isRestarted","restarted","MIN_CHUNK_STAFF_MEASURES","chunkBudget","forceChunks","recycleHeapBytes","setting","reduceChunkSize","stopWorker","simulatedOom","takeSimulatedOom","armed","nextId","pending","getWorker","heap","idle","importsInFlight","currentChunked","baselines","outOfMemory","reason","body","transfer","revisions","nextRevision","verovioRevision","revision","BASELINE_LIMIT","RECYCLE_BEFORE_IMPORT_BYTES","channels","nextChannel","channelState","closed","publishChannels","openVerovioChannel","closeVerovioChannel","inUse","releaseUnused","adopt","prepareVerovio","cached","info","send","attempt","settled","verovioBaseline","importing","ticket","nextRenderTicket","withBaseline","run","missing","probeVerovio","renderTicket","renderVerovioPages","PETALUMA_OPTIONS","musicFontOptions","font","SVG","latestGeneration","liveResults","ENDLESS_SINGLE_SYSTEM_LIMIT","ENDLESS_CHUNK","ENDLESS_CHUNK_STAFF_MEASURES","endlessChunkBars","LANE_GAP","LANE_ROW","EAGER_STAFF_MEASURES","NEAR_SCREENS","KEEP_SCREENS","PAGE_BATCH","portraitMinimumBarWidth","busiest","lyrics","syllables","lyricBarWidth","portraitBarLimit","width","minimumBar","autoBarsPerLine","systemMinimumWidth","barFloor","BAR_FIT_SLACK","barFitZoom","need","fits","viewportWidth","gutterAt","low","high","mid","parseXml","box","graphics","rect","rootInverse","svg","transform","staffNumbers","engraved","byPart","claimed","claim","unmappedParts","unclaimed","beatLabel","subdivisions","annotation","className","mapped","findNote","byId","related","SVG_ELEMENTS","SAFE_URL","sanitizeSvg","naturalWidthOf","naturalHeightOf","wraps","yieldTask","renderScore","generation","isCurrent","superseded","document_","measureTotal","endlessSingle","layoutGutter","firstSystemGutter","visibleParts","hiddenStaves","visibleIndex","annotated","showCounts","nameRows","showNames","laneRows","laneHeight","spacingStaff","showChordSymbols","inferChordSymbols","spelling","verovioOptions","natural","pageWidth","layoutAt","usableUnits","restUnits","barsPerLine","maxBars","fullLine","short","least","most","probe","layout","restOptions","fetchPages","pages","fitCap","heightFit","availableHeight","naturalHeight","eager","fetched","scroller","countOf","candidate","pageOf","system","systemFor","initialSystems","wanted","focus","sample","zoomGuess","firstIndex","lastIndex","page","firstSvg","fitted","systemCount","systemOfMeasure","textFont","parseSvg","viewBox","focusSystem","stash","slots","block","firstMeasure","slot","attach","fragment","measureIndexById","pointsById","measuresByIndex","measureGeometry","inverse","boxOf","measureElements","bottom","ordered","controls","control","band","nextTop","svgMeasureByIndex","measureRects","laneBottom","partIndex","svgMeasure","labelled","row","firstGeometry","firstBands","lined","staffNatural","centers","pitchNatural","center","widthLimitFor","gutter","scaleFor","estimate","place","height","keepPlace","oldSize","minLeft","above","record","blockTop","geometry","drawn","geometries","disposed","listeners","notifyQueued","notify","listener","alive","near","pumping","draw","reprobe","kept","supersededDraws","stalled","retryTimer","load","promise","pump","pendingSlots","observers","observeTimer","margin","screens","nearObserver","keepObserver","released","OBSERVE_BATCH","observeFrom","firstSystem","geometryOf","firstCenters","observer","ICON_RATIO","FONT_RATIO","ICON_MIN","ICON_MAX","FONT_MIN","FONT_MAX","EYE_MIN","EYE_MAX","PAD","GAP","NAME_EMS","clamp$1","partControlMetrics","stavePx","room","staffPitchPx","icon","eyeSize","buttons","fixed","maxGutter","HEADER_CONTROLS","HEADER_CONTROL_GROUP","resolveChrome","on","preset","transport","viewToggle","openFile","mixer","drawer","SCORE_STORE","settle$1","done$1","transaction","createScoreDb","dbName","maxRecords","debounceMs","fallbackPrefix","fallbackKey","pendingKey","legacyKey","storage","factory","db","readLocal","readLegacy","writeLocal","store","records","localKeys","hashes","readPending","dropPending","withPending","stored","queue","writeDb","excess","timer","flushing","flushNow","batch","flush","queued","updatedAt","sampleSource","defaults","sanitizeSavedPrefs","_legacyZoom","saved","clamp","settingsToPrefs","viewToMode","LAST_FILE_STORE","INFO_KEY","BYTES_KEY","settle","isInfo","infoOf","isSameFile","lastFileToFile","disabled","createLastFileStore","stores","none","readerStorage","ns","prefsKey","dismissedKey","prefs","shared","getSharedAudio","master","RESUME_TIMEOUT_MS","resumeAudio","owner","claimPlayback","releasePlayback","who","MB","LARGE_FILE_BYTES","LARGE_SCORE_STAFF_MEASURES","LARGE_FILE_BYTES_OVERRIDE_KEY","DESKTOP_SECONDS_PER_MB","OPEN_BASE_SECONDS","PHONE_SLOWDOWN","BYTES_PER_STAFF_MEASURE","largeFileBytes","isLargeFile","staffMeasures","isLargeScore","estimateOpenSeconds","mb","factor","phone","roundedLow","largeScoreMessage","cells","TXT_SNIFF_BYTES","EXTENSION_FORMATS","scoreFormatOf","looksLikeAbc","entryFile","readBatch","reader","trimPath","keepTxt","Collector","fromFolder","inFolder","depth","collectDroppedScoreFiles","systemPages","systems","viewHeight","topOf","pad","tallOverlap","overlap","pageStarts","turnTarget","epsilon","pageOfSystem","MEDIA_EXTENSIONS","remoteFileName","url","contentType","extension","fetchScoreFile","link","response","signal","tooLarge","blob","FORMATS","TIP","NOT_ABC","hasFiles","FOCUSABLE","OpenScoreDialog","headingId","useId","tipId","panelRef","useRef","textRef","dragDepth","abc","setAbc","useState","dragging","setDragging","scanning","setScanning","setMessage","choices","setChoices","truncated","setTruncated","useEffect","opener","onClose","focusable","onOpenFile","candidates","unsupported","folder","scan","work","submitAbc","onOpenAbc","dragProps","messageIsHint","FolderOpen","X","ChevronLeft","choice","FileMusic","Fragment","Upload","onBrowse","SOUNDS_VERSION","defaultAssetBaseUrl","pack","pageBase","resolveAssetBase","assetUrl","packInfo","loadPackInfo","json","warnedBases","warnAssetBase","what","BUILTIN_FLUIDR3","BUILTIN_DRUMS","BUILTIN_SF2","claims","fallbackSf2Url","planSound","sources","fluidr3","planKey","plan","loadPlayers","loadFluidPlayer","loadSf2Player","loadNoteFilePlayer","addDrumFallback","kit","players","player","drums","fallbackSf2","MUSIC_FONTS","ensureMusicFonts","style","onError","families","failed","face","keyName","clampSemitones","sampleScore","textFonts","sampleAbc","playbackSound","soundRequest","audioKey","SILENT_PLAYBACK_NOTICE","maxControlGutter","STAVE_SCALE_COMMIT_MS","SCORE_RECORD_TIMEOUT_MS","readScoreRecord","scoreDb","FOLLOW_SUSPEND_MS","SCROLL_SETTLE_MS","OOM_GUIDANCE","RENDERER_RESTARTED","RESTART_REDRAWS","LAST_FILE_PRIVACY","scrollBehavior","flag","PepperScore","chrome","useMemo","persist","settingsKey","hostPrefs","hostPrefsRef","callbacks","storageRef","setScore","scoreRevision","setScoreRevision","setPrefs","setSource","setHiddenIds","trackVolumes","setTrackVolumes","setDrawer","setMixer","openDialog","setOpenDialog","pickerPartId","setPickerPartId","pickerFamily","setPickerFamily","pickerPage","setPickerPage","abcDraft","setAbcDraft","setError","notice","setNotice","largeNotice","setLargeNotice","largeNoticeArmedRef","oomRetry","setOomRetry","lastFileRef","lastFileInfo","setLastFileInfo","reopenOffer","setReopenOffer","playing","setPlaying","loadingAudio","setLoadingAudio","loadingFont","setLoadingFont","painted","setPainted","painting","setPainting","resizeTick","setResizeTick","layoutTick","setLayoutTick","setActive","activeNotes","setActiveNotes","setPosition","ready","setReady","loaded","setLoaded","staffCenters","setStaffCenters","controlMetrics","setControlMetrics","zoomDraft","setZoomDraft","zoomCommitRef","renderedZoom","setRenderedZoom","renderedZoomRef","prefsZoomRef","staveScaleMinRef","savedViewRef","quietRenderRef","zoomAnchorRef","previewOriginRef","sliderPointerRef","pendingZoomRef","staveScaleChangeRef","staveScaleInputRef","moreOpen","setMoreOpen","moreRef","rootRef","uid","panelId","overhangId","scoreWidth","setScoreWidth","fileRef","viewportRef","canvasRef","renderRef","audioRef","playRef","scheduledStopsRef","playRunRef","importRunRef","renderRunRef","swipeRef","pinchRef","contentRef","hasPaintedRef","modeRef","overlapRef","pagesRef","pageTailRef","scrollTargetRef","userScrollAtRef","assetBase","assetBaseUrl","soundPack","channelRef","restartRedrawsRef","readyRevisionRef","hiddenSet","visibleScore","audio","gain","concertBasis","scorePitch","displayScore","readout","hasTransposingParts","timelineRef","timelineKey","visibleKey","timelineOf","useCallback","loadTimeline","hasSource","musicXml","scoreUrl","offerCancelled","cancelled","src","loadScore","_zoom","persistPending","update","patch","stopRef","playbackOwner","reset","changePitch","transposeBy","restored","nextSource","host","hostResets","readMusicXml","startOpening","prepareEngraving","showError","retry","fallback","readFile","largeBytes","nextScore","readUrl","readAbc","changed","retryOutOfMemory","reopenLastFile","dismissReopen","forgetLast","loadSample","togglePart","focusedId","focusPart","resetStaves","viewportCentre","viewport","previewStaveScale","centre","draft","clearStaveScalePreview","captureZoomAnchor","best","clamp01","restoreZoomAnchor","anchor","share","dx","dy","commitStaveScale","draftStaveScale","input","releaseStaveScale","onStaveScaleChange","staveScaleInput","outside","autoFocus","focusOnMount","overlaysRef","overlays","was","refreshPagesRef","canvas","frame","quiet","metricsFor","metrics","metaHeight","requested","refreshPages","delay","systemSpans","blocks","origin","lastStart","scrollViewport","pendingScroll","turn","manual","scrollbar","landed","onRootKeyDown","measureCursor","measureCursorKey","pendingSystem","ensureAudio","sharedAudio","plans","soundSources","builtinFailed","matching","destination","builtin","used","play","now","secondsStart","started","nextEvent","schedule","time","tick","wasPlayingRef","busyRef","latestPlayRef","changePitchRef","useImperativeHandle","openInstrumentPicker","currentSound","selected","changeInstrument","pickerPart","familySounds","pickerPages","pickerSounds","hasScoreText","barsLimit","barsDisabled","barsSetting","oomButton","staveScale","staveScaleMin","staveScalePercent","flipTo","flipLabel","flipText","flipKey","transposeTitle","headerElements","Square","jsx","Pause","Play","Minus","Plus","SlidersHorizontal","renderControls","tier","primaryControls","secondaryControls","heightMode","compactLabel","ariaLabel","Ellipsis","EyeOff","Eye","ChevronDown","ChevronRight","nextZoom","Focus","Settings2","RotateCcw","Trash2","Hourglass","History","VolumeX","src_default","Reader"],"sources":["../src/icons/alto-saxophone.svg?url","../src/icons/bari-saxophone.svg?url","../src/icons/bassguitar.svg?url","../src/icons/cello.svg?url","../src/icons/clarinet.svg?url","../src/icons/double-bass.svg?url","../src/icons/drum-kit.svg?url","../src/icons/flute.svg?url","../src/icons/guitar.svg?url","../src/icons/microphone.svg?url","../src/icons/piano.svg?url","../src/icons/tenor-saxophone.svg?url","../src/icons/trombone.svg?url","../src/icons/trumpet.svg?url","../src/icons/viola.svg?url","../src/icons/violin.svg?url","../src/lib/gm-soundfont-manifest.json","../src/lib/score.ts","../src/lib/playback/fraction.ts","../src/lib/notation/xml-stream.ts","../src/lib/notation/navigation.ts","../src/lib/notation/musicxml-source.ts","../src/lib/notation/drum-map.ts","../src/lib/notation/document.ts","../src/lib/stave-scale.ts","../src/lib/file-state.ts","../src/lib/mxl.ts","../src/lib/spelling.ts","../src/lib/notation/respell.ts","../src/lib/transpose.ts","../src/lib/playback/source-marks.ts","../src/lib/playback/roadmap.ts","../src/lib/playback/timeline.ts","../src/lib/import.ts","../src/lib/chords.ts","../src/lib/verovio-runtime.ts","../src/lib/music-fonts.ts","../src/lib/render.ts","../src/lib/part-controls.ts","../src/lib/header-controls.ts","../src/lib/chrome.ts","../src/lib/score-db.ts","../src/lib/prefs.ts","../src/lib/last-file.ts","../src/lib/storage.ts","../src/lib/audio-engine.ts","../src/lib/large-file.ts","../src/lib/score-files.ts","../src/lib/paging.ts","../src/lib/remote-score.ts","../src/components/OpenScoreDialog.tsx","../src/lib/assets.ts","../src/lib/sounds.ts","../src/lib/sound-players.ts","../src/lib/asset-fonts.ts","../src/components/PepperScore.tsx","../src/index.ts"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M1315%204506%20c-147%20-36%20-155%20-40%20-155%20-66%200%20-23%2042%20-46%20207%20-114%20132%20-54%20251%20-88%20296%20-85%2039%203%20130%20-27%20298%20-97%20210%20-88%20274%20-133%20315%20-219%2029%20-61%2030%20-86%204%20-110%20-29%20-26%20-26%20-63%206%20-75%2037%20-15%2030%20-54%20-11%20-58%20-65%20-8%20-66%20-20%20-31%20-341%2021%20-196%2025%20-216%2046%20-233%2012%20-10%2035%20-18%2050%20-18%2027%200%2029%20-3%2034%20-52%2011%20-92%2065%20-659%2074%20-761%20l8%20-98%20-35%20-15%20c-45%20-19%20-51%20-29%20-51%20-84%200%20-76%2032%20-354%2042%20-367%206%20-7%2028%20-13%2049%20-13%2047%200%2042%2016%2064%20-235%208%20-104%2018%20-208%2021%20-230%20l6%20-40%20-51%20-22%20c-47%20-20%20-51%20-24%20-51%20-55%200%20-53%2066%20-319%2081%20-329%208%20-5%2043%20-9%2079%20-9%20l65%20-1%2036%20-48%20c43%20-56%20126%20-114%20207%20-143%2075%20-28%20274%20-31%20371%20-5%20181%2048%20308%20182%20357%20377%2015%2059%2015%2087%203%20310%20-19%20330%20-17%20589%205%20709%2022%20125%2068%20234%20122%20287%2042%2042%2042%2042%20101%2037%2055%20-5%2062%20-3%2077%2018%2025%2036%2020%2082%20-11%20113%20-32%2033%20-574%20370%20-681%20425%20-55%2028%20-93%2027%20-122%20-4%20-34%20-36%20-31%20-78%209%20-119%20l32%20-33%20-35%20-106%20c-101%20-302%20-105%20-646%20-14%20-1295%2018%20-128%2019%20-156%208%20-176%20-7%20-14%20-10%20-34%20-7%20-45%204%20-17%200%20-21%20-19%20-21%20-14%200%20-38%207%20-54%2015%20-51%2026%20-62%20122%20-28%20235%2011%2038%2017%2044%2036%2042%2028%20-4%2028%20-1%20-3%20213%20-13%2093%20-49%20348%20-80%20565%20l-55%20395%20-30%2025%20c-17%2014%20-30%2033%20-30%2043%200%2027%20-30%2074%20-57%2088%20-36%2019%20-40%2068%20-9%20121%2014%2025%2026%2057%2026%2072%200%2035%20-23%2079%20-53%20103%20-39%2030%20-42%2059%20-13%2094%2046%2055%2025%20148%20-41%20183%20-27%2014%20-29%2018%20-67%20247%20-22%20129%20-47%20270%20-56%20313%20-17%2077%20-17%2081%201%20110%2029%2047%2026%20139%20-7%20204%20-60%20121%20-251%20236%20-486%20292%20-108%2026%20-128%2022%20-128%20-31%200%20-16%20-4%20-29%20-8%20-29%20-21%200%20-216%2071%20-283%20103%20-76%2036%20-199%2077%20-228%2076%20-9%200%20-75%20-15%20-146%20-33z%20m256%20-61%20c50%20-19%2094%20-37%2099%20-40%209%20-5%20-7%20-85%20-19%20-98%20-4%20-4%20-29%20-3%20-56%203%20-55%2012%20-315%20112%20-315%20121%200%204%20154%2043%20193%2048%204%201%2048%20-15%2098%20-34z%20m568%20-96%20c128%20-34%20277%20-113%20348%20-184%2062%20-62%2093%20-125%2079%20-161%20-5%20-13%20-13%20-5%20-32%2035%20-41%2082%20-113%20153%20-201%20199%20-43%2022%20-87%2042%20-98%2045%20-135%2038%20-195%2060%20-195%2073%200%2018%2010%2018%2099%20-7z%20m-271%20-23%20c59%20-19%20166%20-50%20237%20-71%20181%20-51%20255%20-86%20315%20-152%2069%20-75%20111%20-194%2078%20-220%20-21%20-16%20-125%20-52%20-132%20-46%20-3%204%20-6%2018%20-6%2032%20-1%2070%20-67%20165%20-159%20225%20-86%2057%20-307%20156%20-425%20190%20-41%2012%20-54%2031%20-42%2062%207%2019%2012%2019%20134%20-20z%20m666%20-515%20c6%20-9%2057%20-293%2082%20-456%20l13%20-90%20-29%20-23%20c-36%20-28%20-52%20-79%20-39%20-126%2011%20-39%2060%20-86%2090%20-86%2029%200%2023%20-33%20-9%20-51%20-90%20-51%20-66%20-189%2040%20-224%2046%20-16%2049%20-47%206%20-73%20-43%20-27%20-59%20-55%20-60%20-101%20-1%20-56%2027%20-100%2076%20-122%2041%20-18%2044%20-21%2050%20-71%204%20-29%2010%20-63%2013%20-75%204%20-19%201%20-23%20-17%20-23%20-12%200%20-37%20-15%20-56%20-34%20-28%20-28%20-34%20-42%20-34%20-75%200%20-80%2058%20-140%20121%20-127%2037%207%2041%20-19%205%20-28%20-37%20-9%20-84%20-53%20-91%20-85%20-7%20-34%2013%20-88%2043%20-114%2011%20-10%2039%20-21%2061%20-24%2030%20-4%2041%20-10%2041%20-23%200%20-10%20-10%20-20%20-23%20-24%20-32%20-8%20-74%20-51%20-80%20-82%20-13%20-72%2044%20-144%20114%20-144%2032%200%2039%20-4%2039%20-19%200%20-13%20-9%20-21%20-30%20-26%20-36%20-8%20-76%20-53%20-89%20-100%20-25%20-90%2060%20-196%20146%20-182%2033%206%2033%206%2033%20-36%201%20-95%2063%20-164%20158%20-175%2035%20-4%2052%20-12%2070%20-34%2048%20-57%20132%20-77%20201%20-48%2095%2039%20100%20214%208%20270%20-35%2022%20-115%2027%20-147%2010%20-24%20-13%20-28%20-5%20-36%2066%20l-7%2059%2023%20-20%20c17%20-16%2036%20-20%2089%20-20%2059%200%2073%204%20104%2028%2088%2067%2099%20188%2026%20272%20-52%2059%20-147%2069%20-233%2025%20-26%20-13%20-38%20-15%20-41%20-7%20-7%2022%20-10%20107%20-4%20107%204%200%2023%20-7%2042%20-15%2051%20-21%20135%20-19%20173%204%2064%2039%2094%20161%2058%20237%20-34%2071%20-115%20112%20-185%2094%20-20%20-6%20-53%20-21%20-73%20-35%20-20%20-14%20-40%20-25%20-43%20-25%20-11%200%206%20325%2022%20420%2012%2073%2066%20267%2080%20288%202%202%20522%20-304%20534%20-314%202%20-2%20-7%20-13%20-21%20-24%20-63%20-49%20-128%20-190%20-156%20-335%20-21%20-112%20-22%20-446%20-3%20-740%2011%20-174%2011%20-209%20-2%20-271%20-28%20-132%20-99%20-235%20-202%20-294%20-56%20-32%20-172%20-64%20-262%20-74%20-59%20-6%20-73%208%20-19%2018%2048%209%2082%2039%20101%2091%2026%2066%2014%20126%20-35%20179%20l-39%2041%20-76%200%20c-75%200%20-77%20-1%20-110%20-37%20-40%20-43%20-60%20-103%20-51%20-150%209%20-50%2042%20-97%2079%20-113%2025%20-11%2027%20-14%2011%20-15%20-37%200%20-148%2063%20-200%20114%20-97%2098%20-148%20215%20-164%20383%20-5%2059%20-17%20178%20-25%20263%20-28%20287%20-76%20803%20-95%201025%20-11%20121%20-27%20285%20-35%20365%20-8%2080%20-24%20242%20-35%20360%20-11%20118%20-29%20307%20-40%20419%20-10%20113%20-18%20206%20-17%20207%201%201%2025%209%2052%2018%2028%209%2057%2021%2065%2026%2019%2012%2037%2013%2044%201z%20m-209%20-263%20c3%20-40%2013%20-142%2022%20-227%2014%20-148%2011%20-191%20-14%20-159%20-5%207%20-18%20103%20-27%20213%20-10%20110%20-20%20210%20-23%20223%20-4%2017%20-1%2022%2015%2022%2018%200%2021%20-9%2027%20-72z%20m395%20-380%20c14%20-26%2014%20-29%20-12%20-54%20-20%20-21%20-32%20-25%20-52%20-20%20-65%2016%20-50%20111%2017%20104%2022%20-2%2036%20-11%2047%20-30z%20m28%20-250%20c17%20-17%2015%20-64%20-4%20-82%20-22%20-23%20-71%20-20%20-84%203%20-14%2026%20-13%2064%202%2079%207%207%2026%2012%2043%2012%2017%200%2036%20-5%2043%20-12z%20m650%20-210%20c396%20-242%20507%20-313%20510%20-330%202%20-12%20-3%20-18%20-13%20-18%20-19%200%20-618%20356%20-677%20402%20-40%2031%20-50%2058%20-22%2058%209%200%20100%20-51%20202%20-112z%20m-602%20-103%20c22%20-34%2012%20-69%20-26%20-85%20-60%20-25%20-107%2043%20-63%2092%2024%2027%2069%2023%2089%20-7z%20m84%20-186%20c5%20-35%2019%20-125%2030%20-199%2028%20-180%2055%20-377%2080%20-573%2012%20-89%2024%20-173%2027%20-186%20l6%20-25%20-33%2024%20-33%2023%207%20102%20c7%20102%207%20102%20-21%20135%20-30%2036%20-35%2086%20-18%20176%206%2036%203%2050%20-20%2093%20-26%2047%20-27%2055%20-21%20128%206%2070%205%2083%20-17%20123%20-13%2025%20-29%2082%20-36%20129%20-12%2084%20-12%2085%2011%20102%2012%2010%2024%2016%2026%2014%202%20-1%207%20-31%2012%20-66z%20m-82%20-205%20c24%20-17%2030%20-62%2010%20-82%20-7%20-7%20-24%20-12%20-38%20-12%20-33%200%20-50%2017%20-50%2051%200%2024%2030%2059%2050%2059%203%200%2016%20-7%2028%20-16z%20m-318%20-283%20c13%20-136%2013%20-164%202%20-169%20-7%20-2%20-17%20-1%20-21%204%20-7%207%20-31%20257%20-31%20319%200%2010%206%2015%2017%2013%2015%20-3%2020%20-27%2033%20-167z%20m358%2023%20c30%20-21%2029%20-59%20-3%20-80%20-23%20-15%20-27%20-15%20-50%200%20-32%2021%20-33%2059%20-3%2080%2012%209%2025%2016%2028%2016%203%200%2016%20-7%2028%20-16z%20m518%20-28%20c28%20-28%2034%20-42%2034%20-76%200%20-74%20-43%20-120%20-111%20-120%20-67%200%20-119%2049%20-119%20113%200%2049%2013%2073%2053%2097%2051%2032%20103%2026%20143%20-14z%20m-465%20-245%20c20%20-16%2022%20-23%2014%20-47%20-14%20-39%20-57%20-54%20-85%20-29%20-26%2024%20-26%2060%202%2079%2029%2021%2041%2020%2069%20-3z%20m480%20-127%20c32%20-16%2059%20-66%2059%20-109%200%20-104%20-144%20-151%20-210%20-68%20-49%2062%20-33%20143%2034%20174%2050%2023%2078%2024%20117%203z%20m-417%20-155%20c32%20-38%2033%20-70%204%20-103%20-37%20-40%20-64%20-42%20-98%20-7%20-40%2039%20-41%2091%20-4%20120%2037%2029%2068%2026%2098%20-10z%20m415%20-283%20c12%20-13%2025%20-42%2028%20-63%205%20-35%202%20-42%20-27%20-66%20-37%20-32%20-73%20-34%20-116%20-8%20-29%2018%20-63%2075%20-51%2087%203%203%2023%20-6%2045%20-21%2066%20-44%20105%201%2040%2046%20-18%2012%20-35%2024%20-38%2026%20-10%209%2027%2023%2061%2023%2025%200%2042%20-7%2058%20-24z%20m-804%20-53%20c6%20-49%2032%20-138%2060%20-205%206%20-15%202%20-18%20-24%20-18%20-17%200%20-31%202%20-31%204%200%203%20-13%2062%20-29%20132%20-17%2070%20-28%20131%20-25%20136%203%204%2013%208%2023%208%2015%200%2020%20-11%2026%20-57z%20m561%20-204%20c23%20-24%2029%20-39%2029%20-74%200%20-57%20-27%20-85%20-87%20-92%20-56%20-7%20-81%206%20-103%2053%20-14%2031%20-15%2043%20-6%2075%2014%2048%2044%2069%2096%2069%2033%200%2047%20-6%2071%20-31z'/%3e%3cpath%20d='M2435%203470%20c-4%20-12%203%20-112%2015%20-223%2011%20-111%2030%20-285%2040%20-387%2011%20-102%2031%20-288%2045%20-415%2013%20-126%2027%20-272%2031%20-323%205%20-61%2012%20-99%2022%20-108%2029%20-30%2037%20-10%2035%2087%20-1%2088%20-10%20183%20-83%20869%20-16%20151%20-34%20324%20-40%20385%20-6%2060%20-16%20115%20-22%20122%20-16%2019%20-36%2016%20-43%20-7z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M1820%204529%20c-116%20-11%20-122%20-13%20-118%20-41%202%20-14%2043%20-49%20128%20-109%20102%20-71%20144%20-94%20225%20-122%2055%20-19%20120%20-37%20144%20-40%2059%20-7%20183%20-70%20216%20-109%2036%20-43%2031%20-76%20-32%20-215%20-74%20-161%20-87%20-206%20-87%20-298%201%20-100%2028%20-167%2091%20-225%20l44%20-41%20-172%20-342%20c-94%20-188%20-175%20-346%20-180%20-351%20-4%20-5%20-32%20-9%20-61%20-10%20l-53%20-1%20-82%20-165%20c-45%20-91%20-82%20-172%20-83%20-180%200%20-8%2014%20-27%2032%20-42%20l33%20-27%20-163%20-323%20-162%20-323%20-62%20-2%20c-35%20-1%20-67%20-8%20-74%20-15%20-14%20-16%20-112%20-264%20-120%20-307%20-8%20-38%204%20-53%2067%20-88%2047%20-27%2048%20-29%2054%20-83%2016%20-140%2070%20-253%20162%20-341%20117%20-111%20254%20-165%20418%20-163%20173%202%20291%2052%20415%20174%2083%2082%20141%20177%20287%20465%20120%20238%20259%20497%20346%20645%20166%20284%20329%20460%20499%20540%2080%2038%20129%2039%20161%204%2035%20-38%20106%20-45%20137%20-14%2042%2042%2031%2072%20-246%20637%20-153%20315%20-159%20322%20-226%20308%20-53%20-12%20-72%20-81%20-43%20-156%204%20-12%20-35%20-52%20-138%20-142%20-169%20-148%20-245%20-227%20-339%20-354%20-77%20-104%20-188%20-284%20-244%20-395%20-20%20-40%20-52%20-90%20-70%20-111%20-19%20-20%20-34%20-48%20-34%20-61%200%20-14%20-24%20-73%20-53%20-133%20-30%20-59%20-62%20-130%20-73%20-156%20-16%20-41%20-84%20-114%20-84%20-90%200%204%2040%2091%2089%20193%20148%20307%20221%20460%20263%20555%2022%2050%2066%20149%2099%20220%2033%2072%2059%20139%2059%20151%200%2011%20-11%2030%20-23%2042%20-15%2014%20-24%2035%20-25%2056%20-1%2018%20-6%2045%20-11%2059%20-14%2037%20-5%2054%2034%2067%2019%206%2048%2027%2065%2046%2024%2028%2030%2043%2030%2082%20l0%2048%2082%2012%20c140%2020%20241%2085%20316%20202%2035%2055%20221%20432%20268%20543%2036%2084%2046%20149%2034%20220%20-42%20261%20-354%20373%20-553%20197%20-47%20-40%20-87%20-109%20-217%20-370%20-57%20-113%20-105%20-207%20-107%20-209%20-2%20-3%20-10%202%20-18%2010%20-12%2012%20-12%2022%201%2069%2022%2079%2015%20222%20-14%20276%20-41%2080%20-105%20120%20-294%20185%20-51%2018%20-103%2040%20-115%2050%20-13%209%20-70%2038%20-128%2063%20-115%2050%20-120%2051%20-295%2035z%20m280%20-94%20c47%20-21%2089%20-41%2093%20-45%2011%20-10%20-30%20-100%20-45%20-100%20-24%201%20-131%2040%20-167%2061%20-20%2012%20-65%2042%20-101%2068%20l-65%2046%2060%206%20c96%2010%20135%204%20225%20-36z%20m1249%20-18%20c54%20-25%20101%20-71%20127%20-123%2014%20-29%2019%20-60%2019%20-124%20l0%20-85%20-102%20-215%20c-186%20-394%20-230%20-460%20-340%20-515%20-60%20-31%20-203%20-49%20-203%20-26%200%206%2012%2011%2026%2011%2070%200%20143%2079%20130%20141%20-3%2016%20-1%2029%204%2029%2023%200%2082%2067%20108%20123%20219%20465%20232%20495%20232%20534%200%2056%20-35%2093%20-88%2093%20-23%200%20-49%20-7%20-61%20-17%20-11%20-10%20-80%20-146%20-152%20-303%20-72%20-157%20-140%20-297%20-151%20-312%20-11%20-16%20-29%20-28%20-41%20-28%20-27%200%20-83%20-33%20-95%20-57%20-10%20-19%20-15%20-52%20-13%20-90%201%20-12%2012%20-35%2026%20-52%2036%20-42%2020%20-67%20-47%20-73%20-109%20-11%20-153%20-123%20-81%20-208%2013%20-16%2022%20-34%2018%20-40%20-3%20-5%20-29%20-10%20-57%20-10%20-44%200%20-54%20-4%20-84%20-34%20-30%20-30%20-34%20-41%20-34%20-84%200%20-37%207%20-59%2026%20-88%2025%20-36%2025%20-40%2011%20-64%20-13%20-20%20-26%20-26%20-72%20-31%20-64%20-7%20-98%20-32%20-116%20-87%20-15%20-44%202%20-105%2038%20-138%2026%20-24%2026%20-25%2011%20-58%20-15%20-31%20-21%20-34%20-73%20-38%20-68%20-6%20-105%20-31%20-124%20-84%20-19%20-53%20-8%20-105%2031%20-150%2027%20-30%2029%20-38%2020%20-59%20-10%20-22%20-16%20-24%20-59%20-19%20-118%2013%20-202%20-106%20-143%20-201%2011%20-18%2032%20-40%2045%20-49%2029%20-19%2031%20-33%2010%20-62%20-13%20-19%20-19%20-20%20-54%20-11%20-51%2014%20-122%20-12%20-152%20-55%20-48%20-67%20-30%20-167%2037%20-209%2019%20-11%2034%20-24%2034%20-28%200%20-5%20-20%20-51%20-44%20-102%20-57%20-121%20-86%20-250%20-65%20-294%2026%20-55%20114%20-96%20174%20-81%2070%2018%20143%20132%20245%20384%20l34%2082%2043%20-49%20c26%20-29%2058%20-54%2079%20-61%2072%20-24%20169%2011%20214%2077%2021%2030%2025%2048%2025%20107%200%2061%20-4%2077%20-28%20112%20-40%2060%20-96%2087%20-163%2082%20-30%20-3%20-54%20-3%20-54%20-1%200%202%2014%2034%2031%2071%2017%2037%2038%2082%2046%20101%20l15%2035%2026%20-50%20c34%20-63%2091%20-94%20172%20-94%2070%200%20118%2025%20147%2076%2047%2082%2038%20181%20-21%20240%20-36%2036%20-132%2070%20-172%2060%20-13%20-4%20-24%20-3%20-24%200%200%204%2023%2050%2051%20103%2094%20176%20224%20361%20342%20488%2062%2066%20300%20273%20314%20273%205%200%2026%20-40%2047%20-88%2022%20-48%2086%20-181%20143%20-295%2057%20-115%20103%20-211%20103%20-213%200%20-2%20-11%20-4%20-25%20-4%20-74%200%20-226%20-91%20-348%20-209%20-165%20-159%20-279%20-343%20-592%20-951%20-205%20-400%20-235%20-449%20-320%20-535%20-77%20-77%20-160%20-124%20-256%20-145%20-73%20-16%20-227%20-8%20-299%2016%20l-55%2018%2046%207%20c122%2019%20186%20108%20160%20223%20-33%20142%20-170%20190%20-295%20103%20-54%20-38%20-81%20-137%20-55%20-204%20l10%20-28%20-31%2030%20c-17%2017%20-48%2063%20-68%20103%20-33%2069%20-36%2081%20-40%20185%20-6%20173%204%20202%20195%20582%2091%20182%20201%20398%20244%20480%20149%20287%20431%20844%20760%201503%20182%20365%20345%20679%20362%20698%2077%2088%20205%20113%20316%2061z%20m-988%20-103%20c124%20-43%20155%20-58%20192%20-93%2040%20-36%2056%20-70%2063%20-133%209%20-75%20-8%20-142%20-66%20-268%20-75%20-161%20-89%20-247%20-51%20-318%209%20-18%208%20-29%20-9%20-61%20-11%20-22%20-24%20-42%20-29%20-45%20-14%20-9%20-77%2067%20-91%20109%20-22%2068%20-9%20178%2035%20275%20109%20245%20120%20283%2091%20339%20-8%2015%20-31%2040%20-50%2055%20-38%2029%20-173%2096%20-193%2096%20-19%200%20-23%2016%20-12%2049%206%2017%2012%2031%2014%2031%202%200%2050%20-16%20106%20-36z%20m922%20-135%20c6%20-10%20-10%20-54%20-54%20-149%20-34%20-74%20-88%20-195%20-120%20-269%20-56%20-128%20-97%20-191%20-125%20-191%20-28%200%20-22%2025%2037%20152%2034%2073%2095%20205%20135%20292%2041%2087%2079%20165%2085%20173%2014%2016%2029%2013%2042%20-8z%20m-644%20-393%20c10%20-11%201%20-37%20-41%20-123%20-40%20-81%20-54%20-102%20-56%20-84%20-5%2032%2012%2095%2043%20164%2028%2060%2035%2066%2054%2043z%20m283%20-263%20c26%20-23%2024%20-78%20-4%20-97%20-46%20-33%20-108%20-7%20-108%2045%200%2057%2070%2090%20112%2052z%20m-157%20-263%20c36%20-14%2049%20-53%2030%20-90%20-20%20-39%20-59%20-49%20-93%20-23%20-54%2040%20-35%20116%2030%20122%204%201%2018%20-3%2033%20-9z%20m633%20-3%20c6%20-7%2034%20-64%2062%20-127%2029%20-63%20115%20-242%20191%20-397%2076%20-155%20139%20-289%20139%20-298%200%20-29%20-30%20-15%20-57%2028%20-44%2069%20-255%20492%20-310%20622%20-59%20141%20-71%20185%20-50%20185%208%200%2019%20-6%2025%20-13z%20m-734%20-269%20c34%20-49%208%20-108%20-47%20-108%20-17%200%20-39%207%20-49%2017%20-22%2020%20-24%2076%20-2%2097%2024%2024%2080%2020%2098%20-6z%20m56%20-142%20c0%20-2%20-14%20-35%20-31%20-73%20-17%20-37%20-59%20-133%20-94%20-213%20-34%20-80%20-98%20-217%20-140%20-305%20-115%20-237%20-332%20-701%20-339%20-723%20-7%20-22%2016%20-47%2037%20-39%207%202%2034%2048%2062%20101%2027%2053%2051%2096%2055%2096%203%200%204%20-24%204%20-52%20-1%20-55%20-54%20-188%20-150%20-379%20-59%20-119%20-86%20-149%20-133%20-149%20-106%200%20-109%2091%20-9%20300%2042%2089%2055%20109%2086%20125%2026%2014%2045%2036%2064%2075%2024%2049%2026%2060%2017%2095%20-14%2056%2021%20138%2071%20163%2019%209%2045%2033%2058%2052%2020%2030%2023%2043%2018%2090%20-9%2081%20-9%2084%2011%20125%2013%2027%2028%2041%2056%2050%2053%2018%2065%2030%2084%2091%2015%2049%2015%2056%200%2095%20-15%2039%20-15%2043%205%2085%2013%2028%2027%2044%2038%2044%2024%200%2077%2045%2095%2081%2019%2037%2019%2099%200%20126%20-14%2020%20-14%2026%204%2062%2016%2030%2028%2040%2055%2045%2019%204%2039%2013%2046%2021%2011%2014%2030%2020%2030%2011z%20m-203%20-158%20c29%20-27%2029%20-65%201%20-95%20-43%20-46%20-128%20-14%20-128%2049%200%2062%2079%2091%20127%2046z%20m-482%20-133%20c-1%20-17%20-139%20-285%20-148%20-285%20-23%200%20-11%2040%2049%20164%2049%2098%2072%20136%2083%20134%209%20-2%2016%20-8%2016%20-13z%20m314%20-170%20c31%20-16%2041%20-33%2041%20-74%200%20-45%20-26%20-71%20-71%20-71%20-55%200%20-81%2028%20-77%2083%203%2037%207%2044%2038%2059%2042%2021%2035%2021%2069%203z%20m399%20-246%20c74%20-36%2099%20-100%2067%20-175%20-36%20-86%20-186%20-89%20-230%20-4%20-18%2034%20-20%20116%20-3%20126%206%204%2017%20-1%2025%20-12%2029%20-41%2043%20-54%2058%20-54%2028%200%2029%2032%202%2080%20-15%2026%20-24%2050%20-20%2054%2013%2012%2057%206%20101%20-15z%20m-554%20-70%20c35%20-16%2052%20-61%2037%20-98%20-12%20-27%20-47%20-51%20-76%20-51%20-7%200%20-27%2012%20-44%2026%20-39%2033%20-41%2074%20-6%20109%2026%2027%2051%2031%2089%2014z%20m-145%20-329%20c10%20-5%2024%20-23%2031%20-40%2033%20-80%20-73%20-148%20-135%20-85%20-67%2066%2020%20171%20104%20125z%20m516%20-51%20c62%20-55%2068%20-138%2013%20-196%20-59%20-63%20-171%20-42%20-208%2039%20-22%2048%20-24%2066%20-10%2088%208%2012%2015%209%2045%20-20%2028%20-27%2039%20-32%2052%20-24%2030%2019%2026%2034%20-18%2075%20-42%2039%20-43%2041%20-25%2055%2011%208%2041%2014%2068%2014%2039%200%2054%20-6%2083%20-31z%20m-1065%20-187%20c0%20-4%20-16%20-47%20-36%20-95%20-19%20-48%20-40%20-116%20-46%20-150%20-7%20-34%20-13%20-63%20-14%20-65%20-6%20-9%20-54%2032%20-54%2046%200%209%2020%2066%2044%20127%2024%2060%2046%20118%2049%20128%206%2017%2057%2025%2057%209z%20m349%20-540%20c56%20-41%2060%20-141%208%20-190%20-35%20-33%20-104%20-38%20-145%20-12%20-80%2050%20-73%20184%2012%20221%2031%2013%2095%203%20125%20-19z'/%3e%3cpath%20d='M2838%203927%20c-8%20-12%20-22%20-42%20-32%20-67%20-10%20-25%20-97%20-202%20-194%20-395%20-292%20-577%20-485%20-982%20-478%20-1000%2017%20-44%2044%20-4%20168%20245%20489%20980%20590%201189%20584%201208%20-10%2030%20-32%2034%20-48%209z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4051%204519%20c-24%20-22%20-51%20-77%20-51%20-103%200%20-7%209%20-24%2019%20-37%2015%20-19%2029%20-24%2063%20-24%2023%200%2045%20-4%2047%20-10%202%20-5%20-27%20-27%20-64%20-47%20-63%20-35%20-69%20-37%20-81%20-20%20-8%2010%20-9%2021%20-3%2027%2017%2018%209%2065%20-16%2090%20-18%2019%20-35%2025%20-69%2025%20-64%200%20-106%20-38%20-113%20-100%20-6%20-62%2012%20-85%2068%20-85%2023%200%2044%20-5%2046%20-11%202%20-7%20-26%20-29%20-63%20-49%20-76%20-43%20-88%20-38%20-78%2033%205%2036%203%2047%20-17%2068%20-18%2019%20-32%2024%20-74%2024%20-72%200%20-115%20-41%20-115%20-111%200%20-48%2028%20-73%2082%20-74%2050%200%2059%20-18%2018%20-35%20-17%20-7%20-42%20-26%20-55%20-42%20-23%20-27%20-25%20-36%20-22%20-124%20l2%20-95%20-150%20-147%20c-368%20-361%20-1122%20-1073%20-1140%20-1078%20-59%20-15%20-108%2039%20-107%20119%201%2063%2017%20102%2073%20182%2051%2073%2089%20151%2089%20185%200%2038%20-36%2090%20-75%20106%20-46%2019%20-101%2018%20-167%20-4%20-160%20-53%20-305%20-197%20-404%20-400%20-25%20-53%20-68%20-143%20-96%20-199%20-57%20-119%20-119%20-188%20-205%20-228%20-31%20-15%20-125%20-50%20-208%20-77%20-82%20-27%20-184%20-67%20-226%20-89%20-185%20-96%20-315%20-261%20-355%20-451%20-39%20-181%2026%20-396%20183%20-606%2080%20-106%20291%20-317%20392%20-391%20100%20-74%20222%20-134%20311%20-155%2080%20-19%20238%20-20%20305%20-2%20126%2033%20255%20128%20335%20246%2080%20117%20125%20228%20175%20429%2045%20178%2067%20204%20246%20275%20169%2068%20278%20156%20334%20270%2069%20142%2022%20286%20-94%20286%20-19%200%20-74%20-18%20-123%20-41%20-89%20-41%20-161%20-53%20-216%20-35%20-26%209%20-52%2054%20-52%2091%200%2029%20113%20154%20475%20525%20116%20119%20369%20381%20563%20583%20195%20202%20364%20375%20377%20383%2016%2010%2046%2015%2087%2015%2035%200%2079%204%2099%209%2054%2015%20109%2078%20174%20201%2072%20136%20106%20169%20176%20169%20215%200%20273%20304%2076%20399%20-50%2024%20-120%2027%20-157%206%20-14%20-8%20-33%20-14%20-42%20-15%20-22%200%20-32%2034%20-16%2059%2017%2027%200%2072%20-32%2088%20-40%2020%20-103%2016%20-129%20-8z%20m100%20-39%20c17%20-10%2018%20-13%204%20-34%20-8%20-12%20-13%20-25%20-10%20-28%203%20-2%20-15%20-5%20-40%20-5%20-37%200%20-45%204%20-45%2019%200%2022%2034%2058%2056%2058%208%200%2024%20-5%2035%20-10z%20m-231%20-120%20c16%20-8%2017%20-14%208%20-38%20-10%20-25%20-16%20-29%20-55%20-29%20-49%200%20-54%2011%20-22%2051%2022%2028%2039%2032%2069%2016z%20m495%20-35%20c86%20-50%2098%20-165%2025%20-237%20-34%20-34%20-43%20-38%20-89%20-38%20-104%200%20-145%20-36%20-234%20-209%20-31%20-58%20-69%20-119%20-86%20-135%20-28%20-27%20-39%20-30%20-125%20-36%20-52%20-3%20-101%20-12%20-109%20-19%20-12%20-9%20-17%20-9%20-22%200%20-5%207%2089%20106%20249%20263%20272%20268%20284%20285%20234%20320%20-32%2023%20-54%2020%20-77%20-10%20-26%20-34%20-26%20-49%200%20-75%20l22%20-22%20-228%20-225%20c-198%20-195%20-229%20-222%20-241%20-210%20-13%2013%203%2034%20124%20164%2076%2082%20153%20164%20171%20181%2038%2038%2037%2058%20-2%2087%20-26%2019%20-30%2019%20-55%205%20-33%20-18%20-42%20-68%20-16%20-93%2019%20-19%2031%20-4%20-185%20-228%20-70%20-72%20-91%20-85%20-91%20-54%200%206%2034%2054%2075%20106%2041%2052%2075%20101%2075%20109%200%2047%20-77%2069%20-104%2029%20-21%20-30%20-20%20-55%203%20-75%2019%20-15%2018%20-18%20-27%20-79%20-26%20-35%20-52%20-63%20-58%20-64%20-6%200%20-9%2037%20-8%20107%202%2097%204%20109%2024%20125%2023%2019%20233%20130%20495%20262%20167%2085%20195%2090%20260%2051z%20m-715%20-85%20c12%20-7%2012%20-12%202%20-22%20-6%20-6%20-12%20-20%20-12%20-30%200%20-16%20-3%20-17%20-20%20-8%20-14%208%20-25%207%20-39%20-2%20-29%20-18%20-37%20-3%20-18%2037%2013%2028%2023%2035%2044%2035%2016%200%2035%20-5%2043%20-10z%20m538%20-52%20c-3%20-7%20-11%20-13%20-18%20-13%20-7%200%20-15%206%20-17%2013%20-3%207%204%2012%2017%2012%2013%200%2020%20-5%2018%20-12z%20m-225%20-113%20c1%20-5%20-6%20-11%20-15%20-13%20-11%20-2%20-18%203%20-18%2013%200%2017%2030%2018%2033%200z%20m-225%20-113%20c2%20-7%20-6%20-12%20-17%20-12%20-21%200%20-27%2011%20-14%2024%209%209%2026%202%2031%20-12z%20m-568%20-603%20c-901%20-890%20-1160%20-1140%20-1170%20-1134%20-5%203%20-10%2012%20-10%2018%200%207%2071%2079%20158%20161%2086%2082%20274%20263%20417%20401%20596%20577%20981%20944%20990%20944%206%200%20-168%20-175%20-385%20-390z%20m430%20349%20c0%20-7%20-168%20-181%20-373%20-387%20-206%20-207%20-550%20-554%20-765%20-771%20l-391%20-395%20-21%2020%20-20%2021%2097%2094%20c134%20129%201067%201044%201283%201257%2096%2095%20178%20173%20183%20173%204%200%207%20-5%207%20-12z%20m50%20-35%20c0%20-4%20-44%20-52%20-97%20-107%20-54%20-56%20-154%20-159%20-223%20-231%20-412%20-426%20-839%20-866%20-1009%20-1037%20-186%20-188%20-196%20-197%20-214%20-181%20-17%2016%2018%2053%20755%20790%20425%20425%20776%20773%20780%20773%205%200%208%20-3%208%20-7z%20m-177%20-270%20c-121%20-126%20-316%20-330%20-434%20-454%20-118%20-125%20-309%20-325%20-424%20-445%20-116%20-121%20-261%20-273%20-323%20-339%20-104%20-111%20-113%20-118%20-129%20-103%20-15%2016%20-2%2031%20193%20230%20115%20117%20310%20316%20434%20443%20283%20289%20690%20704%20797%20812%2044%2046%2087%2083%2093%2083%207%200%20-86%20-102%20-207%20-227z%20m-1289%20-273%20c14%20-5%2030%20-18%2036%20-30%2014%20-25%20-9%20-80%20-70%20-170%20-77%20-114%20-100%20-195%20-80%20-280%2012%20-51%2064%20-110%2095%20-110%208%200%2015%20-4%2015%20-8%200%20-11%20-69%20-77%20-74%20-71%20-2%202%20-11%2018%20-20%2036%20-34%2067%20-93%2064%20-138%20-5%20-84%20-128%20-105%20-155%20-160%20-198%20-33%20-26%20-128%20-80%20-210%20-121%20-166%20-82%20-228%20-131%20-264%20-208%20-41%20-87%20-28%20-166%2041%20-250%20l34%20-42%20-144%20-143%20-143%20-143%20-27%2021%20c-34%2027%20-40%2024%20-129%20-67%20-67%20-67%20-69%20-71%20-56%20-96%2019%20-36%20275%20-285%20293%20-285%2016%200%2057%2030%20120%2089%2056%2052%2060%2064%2036%2095%20l-21%2026%2031%2038%20c16%2020%2080%2087%20141%20147%20l112%20110%2059%20-65%20c76%20-83%2093%20-120%2093%20-195%200%20-69%20-16%20-106%20-76%20-171%20-54%20-58%20-107%20-88%20-214%20-118%20-99%20-28%20-130%20-52%20-119%20-95%2021%20-85%20177%20-144%20319%20-121%2092%2015%20179%2061%20250%20132%2092%2094%20148%20210%20222%20460%2019%2068%2045%20145%2056%20171%2029%2067%2092%20119%20185%20152%20111%2039%20226%20101%20274%20147%2045%2044%2092%20135%2087%20169%20-7%2046%20-32%2047%20-115%204%20-71%20-36%20-85%20-40%20-153%20-40%20-85%200%20-133%2020%20-188%2076%20-36%2037%20-38%2046%20-16%2074%2016%2020%2016%2020%2027%201%2028%20-46%2071%20-86%20104%20-97%2059%20-19%20147%20-4%20240%2041%2084%2041%2099%2045%20128%2034%2020%20-8%2045%20-56%2045%20-88%200%20-48%20-41%20-135%20-88%20-187%20-60%20-67%20-119%20-104%20-259%20-164%20-185%20-78%20-219%20-120%20-277%20-333%20-65%20-241%20-131%20-376%20-235%20-479%20-100%20-99%20-207%20-143%20-346%20-143%20-199%201%20-375%2088%20-597%20299%20-369%20349%20-481%20666%20-335%20946%2019%2036%2063%2092%20112%20141%2096%2096%20157%20130%20365%20199%20326%20109%20358%20137%20511%20450%20139%20284%20246%20404%20406%20455%2068%2022%2083%2023%20117%2010z%20m-121%20-658%20l20%20-34%20-82%20-82%20c-74%20-75%20-81%20-85%20-81%20-121%200%20-38%20-6%20-45%20-112%20-146%20l-113%20-106%20-39%2033%20c-39%2033%20-39%2033%20-68%2016%20-17%20-9%20-43%20-32%20-59%20-50%20-32%20-36%20-30%20-52%2017%20-102%20l24%20-26%20-75%20-74%20c-85%20-84%20-86%20-84%20-139%20-11%20-26%2036%20-31%2051%20-30%2099%200%2067%2017%20103%2072%20158%2042%2040%2084%2064%20235%20133%20157%2071%20253%20153%20312%20263%2037%2070%2055%2089%2079%2086%2011%20-2%2029%20-18%2039%20-36z%20m-89%20-314%20c9%20-15%20-6%20-35%20-101%20-130%20l-113%20-113%20-22%2023%20-23%2022%20110%20110%20c61%2061%20116%20109%20124%20108%208%20-2%2019%20-11%2025%20-20z%20m61%20-58%20c15%20-17%2016%20-22%205%20-37%20-19%20-26%20-214%20-213%20-221%20-213%20-4%200%20-14%2012%20-24%2026%20l-17%2027%20108%20108%20c60%2060%20114%20109%20120%20109%206%200%2019%20-9%2029%20-20z%20m65%20-77%20c0%20-8%20-74%20-90%20-164%20-181%20-133%20-134%20-167%20-165%20-177%20-154%20-11%2010%20-4%2021%2034%2060%2026%2026%2047%2054%2047%2062%200%208%2053%2067%20117%20132%2090%2090%20120%20115%20130%20106%207%20-6%2013%20-17%2013%20-25z%20m86%20-37%20c22%20-1%2039%20-11%2063%20-38%2018%20-21%2058%20-50%2089%20-65%2047%20-23%2070%20-28%20133%20-28%2069%200%2084%204%20148%2038%2040%2020%2074%2037%2076%2037%2011%200%204%20-33%20-14%20-69%20-42%20-81%20-130%20-142%20-293%20-201%20-106%20-38%20-166%20-77%20-203%20-130%20-17%20-25%20-47%20-103%20-75%20-198%20-66%20-218%20-104%20-313%20-164%20-401%20-93%20-136%20-197%20-194%20-351%20-195%20-103%200%20-171%2023%20-201%2069%20-25%2039%20-10%2054%2073%2075%2098%2025%20167%2063%20228%20124%2069%2069%2095%20125%2095%20205%200%2079%20-15%20110%20-97%20206%20-62%2074%20-64%2077%20-47%2096%2017%2018%2018%2018%2060%20-21%2024%20-22%2049%20-40%2055%20-40%2022%200%2099%2071%20105%2096%205%2021%20-1%2034%20-37%2070%20l-43%2044%20169%20170%20c121%20121%20174%20168%20185%20163%208%20-4%2029%20-7%2046%20-7z%20m-545%20-15%20l24%20-20%20-32%20-33%20-33%20-33%20-27%2028%20-28%2028%2028%2025%20c34%2029%2038%2029%2068%205z%20m49%20-116%20l-34%20-35%20-20%2020%20-20%2020%2034%2035%2034%2035%2020%20-20%2020%20-20%20-34%20-35z%20m85%20-15%20c17%20-19%2017%20-21%20-11%20-52%20-16%20-18%20-55%20-57%20-87%20-87%20l-58%20-55%20-22%2022%20-22%2022%2039%2036%20c37%2034%2040%2035%2053%2018%209%20-13%2016%20-15%2024%20-7%207%207%206%2015%20-5%2026%20-21%2021%20-21%2021%2015%2062%2036%2040%2049%2043%2074%2015z%20m-204%20-79%20c-21%20-25%20-42%20-56%20-45%20-67%20-4%20-12%20-15%20-29%20-26%20-39%20-19%20-17%20-21%20-17%20-40%200%20-11%2010%20-20%2023%20-20%2029%200%206%2032%2041%2072%2078%2054%2050%2076%2064%2085%2056%2010%20-8%204%20-21%20-26%20-57z%20m151%20-96%20c10%20-23%208%20-29%20-15%20-52%20-26%20-26%20-27%20-26%20-46%20-9%20-21%2019%20-21%2019%207%2052%2033%2040%2039%2041%2054%209z%20m-287%20-35%20c19%20-21%2017%20-23%20-125%20-165%20l-145%20-145%20-25%2025%20-25%2026%20140%20139%20c77%2077%20145%20139%20151%20140%206%200%2019%20-9%2029%20-20z%20m133%20-3%20l22%20-24%20-20%20-18%20c-19%20-17%20-21%20-17%20-40%200%20-29%2026%20-26%2065%205%2065%206%200%2021%20-10%2033%20-23z%20m227%20-37%20l29%20-30%20-31%20-31%20-30%20-31%20-34%2030%20-34%2031%2029%2030%20c17%2017%2033%2031%2036%2031%203%200%2019%20-14%2035%20-30z%20m-295%20-25%20l23%20-25%20-128%20-132%20c-71%20-73%20-135%20-139%20-142%20-147%20-11%20-13%20-16%20-12%20-38%209%20-14%2013%20-25%2027%20-25%2032%200%2010%20270%20288%20280%20288%204%200%2017%20-11%2030%20-25z%20m125%20-35%20l-19%20-21%20-20%2020%20c-19%2020%20-19%2021%20-1%2041%20l19%2021%2020%20-20%20c19%20-20%2019%20-21%201%20-41z%20m-60%20-30%20c19%20-21%2017%20-22%20-120%20-160%20-77%20-77%20-145%20-140%20-151%20-140%20-6%200%20-17%207%20-24%2015%20-10%2012%2011%2039%20126%20160%2076%2080%20141%20145%20144%20145%204%200%2015%20-9%2025%20-20z%20m-504%20-142%20c1%20-7%201%20-19%200%20-25%20-1%20-7%206%20-13%2015%20-13%2010%200%2026%20-8%2036%20-17%2018%20-16%2018%20-17%20-8%20-44%20-37%20-38%20-21%20-59%2017%20-23%20l29%2028%2026%20-25%2025%20-26%20-27%20-32%20c-34%20-41%20-23%20-53%2016%20-16%20l30%2029%2025%20-24%20c17%20-16%2022%20-27%2015%20-35%20-12%20-15%20-3%20-25%2016%20-18%2027%2010%2012%20-12%20-38%20-56%20l-49%20-45%20-124%20124%20-125%20125%2052%2052%20c54%2054%2067%2062%2069%2041z'/%3e%3cpath%20d='M1914%201153%20c-26%20-18%20-35%20-53%20-22%20-81%2011%20-23%2020%20-27%2053%20-27%2032%200%2042%205%2054%2027%2014%2025%2014%2029%20-5%2055%20-21%2028%20-59%2040%20-80%2026z%20m46%20-59%20c0%20-14%20-21%20-19%20-33%20-7%20-9%209%2013%2034%2024%2027%205%20-3%209%20-12%209%20-20z'/%3e%3cpath%20d='M1762%20944%20c-27%20-19%20-29%20-64%20-4%20-87%2058%20-53%20137%2028%2082%2083%20-24%2024%20-48%2025%20-78%204z%20m54%20-35%20c10%20-17%20-13%20-36%20-27%20-22%20-12%2012%20-4%2033%2011%2033%205%200%2012%20-5%2016%20-11z'/%3e%3cpath%20d='M1563%20859%20c-29%20-11%20-41%20-55%20-20%20-76%2019%20-19%2066%20-20%2078%20-2%2026%2040%20-15%2095%20-58%2078z%20m32%20-49%20c-3%20-5%20-10%20-10%20-16%20-10%20-5%200%20-9%205%20-9%2010%200%206%207%2010%2016%2010%208%200%2012%20-4%209%20-10z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4260%204540%20c-8%20-5%20-36%20-10%20-61%20-10%20-79%200%20-129%20-57%20-129%20-149%200%20-44%20-3%20-52%20-31%20-71%20-29%20-21%20-31%20-21%20-50%20-5%20-12%2011%20-19%2031%20-19%2052%200%2045%20-14%2069%20-50%2088%20-66%2034%20-120%205%20-120%20-64%200%20-51%2030%20-88%2078%20-97%2039%20-7%2072%20-29%2072%20-48%20-1%20-6%20-20%20-28%20-44%20-48%20-41%20-35%20-44%20-36%20-65%20-21%20-17%2011%20-21%2022%20-17%2038%2013%2051%20-44%20115%20-102%20115%20-36%200%20-72%20-43%20-72%20-85%200%20-44%2045%20-95%2083%20-95%2014%200%2035%20-8%2047%20-18%20l23%20-19%20-30%20-44%20c-29%20-42%20-554%20-559%20-568%20-559%20-3%200%20-27%2014%20-51%2031%20-167%20114%20-404%20166%20-567%20124%20-171%20-44%20-286%20-144%20-404%20-347%20-43%20-75%20-89%20-124%20-155%20-163%20-47%20-29%20-50%20-73%20-9%20-121%2025%20-27%2031%20-44%2031%20-78%200%20-118%20-217%20-317%20-364%20-333%20-79%20-9%20-116%204%20-168%2059%20-63%2066%20-84%2062%20-129%20-23%20-39%20-72%20-55%20-84%20-206%20-156%20-217%20-102%20-347%20-222%20-439%20-405%20-49%20-97%20-67%20-183%20-67%20-313%201%20-235%2095%20-441%20313%20-683%20l92%20-103%20-34%20-39%20c-18%20-21%20-88%20-98%20-156%20-170%20-67%20-73%20-122%20-140%20-122%20-149%200%20-20%2019%20-41%2037%20-41%207%200%2085%2078%20174%20174%20l161%20174%20104%20-78%20c266%20-201%20522%20-290%20743%20-260%20303%2041%20497%20224%20641%20605%2036%2094%2082%20153%20146%20186%2054%2029%2051%2055%20-15%20119%20-76%2072%20-90%20115%20-67%20209%2020%2081%2077%20169%20160%20250%2095%2091%20149%20104%20209%2051%2058%20-51%2097%20-38%20132%2045%2022%2055%2056%2088%20154%20152%20179%20116%20282%20267%20311%20456%2026%20172%20-22%20334%20-160%20549%20l-40%2060%2019%2027%20c11%2014%2090%20109%20177%20211%2086%20102%20189%20222%20228%20268%2043%2050%2077%2082%2089%2082%2011%200%2034%2016%2053%2037%2028%2030%2036%2034%2049%2023%208%20-7%2015%20-28%2015%20-48%200%20-80%20102%20-125%20149%20-66%2030%2038%2027%2080%20-8%20115%20-17%2016%20-40%2029%20-54%2029%20-13%200%20-36%209%20-51%2021%20l-26%2021%2036%2044%2037%2045%2023%20-22%20c15%20-14%2024%20-34%2024%20-51%200%20-40%2015%20-65%2050%20-83%2039%20-20%2062%20-19%2092%205%2066%2051%2025%20160%20-60%20160%20-17%200%20-38%2010%20-52%2025%20-32%2034%20-14%2055%2048%2055%2085%200%20130%2049%20131%20145%200%2017%203%2049%207%2072%205%2038%202%2047%20-26%2083%20-49%2061%20-110%2086%20-150%2060z%20m88%20-87%20c35%20-26%2042%20-62%2017%20-83%20-12%20-10%20-14%20-24%20-9%20-55%207%20-51%20-14%20-80%20-53%20-70%20-13%203%20-31%201%20-41%20-4%20-13%20-7%20-30%203%20-75%2043%20l-58%2052%207%2052%20c9%2071%2024%2090%2058%2074%2022%20-10%2032%20-9%2063%208%2039%2020%2040%2020%2091%20-17z%20m-443%20-83%20c0%20-22%20-39%20-19%20-43%203%20-3%2015%201%2018%2020%2015%2012%20-2%2023%20-10%2023%20-18z%20m275%20-170%20c0%20-3%20-50%20-63%20-111%20-134%20l-112%20-128%20-53%2053%20c-46%2046%20-51%2054%20-40%2070%207%2010%2063%2063%20126%20119%20l113%20101%2039%20-38%20c21%20-20%2038%20-40%2038%20-43z%20m-420%2024%20c0%20-21%20-21%20-27%20-38%20-11%20-13%2013%20-13%2019%20-2%2032%2010%2012%2016%2013%2026%204%208%20-6%2014%20-17%2014%20-25z%20m570%20-220%20c0%20-19%20-39%20-18%20-47%202%20-3%209%200%2020%208%2024%2015%2010%2039%20-6%2039%20-26z%20m-625%20-126%20c-121%20-127%20-542%20-555%20-922%20-938%20-313%20-315%20-344%20-343%20-358%20-329%20-15%2015%2043%2074%20665%20683%20375%20366%20685%20666%20688%20666%203%200%20-30%20-37%20-73%20-82z%20m104%2045%20c-20%20-21%20-175%20-186%20-345%20-368%20-468%20-500%20-929%20-988%20-947%20-1004%20-14%20-11%20-20%20-11%20-32%20-1%20-9%207%20-15%2019%20-13%2025%202%207%20251%20264%20553%20570%20303%20307%20606%20616%20674%20687%2068%2070%20128%20128%20134%20128%206%200%20-5%20-17%20-24%20-37z%20m50%20-10%20c-7%20-10%20-52%20-60%20-99%20-112%20-47%20-52%20-107%20-119%20-135%20-151%20-27%20-31%20-131%20-146%20-230%20-256%20-99%20-109%20-261%20-289%20-360%20-399%20-456%20-507%20-464%20-516%20-485%20-502%20-11%206%20-20%2016%20-20%2020%200%2010%2056%2070%20846%20907%20142%20151%20309%20327%20369%20392%2061%2064%20114%20117%20119%20117%205%201%202%20-7%20-5%20-16z%20m25%20-24%20c-4%20-6%20-173%20-205%20-377%20-443%20-204%20-237%20-486%20-565%20-626%20-729%20-253%20-294%20-256%20-297%20-275%20-278%20-19%2019%20-19%2020%2025%2068%20200%20221%20975%201082%201098%201220%20142%20159%20174%20192%20155%20162z%20m306%20-4%20c10%20-12%2010%20-19%202%20-27%20-15%20-15%20-48%2014%20-38%2031%2010%2015%2021%2014%2036%20-4z%20m-1270%20-311%20c77%20-26%20210%20-94%20227%20-117%207%20-9%20-106%20-125%20-404%20-416%20-227%20-222%20-413%20-409%20-413%20-414%200%20-6%2012%20-24%2027%20-39%20l27%20-29%20-157%20-156%20-156%20-157%20-29%2027%20c-53%2051%20-97%20-1%20-46%20-54%20l28%20-29%20-20%20-22%20c-70%20-79%20-166%20-192%20-208%20-245%20l-49%20-62%20-25%2019%20c-13%2011%20-33%2020%20-43%2020%20-28%200%20-73%20-67%20-152%20-222%20-91%20-180%20-149%20-256%20-327%20-433%20l-141%20-140%20-36%2040%20c-132%20148%20-228%20319%20-264%20470%20-17%2073%20-20%20110%20-16%20195%208%20168%2059%20293%20175%20420%2076%2085%20136%20126%20306%20210%20150%2075%20181%2099%20225%20177%208%2015%2013%2013%2044%20-14%2050%20-43%2096%20-56%20186%20-51%2064%204%2088%2011%20151%2043%20138%2072%20290%20256%20290%20349%200%2036%20-30%20105%20-53%20125%20-15%2012%20-13%2016%2025%2040%2055%2035%2097%2083%20146%20168%2096%20163%20158%20228%20277%20284%20115%2054%20265%2059%20405%2013z%20m600%20-519%20c61%20-122%2080%20-194%2080%20-305%200%20-67%20-6%20-102%20-28%20-166%20-48%20-137%20-118%20-220%20-269%20-322%20-95%20-64%20-135%20-104%20-161%20-162%20-9%20-19%20-17%20-36%20-18%20-38%20-1%20-2%20-19%209%20-40%2023%20-33%2023%20-47%2026%20-95%2023%20-47%20-3%20-66%20-11%20-122%20-51%20-118%20-85%20-200%20-199%20-233%20-327%20-27%20-108%20-8%20-186%2064%20-256%2026%20-26%2033%20-38%2023%20-42%20-26%20-9%20-92%20-76%20-111%20-111%20-10%20-20%20-34%20-77%20-53%20-127%20-69%20-179%20-130%20-277%20-230%20-371%20-131%20-122%20-276%20-171%20-477%20-160%20-143%208%20-256%2047%20-418%20145%20-75%2045%20-182%20120%20-182%20128%200%207%20207%20268%20254%20321%2058%2064%20163%20144%20281%20213%20121%2071%20183%20117%20190%20141%205%2015%20-1%2029%20-21%2050%20l-28%2029%20124%20127%20c68%2071%20136%20141%20151%20158%20l28%2029%2024%20-22%20c27%20-26%2050%20-28%2067%20-7%2011%2013%208%2021%20-18%2048%20l-32%2033%2047%2054%20c26%2030%2092%20106%20146%20168%20l99%20112%2030%20-25%20c16%20-14%2033%20-25%2038%20-25%205%200%20105%20112%20222%20248%20117%20136%20290%20336%20383%20444%20l170%20196%2032%20-36%20c18%20-20%2055%20-82%2083%20-137z%20m-1140%20-602%20c-247%20-265%20-249%20-267%20-271%20-247%20-20%2018%20-18%2020%20138%20176%20138%20138%20159%20156%20172%20143%2013%20-12%208%20-22%20-39%20-72z%20m95%2024%20c17%20-13%209%20-23%20-95%20-138%20-62%20-68%20-131%20-144%20-153%20-168%20l-39%20-43%20-21%2020%20-20%2021%20149%20159%20c82%2088%20152%20160%20155%20161%203%201%2013%20-5%2024%20-12z%20m39%20-100%20c-108%20-127%20-258%20-297%20-262%20-297%20-3%200%20-14%207%20-24%2016%20-17%2016%20-15%2020%2045%2087%2034%2039%20102%20113%20151%20164%2079%2083%2091%2092%20104%2079%2013%20-13%2011%20-19%20-14%20-49z%20m-442%20-252%20c-4%20-6%20-68%20-80%20-142%20-163%20-101%20-112%20-138%20-148%20-147%20-140%20-7%206%20-13%2014%20-13%2019%200%2010%2079%20109%20187%20232%2081%2094%2086%2097%20104%2081%2010%20-9%2015%20-22%2011%20-29z%20m68%20-48%20c0%20-16%20-281%20-307%20-296%20-307%20-41%200%20-18%2038%20117%20189%20135%20151%20144%20159%20161%20144%2010%20-9%2018%20-20%2018%20-26z%20m32%20-94%20c-17%20-21%20-83%20-90%20-146%20-153%20-93%20-92%20-119%20-113%20-132%20-105%20-8%206%20-16%2014%20-16%2019%200%204%2064%2077%20143%20162%20141%20150%20144%20153%20163%20134%2019%20-18%2018%20-19%20-12%20-57z%20m-381%20-265%20c54%20-51%2099%20-96%2099%20-99%200%20-4%20-32%20-27%20-71%20-51%20-266%20-162%20-341%20-230%20-526%20-471%20-42%20-54%20-83%20-102%20-93%20-107%20-13%20-7%20-24%20-1%20-48%2023%20-18%2018%20-32%2039%20-32%2046%200%207%2067%2081%20148%20165%20175%20179%20232%20257%20317%20429%2065%20132%2081%20157%2097%20157%205%200%2054%20-41%20109%20-92z'/%3e%3cpath%20d='M2027%202589%20c-21%20-11%20-92%20-72%20-159%20-136%20-149%20-141%20-213%20-176%20-263%20-139%20-18%2013%20-18%2014%203%2020%2045%2015%2052%2075%2011%2097%20-28%2014%20-57%202%20-74%20-31%20-19%20-37%20-19%20-65%201%20-100%2022%20-36%2064%20-60%20106%20-60%2067%200%20134%2044%20269%20175%20125%20122%20181%20161%20213%20149%2022%20-9%2020%20-24%20-4%20-24%20-23%200%20-38%20-45%20-23%20-69%2014%20-22%2057%20-25%2077%20-6%2025%2025%2021%2087%20-9%20119%20-30%2032%20-92%2035%20-148%205z'/%3e%3cpath%20d='M2508%202189%20c-32%20-18%20-41%20-48%20-23%20-75%2020%20-32%2064%20-30%2081%203%2014%2029%2024%2019%2024%20-22%200%20-39%20-39%20-101%20-141%20-227%20-96%20-117%20-129%20-183%20-129%20-255%200%20-44%205%20-58%2028%20-85%2025%20-27%2036%20-31%2077%20-31%2040%200%2052%204%2072%2027%2030%2035%2030%2071%20-1%2091%20-31%2021%20-63%206%20-72%20-33%20-3%20-15%20-7%20-31%20-8%20-36%20-5%20-22%20-36%2029%20-36%2060%200%2048%2036%20113%20125%20224%20153%20192%20176%20311%2069%20356%20-39%2016%20-43%2017%20-66%203z'/%3e%3cpath%20d='M4353%203208%20c-24%20-27%20-120%20-155%20-190%20-253%20-59%20-84%20-234%20-326%20-523%20-725%20-646%20-892%20-1160%20-1619%20-1160%20-1639%200%20-15%2027%20-31%2043%20-25%209%203%2032%2030%2053%2060%2021%2030%2042%2054%2049%2054%206%200%2031%20-14%2054%20-32%2041%20-29%2045%20-31%2069%20-17%2014%208%2071%2079%20127%20159%20110%20157%20601%20854%20750%201065%20254%20359%20583%20817%20693%20964%20136%20182%20141%20197%20103%20291%20-14%2033%20-16%2050%20-8%2067%2022%2049%20-22%2072%20-60%2031z%20m12%20-138%20c8%20-16%2015%20-37%2015%20-46%200%20-9%20-49%20-83%20-108%20-163%20-263%20-354%20-631%20-870%20-1166%20-1636%20-76%20-110%20-159%20-228%20-183%20-263%20-24%20-34%20-48%20-62%20-52%20-62%20-12%200%20-61%2040%20-61%2050%200%204%2035%2056%2077%20116%20218%20308%20478%20675%20568%20799%2056%2077%20196%20271%20311%20430%20116%20160%20277%20385%20360%20500%20159%20224%20218%20304%20221%20305%201%200%209%20-13%2018%20-30z%20m-1564%20-2201%20c16%20-11%2029%20-24%2029%20-29%200%20-10%20-87%20-137%20-99%20-144%20-4%20-3%20-22%207%20-40%2022%20l-33%2027%2053%2073%20c29%2039%2054%2072%2057%2072%202%200%2017%20-9%2033%20-21z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4363%204539%20c-33%20-10%20-51%20-22%20-296%20-216%20-114%20-91%20-208%20-177%20-358%20-333%20-121%20-125%20-210%20-210%20-221%20-210%20-47%200%20-116%20-57%20-353%20-290%20-218%20-214%20-259%20-250%20-296%20-260%20-133%20-36%20-187%20-70%20-254%20-161%20-49%20-67%20-60%20-96%20-50%20-128%2012%20-39%2051%20-37%20101%205%2076%2065%20127%20104%20130%20101%202%20-1%20-117%20-125%20-264%20-275%20l-267%20-272%20-65%206%20c-76%206%20-118%20-13%20-146%20-68%20-14%20-28%20-15%20-39%20-4%20-81%2012%20-47%2012%20-49%20-16%20-78%20-16%20-16%20-40%20-32%20-54%20-36%20-65%20-15%20-110%20-61%20-110%20-111%200%20-25%20-195%20-212%20-220%20-212%20-26%200%20-80%20-49%20-96%20-86%20-14%20-33%20-104%20-119%20-229%20-219%20-151%20-121%20-324%20-224%20-477%20-284%20-64%20-25%20-80%20-28%20-105%20-19%20-38%2014%20-82%20-6%20-101%20-45%20-18%20-37%200%20-92%2059%20-179%20132%20-197%20361%20-408%20541%20-499%2071%20-36%2088%20-36%20127%20-3%2024%2020%2031%2034%2031%2063%200%2020%20-5%2042%20-10%2047%20-17%2017%2025%20160%2079%20269%2091%20183%20222%20358%20431%20578%2079%2082%20118%20116%20140%20121%2036%207%2078%2048%2086%2085%209%2037%20173%20201%20201%20201%2016%200%2057%2035%20135%20117%20229%20236%20406%20373%20484%20373%2037%200%2097%2064%20113%20122%2011%2039%2011%2050%20-4%2077%20-15%2030%20-15%2033%205%2062%2013%2018%2019%2037%2015%2047%20-5%2013%20126%20148%20563%20582%20546%20542%20576%20574%20731%20772%2089%20115%20169%20224%20177%20243%2019%2045%2018%2089%20-2%20132%20-28%2057%20-86%2082%20-151%2062z%20m80%20-76%20c28%20-32%2031%20-70%209%20-107%20-19%20-32%20-188%20-253%20-218%20-286%20-12%20-12%20-25%20-4%20-94%2065%20-44%2044%20-80%2083%20-80%2088%200%2010%2020%2027%20184%20160%20128%20103%20164%20118%20199%2080z%20m-343%20-355%20c77%20-80%2094%20-108%2067%20-108%20-20%200%20-180%20166%20-173%20179%2013%2020%2025%2012%20106%20-71z%20m-51%20-65%20l91%20-98%20-100%20-100%20-100%20-100%20-94%2094%20-95%2094%2096%20104%20c52%2057%2099%20103%20103%20103%205%200%2049%20-44%2099%20-97z%20m-157%20-335%20c-18%20-18%20-198%20162%20-188%20188%206%2015%2024%201%20104%20-79%2077%20-77%2094%20-99%2084%20-109z%20m-148%2061%20c42%20-40%2082%20-81%2087%20-92%2010%20-18%20-33%20-64%20-412%20-444%20l-424%20-424%20-40%207%20c-56%209%20-114%2040%20-127%2069%20-26%2058%20-10%2081%20216%20305%20118%20116%20224%20219%20237%20228%2021%2015%2022%2015%2015%20-9%20-19%20-69%20-19%20-77%207%20-103%2034%20-34%2081%20-34%20129%20-1%20106%2072%2040%20206%20-77%20153%20-54%20-25%20-34%207%2078%20121%2064%2065%20117%20126%20117%20135%200%2017%2096%20126%20110%20126%205%200%2042%20-32%2084%20-71z%20m-557%20-367%20l-315%20-315%20-30%2012%20c-43%2018%20-96%20-1%20-182%20-65%20-65%20-50%20-70%20-51%20-53%20-23%2041%2070%20140%20140%20218%20155%2022%203%2054%2013%2070%2022%2017%208%20140%20124%20275%20257%20234%20232%20302%20291%20323%20278%205%20-3%20-133%20-147%20-306%20-321z%20m241%20-19%20c2%20-24%20-2%20-34%20-18%20-43%20-54%20-29%20-93%2017%20-50%2060%2031%2031%2064%2023%2068%20-17z%20m-658%20-483%20c0%20-49%2053%20-98%20135%20-125%2075%20-24%2095%20-50%2038%20-50%20-26%200%20-44%20-12%20-90%20-57%20-547%20-535%20-589%20-575%20-600%20-565%20-3%204%206%2020%2020%2036%2017%2021%2028%2049%2032%2085%20l7%2053%2043%20-5%20c38%20-4%2047%20-1%2069%2023%2072%2078%20-26%20189%20-113%20129%20-19%20-14%20-25%20-14%20-32%20-3%20-5%208%20-9%2016%20-9%2019%200%2013%20308%20310%20321%20310%2011%200%2013%20-11%2011%20-43%20-3%20-35%201%20-49%2020%20-70%2022%20-25%2039%20-31%2086%20-28%2036%202%2062%2036%2062%2081%200%2061%20-54%20101%20-115%2086%20-53%20-13%20-46%208%2026%2080%2041%2041%2077%2074%2081%2074%205%200%208%20-14%208%20-30z%20m-52%20-206%20c2%20-22%20-2%20-33%20-14%20-38%20-25%20-9%20-52%202%20-59%2025%20-9%2027%2013%2051%2044%2047%2021%20-2%2027%20-9%2029%20-34z%20m255%20-71%20c12%20-7%208%20-40%20-10%20-77%20-14%20-30%20-25%20-38%20-70%20-51%20-108%20-32%20-210%20-109%20-447%20-340%20-121%20-118%20-146%20-137%20-146%20-116%200%205%20137%20142%20304%20305%20284%20277%20307%20296%20333%20290%2015%20-4%2031%20-9%2036%20-11z%20m-771%20-193%20c39%20-30%2051%20-70%2046%20-154%20-2%20-55%20-8%20-80%20-22%20-95%20-29%20-32%20-53%20-27%20-60%2013%20-4%2019%20-27%2064%20-51%20100%20-50%2073%20-55%2099%20-23%20133%2027%2029%2076%2030%20110%203z%20m196%20-72%20c5%20-45%20-57%20-62%20-72%20-21%20-13%2032%204%2054%2037%2051%2026%20-2%2033%20-8%2035%20-30z%20m-288%20-179%20c0%20-26%20-8%20-42%20-30%20-64%20-37%20-36%20-48%20-27%20-51%2042%20-2%2044%201%2057%2021%2078%20l24%2026%2018%20-23%20c10%20-13%2018%20-39%2018%20-59z%20m-126%20-12%20c15%20-23%20-12%20-71%20-42%20-75%20-49%20-7%20-68%2042%20-31%2079%2023%2023%2057%2022%2073%20-4z%20m261%20-128%20c4%20-5%20-34%20-50%20-84%20-101%20l-89%20-93%20-70%200%20c-39%200%20-74%203%20-78%208%20-10%2010%20115%20137%20130%20131%2019%20-7%2048%2021%2051%2049%202%2014%2016%2037%2031%2051%20l29%2024%2037%20-30%20c21%20-16%2040%20-34%2043%20-39z%20m-289%205%20c34%204%2044%202%2044%20-8%200%20-19%20-259%20-268%20-274%20-263%20-6%202%20-12%2029%20-14%2061%20l-3%2057%2082%2084%20c72%2074%2084%2083%20102%2073%2011%20-6%2039%20-8%2063%20-4z%20m-286%20-209%20c0%20-32%20-33%20-59%20-65%20-51%20-45%2011%20-30%2067%2020%2078%2031%207%2045%20-2%2045%20-27z%20m243%20-91%20l6%20-60%20-99%20-99%20-99%20-99%20-28%2024%20c-83%2072%20-183%20177%20-183%20191%200%2025%2038%2055%2052%2041%207%20-7%2034%20-12%2060%20-12%2040%200%2048%20-3%2048%20-18%200%20-10%205%20-23%2012%20-30%2015%20-15%2068%20-16%2068%20-1%200%206%2030%2042%2067%2080%2077%2081%2087%2079%2096%20-17z%20m127%2041%20c19%20-23%20-13%20-67%20-47%20-63%20-38%204%20-52%2032%20-29%2057%2022%2025%2058%2027%2076%206z%20m-460%20-229%20c55%20-54%20100%20-102%20100%20-107%200%20-4%20-5%20-11%20-11%20-15%20-13%20-8%20-219%20194%20-219%20214%200%2027%2031%205%20130%20-92z%20m-56%20-57%20c80%20-80%20107%20-114%20100%20-124%20-191%20-263%20-267%20-397%20-314%20-552%20-12%20-40%20-25%20-73%20-29%20-73%20-4%200%20-52%2038%20-107%2084%20-146%20123%20-408%20396%20-393%20410%202%202%2045%2021%2094%2042%20157%2067%20335%20173%20465%20278%2030%2025%2059%2045%2065%2045%205%201%2059%20-49%20119%20-110z%20m-796%20-297%20c80%20-124%20319%20-361%20495%20-489%2042%20-32%2077%20-63%2077%20-70%200%20-60%20-259%20122%20-421%20295%20-118%20126%20-216%20268%20-205%20297%209%2025%2023%2017%2054%20-33z'/%3e%3cpath%20d='M3140%203270%20c-29%20-29%20-27%20-94%205%20-125%2052%20-53%20145%20-15%20145%2058%200%2020%20-9%2046%20-21%2061%20-27%2034%20-98%2037%20-129%206z%20m90%20-34%20c19%20-23%208%20-61%20-18%20-64%20-45%20-7%20-72%2046%20-34%2067%2024%2014%2038%2013%2052%20-3z'/%3e%3cpath%20d='M2986%203114%20c-35%20-36%20-34%20-77%203%20-115%2071%20-70%20179%200%20141%2092%20-24%2056%20-98%2068%20-144%2023z%20m89%20-30%20c9%20-9%2015%20-26%2013%20-38%20-2%20-17%20-10%20-21%20-38%20-21%20-29%200%20-36%204%20-38%2023%20-7%2045%2032%2067%2063%2036z'/%3e%3cpath%20d='M2459%202571%20c-58%20-58%20-23%20-141%2061%20-141%2051%200%2080%2027%2080%2074%200%2048%20-8%2065%20-41%2081%20-42%2022%20-67%2018%20-100%20-14z%20m93%20-47%20c11%20-22%2010%20-28%20-7%20-40%20-26%20-19%20-41%20-18%20-59%208%20-20%2028%20-4%2058%2030%2058%2017%200%2028%20-8%2036%20-26z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M2494%204517%20c-81%20-84%20-94%20-135%20-49%20-201%2034%20-51%2033%20-76%20-4%20-76%20-16%200%20-34%207%20-41%2015%20-28%2033%20-100%204%20-100%20-41%200%20-29%2032%20-64%2059%20-64%2011%200%2032%208%2049%2017%2042%2024%2064%2012%2060%20-34%20-4%20-47%20-32%20-55%20-76%20-23%20-25%2018%20-32%2020%20-55%209%20-48%20-22%20-50%20-83%20-4%20-109%2025%20-14%2030%20-13%2058%203%2017%209%2042%2017%2055%2017%2023%200%2024%20-2%2024%20-72%200%20-40%20-7%20-199%20-15%20-353%20-8%20-154%20-15%20-292%20-15%20-307%200%20-25%20-10%20-33%20-102%20-79%20-279%20-140%20-382%20-273%20-382%20-494%200%20-116%2011%20-303%2019%20-315%203%20-6%2021%20-10%2038%20-10%2073%200%20104%20-62%2093%20-187%20-10%20-105%20-31%20-168%20-72%20-208%20-32%20-33%20-39%20-35%20-98%20-35%20-76%200%20-77%20-2%20-69%20-97%204%20-58%201%20-78%20-22%20-138%20-64%20-168%20-83%20-352%20-50%20-480%2038%20-146%20158%20-291%20296%20-359%2087%20-42%20231%20-82%20332%20-92%20106%20-10%20107%20-10%20108%20-107%202%20-111%209%20-142%2034%20-142%2016%200%2021%209%2027%2050%203%2028%207%2081%207%20118%201%2045%205%2069%2014%2071%206%202%2067%2011%20135%2020%20364%2048%20575%20241%20598%20550%208%20104%20-6%20187%20-58%20341%20-37%20112%20-39%20124%20-30%20175%2014%2077%205%2090%20-62%2089%20-112%20-3%20-166%2071%20-174%20241%20-2%2054%20-2%20110%202%20124%2010%2040%2041%2066%2080%2066%2044%200%2057%2018%2056%2077%20-1%2026%201%20109%205%20184%207%20123%206%20142%20-14%20205%20-44%20143%20-139%20238%20-338%20336%20l-122%2060%20-5%2061%20c-6%2073%20-26%20585%20-26%20675%200%2058%202%2062%2023%2062%2012%200%2031%20-7%2041%20-15%2061%20-46%20133%2038%2076%2090%20-19%2017%20-31%2017%20-102%20-1%20-27%20-6%20-28%20-5%20-28%2035%200%2022%202%2041%205%2041%203%200%2023%20-9%2045%20-20%2033%20-17%2043%20-18%2065%20-8%2048%2022%2045%2089%20-5%20106%20-21%208%20-33%207%20-47%20-3%20-23%20-18%20-73%20-19%20-73%20-2%200%206%2012%2023%2025%2036%2035%2032%2034%2088%20-2%20138%20-32%2045%20-106%20103%20-131%20103%20-9%200%20-35%20-19%20-58%20-43z%20m110%20-58%20c14%20-11%2026%20-30%2026%20-43%200%20-12%205%20-27%2012%20-34%2014%20-14%20-3%20-37%20-43%20-58%20-40%20-20%20-55%20-18%20-89%2014%20-28%2025%20-29%2030%20-20%2067%2010%2042%2040%2075%2070%2075%209%200%2029%20-9%2044%20-21z%20m0%20-230%20c8%20-40%208%20-94%200%20-153%20-7%20-47%20-7%20-47%20-43%20-44%20-32%203%20-36%207%20-39%2033%20-2%2017%20-1%2067%203%20113%20l7%2082%2033%200%20c28%200%2033%20-4%2039%20-31z%20m-20%20-1301%20l7%20-488%20-27%200%20-27%200%207%20648%20c3%20356%2010%20701%2014%20767%206%20110%207%2097%2013%20-160%204%20-154%209%20-499%2013%20-767z%20m25%20760%20c28%20-605%2051%20-1134%2051%20-1189%200%20-55%20-1%20-59%20-23%20-59%20l-24%200%20-7%20588%20c-3%20323%20-9%20660%20-13%20750%20-3%2089%20-4%20162%20-1%20162%203%200%2010%20-114%2017%20-252z%20m-85%20-375%20c-2%20-302%20-7%20-621%20-10%20-710%20l-6%20-163%20-25%200%20-25%200%207%2098%20c7%20116%2055%201228%2055%201283%200%2022%202%2039%205%2039%202%200%202%20-246%20-1%20-547z%20m-92%20-184%20c-2%20-35%20-9%20-212%20-18%20-393%20-8%20-181%20-13%20-335%20-10%20-342%203%20-8%2014%20-14%2025%20-14%2011%200%2023%20-5%2026%20-10%203%20-6%203%20-86%20-1%20-179%20l-7%20-170%20-26%20-3%20c-20%20-2%20-26%20-9%20-26%20-28%200%20-20%206%20-26%2026%20-28%2023%20-3%2027%20-9%2033%20-49%203%20-25%206%20-106%206%20-179%200%20-122%20-2%20-134%20-18%20-134%20-25%200%20-42%20-19%20-42%20-47%200%20-13%2017%20-74%2038%20-136%20l37%20-112%202%20-224%202%20-224%20-65%206%20c-265%2025%20-481%20166%20-549%20357%20-48%20135%20-40%20277%2027%20474%2029%2089%2039%20132%2036%20167%20l-3%2047%2042%205%20c121%2013%20192%20135%20194%20332%202%20125%20-25%20181%20-96%20205%20l-31%2010%20-14%20120%20c-33%20302%2027%20413%20310%20572%2047%2026%2089%2047%2094%2045%205%20-2%209%20-32%208%20-68z%20m432%20-18%20c102%20-59%20175%20-130%20212%20-206%2027%20-56%2029%20-68%2029%20-180%200%20-66%20-3%20-152%20-5%20-192%20l-5%20-71%20-46%20-19%20c-63%20-27%20-89%20-80%20-89%20-186%200%20-129%2035%20-241%2092%20-294%2029%20-27%2089%20-53%20123%20-53%2024%200%2025%20-3%2025%20-59%200%20-41%2012%20-93%2041%20-182%2089%20-268%2057%20-475%20-97%20-626%20-103%20-101%20-239%20-158%20-430%20-179%20l-62%20-6%20-7%20107%20c-4%2060%20-5%20160%20-3%20224%205%2099%2011%20133%2042%20227%2045%20135%2045%20177%202%20182%20l-29%204%207%2090%20c3%2050%206%20131%206%20179%20l0%2088%2028%203%20c21%202%2028%209%2030%2031%203%2024%200%2027%20-27%2027%20l-31%200%200%20180%200%20180%2025%200%20c25%200%2025%201%2025%2083%200%2045%20-7%20222%20-15%20392%20-8%20171%20-15%20318%20-15%20327%200%2015%204%2015%2048%20-4%2026%20-11%2083%20-41%20126%20-67z%20m-344%20-911%20c0%20-173%20-1%20-180%20-20%20-180%20-19%200%20-20%207%20-20%20180%200%20173%201%20180%2020%20180%2019%200%2020%20-7%2020%20-180z%20m60%200%20c0%20-173%20-1%20-180%20-20%20-180%20-19%200%20-20%207%20-20%20180%200%20173%201%20180%2020%20180%2019%200%2020%20-7%2020%20-180z%20m60%200%20c0%20-153%20-2%20-180%20-15%20-180%20-13%200%20-15%2027%20-15%20180%200%20153%202%20180%2015%20180%2013%200%2015%20-27%2015%20-180z%20m-120%20-421%20c0%20-140%20-3%20-180%20-12%20-177%20-15%205%20-25%20101%20-27%20256%20-1%2096%200%20102%2019%20102%2019%200%2020%20-7%2020%20-181z%20m60%201%20c0%20-145%20-3%20-180%20-14%20-180%20-15%200%20-26%20106%20-26%20263%200%2090%201%2097%2020%2097%2019%200%2020%20-7%2020%20-180z%20m63%208%20c-5%20-162%20-12%20-206%20-30%20-183%20-5%206%20-7%2088%20-5%20183%203%20159%205%20172%2022%20172%2017%200%2017%20-10%2013%20-172z%20m-14%20-356%20l-33%20-97%20-4%20-242%20c-3%20-207%20-6%20-242%20-19%20-247%20-9%20-4%20-22%20-1%20-30%205%20-11%2010%20-13%2042%20-7%20183%207%20192%20-6%20300%20-51%20419%20-14%2037%20-25%2072%20-25%2077%200%2011%20194%2018%20198%207%202%20-4%20-11%20-51%20-29%20-105z'/%3e%3cpath%20d='M2301%202244%20c-36%20-26%20-52%20-78%20-66%20-222%20-15%20-147%20-35%20-205%20-73%20-210%20-20%20-3%20-21%20-1%20-11%2022%209%2020%209%2029%20-1%2041%20-27%2032%20-70%2011%20-70%20-34%200%20-46%2034%20-71%2093%20-71%2073%200%20106%2073%20118%20261%208%20126%2021%20189%2040%20189%204%200%209%20-10%2011%20-22%202%20-18%2010%20-23%2033%20-23%2024%200%2031%205%2033%2023%208%2052%20-58%2080%20-107%2046z'/%3e%3cpath%20d='M2732%202244%20c-30%20-21%20-29%20-61%203%20-76%2032%20-15%2059%205%2050%2039%20-7%2030%200%2029%2020%20-1%2012%20-17%2019%20-65%2025%20-163%2010%20-161%2021%20-206%2060%20-245%2033%20-32%2091%20-38%20128%20-12%2025%2017%2031%2071%2010%2092%20-32%2032%20-80%20-8%20-58%20-48%208%20-15%208%20-20%20-2%20-20%20-44%201%20-67%2064%20-79%20214%20-10%20131%20-29%20198%20-62%20221%20-28%2019%20-67%2019%20-95%20-1z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M1492%204328%20c-5%20-7%20-13%20-23%20-16%20-35%20-9%20-28%20-15%20-28%20-146%20-1%20-144%2029%20-431%2032%20-502%205%20-72%20-28%20-94%20-76%20-63%20-136%2040%20-79%20215%20-180%20426%20-247%2062%20-20%20117%20-40%20122%20-43%204%20-4%20-31%20-44%20-77%20-89%20-59%20-58%20-89%20-80%20-100%20-76%20-43%2016%20-106%20-42%20-106%20-98%200%20-16%20-33%20-56%20-110%20-133%20-78%20-77%20-110%20-116%20-108%20-130%205%20-37%2036%20-20%20147%2085%2062%2058%20116%20107%20122%20108%206%203%208%20-105%207%20-290%20l-3%20-293%20-76%20-3%20c-65%20-2%20-81%20-7%20-103%20-27%20-37%20-34%20-43%20-70%20-17%20-105%2021%20-29%2021%20-37%2021%20-436%200%20-391%20-1%20-407%20-20%20-431%20-27%20-34%20-25%20-66%204%20-100%2022%20-26%2032%20-28%20108%20-33%20l83%20-5%203%20-103%203%20-103%20-34%20-42%20c-30%20-36%20-132%20-178%20-321%20-444%20-28%20-40%20-60%20-74%20-71%20-77%20-21%20-6%20-95%20-112%20-95%20-137%200%20-43%2073%20-54%20107%20-16%2029%2031%2074%20113%2067%20120%20-3%203%2025%2049%2063%20103%2037%2054%2071%20102%2074%20107%204%205%2055%20-27%20114%20-72%2060%20-44%20114%20-81%20122%20-81%207%200%2060%2034%20118%2077%2062%2044%20110%2072%20115%2067%2035%20-36%20150%20-203%20150%20-218%200%20-31%2038%20-83%2074%20-100%2041%20-20%2086%20-8%2086%2023%200%2021%20-74%20121%20-90%20121%20-5%200%20-104%20127%20-220%20282%20l-211%20283%203%20105%203%20105%20233%203%20232%202%200%20-102%20c0%20-194%2053%20-367%20162%20-529%20l58%20-86%20-32%20-59%20c-17%20-33%20-41%20-70%20-53%20-84%20-38%20-42%20-77%20-118%20-73%20-142%204%20-32%2049%20-55%2085%20-43%2033%2012%2092%20113%2093%20158%200%2015%209%2046%2020%2067%20l20%2040%2067%20-55%20c84%20-69%20213%20-136%20329%20-171%2074%20-22%20114%20-27%20239%20-31%20136%20-4%20159%20-2%20248%2021%20116%2030%20220%2078%20305%20141%2034%2025%2072%2045%2085%2045%2013%200%2028%205%2034%2011%2016%2016%2048%20-38%2033%20-56%20-17%20-20%2063%20-163%2096%20-171%2037%20-9%2073%204%2086%2030%209%2021%205%2035%20-28%2097%20-22%2039%20-46%2074%20-55%2076%20-17%205%20-73%20110%20-61%20116%204%203%2044%20-20%2090%20-50%20l82%20-55%2033%2019%20c17%2011%2058%2036%2089%2056%2053%2035%2058%2036%2067%2019%208%20-15%201%20-36%20-29%20-94%20-44%20-84%20-42%20-103%2017%20-114%2025%20-5%2037%20-1%2056%2018%2013%2013%2027%2031%2030%2039%204%2010%2012%206%2032%20-19%2027%20-33%2061%20-42%2083%20-20%2019%2019%2015%2032%20-37%2099%20l-49%2062%2062%20128%20c33%2070%2066%20128%2071%20128%206%200%2051%20-20%20100%20-44%2050%20-25%2093%20-45%2096%20-45%203%200%2045%2023%2093%2050%2048%2028%2091%2050%2096%2050%2016%200%20152%20-281%20146%20-303%20-8%20-33%2049%20-135%2080%20-143%2038%20-10%2078%207%2082%2034%204%2026%20-38%20104%20-77%20144%20-14%2014%20-53%2079%20-85%20145%20-33%2065%20-115%20224%20-183%20353%20l-123%20234%200%20237%20c0%20228%201%20237%2020%20242%2015%204%2020%2014%2020%2042%200%2028%20-5%2038%20-20%2042%20-19%205%20-20%2014%20-20%20315%20l0%20309%2033%2033%20c40%2041%20147%2080%20277%20101%20136%2023%20162%2032%20158%2058%20l-3%2022%20-495%200%20-495%200%20-3%20-22%20c-4%20-29%2017%20-37%20146%20-59%20145%20-24%20245%20-59%20287%20-98%20l35%20-33%200%20-306%20c0%20-296%20-1%20-307%20-20%20-317%20-14%20-8%20-20%20-21%20-20%20-45%200%20-24%206%20-37%2020%20-45%2019%20-10%2020%20-21%2020%20-247%20l0%20-236%20-71%20-135%20c-92%20-174%20-244%20-480%20-253%20-509%20-4%20-13%20-11%20-23%20-16%20-23%20-5%200%20-54%2059%20-110%20131%20l-100%20131%200%20359%20c0%20197%204%20359%208%20359%205%200%2050%2031%20101%2070%20l92%2070%2078%200%20c64%200%2083%204%20105%2021%2028%2022%2035%2064%2015%20101%20-14%2025%20-12%20249%202%20263%205%205%209%2028%209%2051%200%2034%20-5%2047%20-26%2063%20-26%2020%20-37%2021%20-448%2021%20-506%200%20-472%208%20-462%20-113%206%20-74%205%20-79%20-11%20-72%20-79%2034%20-190%2065%20-253%2072%20l-75%208%200%20207%20c0%20145%204%20211%2012%20219%2015%2015%2032%20-41%2040%20-136%203%20-41%2012%20-77%2021%20-88%2027%20-31%20107%20-47%20240%20-47%20235%200%20516%2078%20568%20158%2016%2024%2016%2030%200%2091%20-26%20104%20-67%20368%20-71%20456%20-3%2071%20-7%2083%20-29%20102%20-66%2057%20-357%2041%20-614%20-33%20-95%20-27%20-152%20-59%20-179%20-100%20-16%20-25%20-16%20-31%200%20-108%2022%20-103%2021%20-128%20-2%20-174%20-33%20-67%20-42%20-135%20-44%20-338%20-2%20-169%20-4%20-199%20-17%20-199%20-13%200%20-16%2034%20-21%20225%20-5%20223%20-11%20262%20-50%20357%20-11%2027%20-11%2045%201%20110%2020%20112%2018%20123%20-29%20164%20-81%2072%20-326%20129%20-556%20129%20-202%200%20-224%20-14%20-236%20-147%20-4%20-49%20-23%20-173%20-43%20-278%20-19%20-104%20-37%20-206%20-39%20-225%20l-3%20-34%20-210%20-1%20-209%200%20-3%20290%20-2%20291%2030%2029%20c22%2021%2030%2038%2030%2065%200%2036%2018%2058%20162%20189%20l37%2034%20118%20-24%20c98%20-20%20148%20-24%20293%20-24%20158%200%20179%202%20222%2022%2097%2045%2098%20105%201%20193%20-70%2064%20-246%20152%20-392%20195%20l-106%2032%200%2034%20c0%2035%20-10%2059%20-24%2059%20-5%200%20-13%20-6%20-19%20-12z%20m-213%20-88%20c234%20-38%20429%20-97%20584%20-177%2089%20-46%20187%20-124%20187%20-149%200%20-45%20-159%20-71%20-336%20-54%20-116%2010%20-263%2037%20-276%2049%20-7%206%2025%20138%2037%20149%203%203%2025%20-4%2049%20-16%2038%20-18%2046%20-19%2056%20-6%2018%2020%201%2036%20-69%2068%20-68%2030%20-213%2048%20-225%2027%20-12%20-19%2014%20-41%2048%20-41%2049%200%2076%20-11%2076%20-29%200%20-10%20-9%20-45%20-21%20-79%20-24%20-72%20-8%20-71%20-192%20-11%20-145%2048%20-286%20119%20-344%20174%20-59%2057%20-55%2084%2014%20105%2055%2016%20283%2011%20412%20-10z%20m-134%20-614%20c0%20-30%20-31%20-44%20-51%20-24%20-15%2014%20-15%2020%20-4%2033%2018%2021%2055%2015%2055%20-9z%20m985%20-62%20c110%20-20%20248%20-68%20277%20-96%2031%20-29%2024%20-32%20-26%20-7%20-23%2011%20-100%2034%20-169%2051%20-112%2027%20-149%2031%20-307%2034%20-99%202%20-184%204%20-189%204%20-20%200%2014%2023%2046%2031%2048%2012%20269%202%20368%20-17z%20m1213%2010%20c9%20-3%2017%20-11%2017%20-17%200%20-9%20-48%20-12%20-178%20-12%20-167%20-1%20-184%20-2%20-307%20-34%20-71%20-18%20-151%20-44%20-177%20-57%20-52%20-26%20-64%20-18%20-22%2015%2055%2043%20283%20101%20454%20114%2050%204%20185%20-2%20213%20-9z%20m-1567%20-129%20c-5%20-45%20-3%20-57%209%20-61%2025%20-10%2042%2013%2048%2062%202%2025%207%2048%2011%2051%208%208%20258%20-15%20267%20-25%204%20-4%204%20-28%200%20-53%20-9%20-55%20-5%20-69%2019%20-69%2019%200%2024%2010%2035%2073%207%2044%200%2044%20130%206%20105%20-30%20115%20-42%20107%20-109%20-7%20-54%20-8%20-55%20-37%20-51%20-17%203%20-46%205%20-65%205%20l-35%201%20-14%20-68%20c-17%20-80%20-17%20-80%2067%20-98%2029%20-7%2055%20-15%2057%20-19%202%20-3%20-1%20-37%20-8%20-74%20-9%20-53%20-14%20-66%20-27%20-62%20-8%203%20-60%2021%20-115%2040%20l-100%2034%200%2059%20c0%2055%20-1%2058%20-25%2058%20-22%200%20-26%20-5%20-32%20-48%20-4%20-27%20-9%20-51%20-11%20-54%20-3%20-2%20-31%200%20-63%206%20-33%205%20-94%2013%20-137%2016%20l-78%207%203%2046%20c3%2042%201%2047%20-19%2050%20-17%203%20-24%20-3%20-29%20-25%20-16%20-74%20-19%20-78%20-58%20-81%20-37%20-3%20-38%20-2%20-32%2025%203%2015%2017%2093%2031%20173%2015%2080%2029%20163%2033%20185%207%2037%2021%2049%2066%2054%205%201%206%20-24%202%20-54z%20m1469%200%20c8%20-41%2014%20-51%2034%20-53%2023%20-4%2024%20-2%2018%2047%20l-6%2051%2034%200%20c41%200%2035%2018%2070%20-215%2014%20-93%2028%20-180%2032%20-193%205%20-21%203%20-22%20-23%20-17%20-51%2012%20-54%2014%20-54%2042%200%2052%20-11%2074%20-34%2071%20-19%20-3%20-21%20-8%20-18%20-50%20l4%20-46%20-79%20-7%20c-43%20-3%20-105%20-10%20-138%20-14%20-33%20-5%20-63%20-7%20-67%20-4%20-5%202%20-8%2016%20-8%2031%200%2051%20-11%2073%20-34%2070%20-19%20-3%20-21%20-10%20-21%20-61%20l0%20-59%20-83%20-24%20c-46%20-13%20-97%20-31%20-114%20-40%20-16%20-8%20-32%20-13%20-35%20-10%20-7%206%20-22%2083%20-23%20112%200%2018%209%2023%2059%2034%2088%2018%2087%2017%2070%2097%20l-14%2068%20-35%200%20c-19%20-1%20-49%20-4%20-67%20-9%20l-31%20-7%20-8%2057%20c-6%2049%20-4%2059%2012%2071%2020%2015%20120%2048%20177%2058%2035%207%2036%206%2042%20-32%2012%20-67%2015%20-74%2038%20-71%2024%203%2025%2014%2014%2085%20-7%2040%20-6%2042%2023%2048%2053%2012%20163%2023%20210%2021%20l44%20-1%2011%20-50z%20m-867%20-235%20c18%200%2022%20-6%2022%20-28%200%20-38%20-5%20-42%20-48%20-30%20-47%2013%20-56%2021%20-47%2048%205%2016%2012%2020%2028%2016%2012%20-3%2032%20-6%2045%20-6z%20m402%20-19%20c0%20-26%20-4%20-29%20-46%20-36%20-52%20-7%20-53%20-7%20-56%2025%20-3%2025%2019%2037%2075%2039%2023%201%2027%20-3%2027%20-28z%20m1479%20-55%20c-2%20-3%20-48%20-18%20-101%20-36%20l-97%20-31%20-102%2031%20c-57%2017%20-105%2032%20-107%2035%20-3%203%2088%205%20203%205%20115%200%20206%20-2%20204%20-4z%20m-1791%20-294%20l-3%20-196%20-88%20-13%20c-97%20-14%20-228%20-62%20-319%20-118%20-31%20-19%20-59%20-35%20-62%20-35%20-4%200%20-5%2070%20-4%20155%20l3%20156%20160%202%20c138%202%20165%205%20199%2022%2022%2011%2043%2027%2047%2035%204%208%2012%2055%2019%20104%2013%20102%2016%20112%2036%2095%2012%20-10%2014%20-47%2012%20-207z%20m965%20163%20c10%20-4%2016%20-13%2015%20-19%20-7%20-22%20-116%20-67%20-228%20-93%20-101%20-23%20-137%20-27%20-292%20-27%20-132%20-1%20-180%202%20-190%2012%20-16%2016%20-7%2022%2092%2061%2080%2031%20187%2056%20310%2071%2081%209%20264%206%20293%20-5z%20m-1398%20-21%20c96%20-16%20255%20-65%20294%20-91%2042%20-27%2010%20-38%20-130%20-42%20-144%20-3%20-246%208%20-386%2045%20-148%2038%20-224%2085%20-160%2099%2079%2017%20241%2013%20382%20-11z%20m-945%20-104%20c0%20-18%20-7%20-20%20-80%20-20%20-44%200%20-80%204%20-80%208%200%2022%2029%2032%2092%2032%2061%200%2068%20-2%2068%20-20z%20m585%200%20l40%20-19%20-287%200%20c-282%20-1%20-288%20-1%20-288%2019%200%2019%206%2020%20248%2019%20218%200%20252%20-3%20287%20-19z%20m-653%20-142%20c3%20-57%205%20-63%2026%20-66%2021%20-3%2022%200%2022%2062%200%2037%204%2066%2010%2066%207%200%2010%20-145%2010%20-415%200%20-255%20-4%20-415%20-10%20-415%20-5%200%20-10%2026%20-12%2058%20-3%2049%20-6%2057%20-23%2057%20-17%200%20-21%20-8%20-25%20-60%20-5%20-56%20-7%20-60%20-30%20-60%20l-25%200%20-3%20418%20-2%20417%2029%200%20c30%200%2030%20-1%2033%20-62z%20m400%205%20c3%20-54%205%20-58%2028%20-58%2023%200%2025%204%2028%2058%20l3%2057%20169%200%20169%200%203%20-62%20c3%20-57%205%20-63%2026%20-66%2021%20-3%2022%200%2022%2062%20l0%2066%2035%200%2035%200%200%20-185%200%20-185%20-84%20-90%20c-68%20-73%20-94%20-111%20-135%20-193%20-27%20-56%20-55%20-121%20-62%20-144%20l-12%20-43%20-84%200%20-83%200%200%2049%20c0%2032%20-5%2053%20-15%2061%20-24%2020%20-40%20-3%20-40%20-58%20l0%20-47%20-140%200%20-140%200%20-3%20418%20-2%20417%20139%200%20140%200%203%20-57z%20m2406%20-70%20c-3%20-17%20-31%20-18%20-401%20-20%20-219%20-1%20-405%201%20-413%204%20-8%203%20-14%2011%20-14%2019%200%2012%2067%2014%20416%2014%20390%200%20415%20-1%20412%20-17z%20m-20%20-185%20l3%20-108%20-306%200%20-305%200%20-37%2033%20c-21%2019%20-63%2052%20-95%2075%20-57%2042%20-58%2045%20-43%2097%202%208%20128%2011%20391%2010%20l389%200%203%20-107z%20m-1036%2073%20c328%20-84%20585%20-375%20639%20-724%2022%20-142%20-3%20-336%20-61%20-472%20-33%20-78%20-128%20-214%20-197%20-283%20-115%20-114%20-278%20-203%20-430%20-232%20-40%20-8%20-115%20-11%20-210%20-8%20-130%205%20-159%209%20-241%2036%20-225%2074%20-419%20247%20-523%20467%20-62%20133%20-73%20188%20-73%20370%200%20145%203%20168%2027%20248%2049%20158%20116%20268%20234%20384%20132%20129%20280%20200%20493%20237%2059%2010%20268%20-4%20342%20-23z%20m1056%20-253%20c3%20-17%20-15%20-18%20-270%20-18%20-269%200%20-298%203%20-298%2032%200%205%20127%207%20282%206%20260%20-3%20283%20-4%20286%20-20z%20m-258%20-88%20c0%20-5%20-4%20-10%20-9%20-10%20-4%200%20-25%20-13%20-46%20-30%20-31%20-25%20-47%20-30%20-89%20-30%20-47%200%20-53%203%20-73%2035%20-13%2019%20-23%2037%20-23%2040%200%203%2054%205%20120%205%2073%200%20120%20-4%20120%20-10z%20m-2485%20-330%20c0%20-19%20-119%20-27%20-141%20-9%20-25%2021%20-3%2030%2069%2027%2056%20-2%2072%20-6%2072%20-18z%20m538%2014%20c3%20-3%203%20-12%200%20-20%20-4%20-11%20-48%20-14%20-238%20-14%20-225%200%20-256%204%20-240%2030%207%2011%20467%2015%20478%204z%20m2542%20-374%20c36%20-71%2065%20-136%2065%20-143%200%20-10%20-117%20-77%20-135%20-77%20-3%200%20-5%2079%20-5%20175%200%2096%202%20175%205%20175%203%200%2034%20-58%2070%20-130z%20m-135%20-60%20c0%20-103%20-4%20-160%20-10%20-160%20-18%200%20-132%2061%20-128%2068%202%204%2031%2062%2063%20129%2033%2067%2063%20122%2068%20123%204%200%207%20-72%207%20-160z%20m-2940%20-135%20c-1%20-91%20-5%20-165%20-9%20-165%20-14%200%20-146%20102%20-146%20113%200%2015%20137%20216%20148%20217%204%200%207%20-74%207%20-165z%20m133%2060%20c37%20-51%2070%20-100%2073%20-108%205%20-15%20-134%20-129%20-148%20-120%20-10%206%20-10%20323%200%20323%204%20-1%2037%20-43%2075%20-95z%20m2187%20-200%20l0%20-115%20-54%2036%20-54%2036%2050%2079%20c28%2043%2052%2079%2054%2079%202%200%204%20-52%204%20-115z%20m115%2017%20c22%20-31%2041%20-59%2043%20-63%203%20-7%20-73%20-59%20-88%20-59%20-6%200%20-10%2035%20-10%2090%200%2050%203%2090%208%2090%204%20-1%2025%20-26%2047%20-58z%20m130%20-252%20c-9%20-16%20-18%20-30%20-21%20-30%20-2%200%202%2014%2011%2030%209%2017%2018%2030%2021%2030%202%200%20-2%20-13%20-11%20-30z%20m-2995%20-11%20c-12%20-16%20-24%20-28%20-27%20-25%20-7%206%2027%2056%2039%2056%205%200%200%20-14%20-12%20-31z%20m3825%2010%20c10%20-30%200%20-33%20-13%20-4%20-6%2014%20-7%2025%20-2%2025%205%200%2012%20-9%2015%20-21z%20m-2895%20-10%20c0%20-6%20-4%20-7%20-10%20-4%20-5%203%20-10%2011%20-10%2016%200%206%205%207%2010%204%206%20-3%2010%20-11%2010%20-16z%20m169%20-93%20c-7%20-14%20-16%20-26%20-21%20-26%20-5%200%20-1%2014%207%2031%2020%2037%2031%2033%2014%20-5z%20m1591%20-20%20c0%20-6%20-7%20-2%20-15%208%20-8%2011%20-15%2025%20-15%2030%200%206%207%202%2015%20-8%208%20-11%2015%20-25%2015%20-30z'/%3e%3cpath%20d='M2342%202506%20c-270%20-72%20-489%20-279%20-578%20-546%20-26%20-79%20-28%20-96%20-28%20-245%200%20-143%203%20-169%2025%20-241%2067%20-216%20241%20-412%20454%20-510%2042%20-19%20109%20-42%20148%20-51%2089%20-19%20282%20-22%20362%20-4%20232%2050%20454%20234%20559%20463%2047%20100%2066%20183%2072%20302%2020%20379%20-217%20714%20-581%20822%20-135%2039%20-306%2043%20-433%2010z%20m295%20-36%20c323%20-42%20585%20-284%20649%20-600%2012%20-63%2015%20-112%2011%20-194%20-6%20-132%20-23%20-198%20-77%20-308%20-79%20-160%20-184%20-265%20-345%20-344%20-356%20-175%20-796%20-36%20-991%20312%20-79%20141%20-114%20312%20-95%20458%2041%20303%20231%20542%20511%20640%20119%2042%20214%2052%20337%2036z'/%3e%3cpath%20d='M2725%201618%20c-90%20-53%20-129%20-171%20-90%20-273%2020%20-54%2094%20-122%20142%20-131%20145%20-27%20266%2058%20280%20198%204%2045%201%2061%20-24%20108%20-18%2034%20-45%2066%20-72%2085%20-37%2026%20-53%2030%20-119%2033%20-65%202%20-83%20-1%20-117%20-20z%20m182%20-49%20c53%20-26%2084%20-68%2090%20-124%2010%20-86%20-35%20-153%20-119%20-176%20-56%20-15%20-101%20-4%20-145%2034%20-65%2057%20-79%20127%20-42%20204%2038%2078%20129%20104%20216%2062z'/%3e%3cpath%20d='M4037%203744%20c-4%20-4%20-7%20-67%20-7%20-139%20l0%20-131%20-44%20-46%20c-50%20-52%20-66%20-59%20-233%20-92%20-157%20-32%20-196%20-48%20-191%20-78%20l3%20-23%20475%20-3%20c261%20-1%20485%200%20498%203%2031%208%2028%2041%20-5%2059%20-16%207%20-66%2021%20-113%2031%20-311%2061%20-322%2071%20-330%20285%20-5%20126%20-6%20135%20-25%20138%20-12%202%20-24%200%20-28%20-4z%20m78%20-400%20c21%20-8%2076%20-24%20122%20-34%2047%20-10%2088%20-21%2091%20-25%204%20-3%20-114%20-5%20-262%20-4%20-252%202%20-299%207%20-200%2024%2023%203%2075%2017%20115%2030%2089%2029%2087%2029%20134%209z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4285%204494%20c-16%20-8%20-100%20-84%20-185%20-168%20-143%20-141%20-158%20-154%20-192%20-155%20-21%200%20-50%20-7%20-65%20-15%20-46%20-23%20-235%20-199%20-331%20-305%20-89%20-100%20-105%20-130%20-91%20-168%206%20-18%20-13%20-40%20-124%20-145%20-72%20-67%20-205%20-197%20-295%20-288%20l-164%20-164%20-39%2022%20c-21%2012%20-49%2022%20-62%2022%20-19%200%20-116%20-90%20-408%20-377%20-212%20-208%20-536%20-526%20-722%20-707%20-192%20-187%20-340%20-339%20-343%20-353%20-4%20-16%202%20-36%2019%20-62%20l26%20-38%20-44%20-43%20c-42%20-42%20-47%20-43%20-99%20-41%20-64%202%20-101%20-14%20-141%20-60%20-23%20-28%20-26%20-40%20-24%20-88%205%20-82%20-9%20-100%20-74%20-98%20-60%201%20-107%20-21%20-141%20-66%20-16%20-22%20-20%20-41%20-19%20-88%20l1%20-60%20-88%20-75%20c-49%20-41%20-91%20-82%20-94%20-90%20-21%20-55%206%20-109%2099%20-200%2077%20-76%20122%20-94%20164%20-67%2016%2010%20305%20291%20643%20624%20l614%20606%20104%200%20c151%20-1%20209%2033%20210%20121%200%2035%20-6%2049%20-30%2074%20l-30%2030%2033%2037%20c50%2055%20992%20984%201697%201675%20438%20430%20448%20439%20456%20469%2015%2063%20-73%20190%20-166%20237%20-47%2024%20-56%2024%20-95%204z%20m95%20-88%20c71%20-56%20120%20-143%2090%20-161%20-6%20-3%20-49%2033%20-98%2080%20-83%2082%20-86%2087%20-68%20101%2027%2019%2027%2019%2076%20-20z%20m-41%20-112%20c45%20-42%2081%20-80%2081%20-85%200%20-5%20-71%20-77%20-157%20-161%20-87%20-84%20-339%20-332%20-560%20-551%20l-402%20-400%20-54%2059%20c-109%20118%20-111%20121%20-94%20148%2024%2036%20318%20311%20331%20309%206%20-1%2038%20-7%2070%20-13%20131%20-26%20198%203%20337%20146%2092%2094%20109%20117%20123%20163%2019%2066%2020%20133%201%20185%20l-13%2038%20115%20119%20c64%2065%20122%20119%20129%20119%207%200%2049%20-34%2093%20-76z%20m-395%20-206%20c20%20-29%2021%20-136%202%20-183%20-19%20-45%20-171%20-202%20-220%20-227%20-75%20-39%20-235%20-22%20-244%2025%20-4%2020%20178%20212%20321%20338%2084%2075%20115%2085%20141%2047z%20m-813%20-881%20c20%20-17%2058%20-56%2085%20-85%2045%20-50%2046%20-54%2031%20-70%20-16%20-16%20-23%20-11%20-104%2070%20-74%2075%20-85%2089%20-74%20102%2018%2021%2020%2021%2062%20-17z%20m-18%20-118%20c42%20-39%2077%20-76%2077%20-83%200%20-6%20-211%20-222%20-470%20-479%20-578%20-575%20-542%20-552%20-665%20-428%20-43%2044%20-56%2064%20-48%2072%208%208%2022%20-1%2051%20-33%2037%20-40%2044%20-43%2091%20-43%2043%200%2055%204%2085%2034%2068%2066%2072%20149%209%20209%20-25%2023%20-33%2036%20-25%2044%207%207%2021%20-2%2044%20-28%2030%20-32%2041%20-38%2089%20-41%2066%20-5%20107%2017%20132%2070%2030%2062%2014%20134%20-36%20174%20-18%2014%20-23%2023%20-15%2031%207%207%2021%20-1%2048%20-29%2034%20-36%2041%20-39%2090%20-39%20100%200%20146%2053%20138%20157%20-4%2048%20-10%2061%20-38%2086%20l-33%2029%20184%20184%20c101%20101%20191%20184%20200%20184%208%200%2050%20-32%2092%20-71z%20m-345%20-49%20c3%20-18%20-20%20-47%20-109%20-136%20-74%20-75%20-117%20-110%20-123%20-104%20-6%206%20-18%2010%20-28%2010%20-10%200%20-18%204%20-18%208%200%2016%20250%20254%20262%20250%207%20-3%2015%20-15%2016%20-28z%20m-273%20-270%20c3%20-5%201%20-10%20-4%20-10%20-6%200%20-11%205%20-11%2010%200%206%202%2010%204%2010%203%200%208%20-4%2011%20-10z%20m-46%20-55%20c1%20-12%20-23%20-44%20-58%20-79%20-54%20-53%20-60%20-57%20-80%20-44%20-11%207%20-21%2017%20-21%2023%200%205%2033%2042%2072%2082%2075%2076%2085%2078%2087%2018z%20m181%20-10%20c61%20-65%20-10%20-161%20-89%20-121%20-49%2026%20-54%2069%20-15%20115%2032%2039%2071%2041%20104%206z%20m-397%20-182%20c-6%20-48%20-11%20-54%20-91%20-126%20-20%20-19%20-22%20-18%20-71%2010%20-3%202%20159%20161%20166%20163%202%200%200%20-21%20-4%20-47z%20m162%20-9%20c8%20-4%2023%20-20%2031%20-36%2041%20-79%20-80%20-148%20-131%20-75%20-21%2030%20-19%2051%2011%2086%2025%2030%2054%2038%2089%2025z%20m-375%20-196%20c-1%20-22%20-11%20-45%20-31%20-68%20-26%20-30%20-36%20-35%20-74%20-35%20l-44%200%2067%2068%20c36%2037%2070%2067%2074%2067%205%200%208%20-15%208%20-32z%20m171%20-21%20c17%20-13%2039%20-50%2039%20-66%200%20-24%20-53%20-71%20-80%20-71%20-60%200%20-101%2067%20-67%20110%2035%2045%2072%2054%20108%2027z%20m-353%20-161%20c1%20-42%20-1%20-47%20-48%20-86%20-39%20-33%20-54%20-39%20-74%20-34%20-14%203%20-26%209%20-26%2012%200%205%20141%20152%20145%20152%200%200%202%20-20%203%20-44z%20m186%20-85%20l108%20-109%2052%2023%20c28%2012%2073%2027%20100%2034%2042%2010%2051%2010%2065%20-3%2025%20-26%203%20-68%20-44%20-84%20-51%20-18%20-136%20-9%20-178%2017%20-46%2028%20-235%20204%20-236%20219%20-2%2029%2031%205%20133%20-97z%20m-52%20-78%20c43%20-43%2077%20-82%2077%20-88%20-1%20-5%20-128%20-134%20-283%20-285%20-155%20-151%20-415%20-407%20-578%20-568%20-252%20-249%20-300%20-292%20-315%20-283%20-10%205%20-53%2045%20-96%2089%20l-79%2079%2056%2048%2056%2047%2034%20-16%20c19%20-9%2048%20-16%2064%20-16%2024%200%2031%20-5%2034%20-22%202%20-12%208%20-23%2013%20-25%2013%20-4%20445%20421%20445%20437%200%2020%20-39%2078%20-67%20100%20l-27%2021%2049%2049%2048%2049%2024%20-25%20c33%20-36%2089%20-57%20131%20-49%2074%2014%20112%2061%20112%20140%200%2049%20-10%2077%20-42%20111%20-17%2019%20-17%2022%20-3%2028%2011%204%2025%20-4%2040%20-23%2014%20-16%2043%20-33%2069%20-41%2039%20-11%2049%20-10%2083%206%2054%2027%2083%2075%2083%20138%200%2059%20-16%2096%20-47%20111%20l-22%2011%2027%2027%20c14%2015%2029%2027%2032%2027%202%200%2040%20-35%2082%20-77z%20m-342%20-41%20c0%20-31%20-7%20-45%20-42%20-79%20-58%20-56%20-82%20-67%20-108%20-51%20-19%2012%20-16%2017%2057%2090%2043%2043%2081%2078%2085%2078%205%200%208%20-17%208%20-38z%20m169%203%20c41%20-21%2057%20-65%2037%20-103%20-25%20-47%20-75%20-57%20-120%20-21%20-43%2034%20-34%2099%2019%20127%2026%2015%2031%2015%2064%20-3z%20m-369%20-172%20c0%20-5%20-7%20-17%20-15%20-27%20-8%20-11%20-15%20-30%20-15%20-41%200%20-12%20-9%20-30%20-19%20-39%20-18%20-16%20-20%20-16%20-35%206%20-15%2021%20-14%2024%2026%2065%2040%2041%2058%2052%2058%2036z%20m149%20-49%20c38%20-31%2042%20-83%2011%20-114%20-25%20-25%20-86%20-27%20-112%20-3%20-36%2032%20-15%20113%2036%20133%2031%2013%2032%2012%2065%20-16z%20m-388%20-293%20c33%20-33%2035%20-50%2014%20-90%20-35%20-68%20-136%20-51%20-151%2026%20-5%2027%20-1%2037%2024%2063%2039%2039%2074%2039%20113%201z%20m118%20-10%20c12%20-16%2021%20-33%2021%20-38%200%20-5%20-21%20-29%20-46%20-53%20l-46%20-45%2017%2034%20c12%2024%2016%2049%2013%2083%20-6%2057%209%2064%2041%2019z%20m-149%20-184%20c20%204%2013%20-7%20-40%20-61%20-35%20-36%20-68%20-66%20-72%20-66%20-4%200%20-8%2014%20-8%2031%200%2017%20-5%2039%20-11%2051%20-9%2016%20-7%2024%2011%2043%2019%2021%2024%2021%2058%209%2020%20-7%2048%20-10%2062%20-7z%20m-200%20-52%20c50%20-54%206%20-144%20-64%20-131%20-43%208%20-79%2051%20-71%2085%2017%2069%2090%2094%20135%2046z%20m-195%20-385%20c85%20-86%2088%20-90%2070%20-105%20-11%20-8%20-24%20-15%20-28%20-15%20-11%200%20-124%20108%20-149%20142%20-20%2029%20-17%2068%205%2068%207%200%2053%20-40%20102%20-90z'/%3e%3cpath%20d='M3724%203896%20c-78%20-78%20-9%20-171%2075%20-101%2037%2032%2057%2086%2041%20115%20-18%2034%20-75%2027%20-116%20-14z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4121%204495%20c-26%20-25%20-51%20-45%20-54%20-45%20-3%200%20-7%2012%20-9%2026%20-2%2015%20-12%2033%20-24%2041%20-18%2012%20-24%2011%20-47%20-8%20-48%20-37%20-25%20-105%2028%20-81%2043%2020%2037%20-5%20-15%20-60%20-41%20-44%20-49%20-49%20-50%20-32%200%2012%20-8%2032%20-18%2044%20-17%2022%20-19%2022%20-49%206%20-34%20-17%20-47%20-43%20-37%20-71%206%20-14%2015%20-16%2045%20-12%2022%203%2039%202%2039%20-1%200%20-4%20-21%20-28%20-47%20-54%20l-46%20-47%20-16%2032%20c-21%2041%20-56%2043%20-85%204%20-16%20-21%20-18%20-32%20-10%20-45%2014%20-21%2050%20-27%2070%20-11%2026%2021%2026%202%200%20-38%20-14%20-21%20-30%20-62%20-37%20-91%20-10%20-50%20-18%20-60%20-147%20-185%20-317%20-307%20-528%20-513%20-707%20-689%20l-190%20-187%20-85%2056%20c-179%20117%20-277%20149%20-436%20141%20-76%20-4%20-103%20-11%20-159%20-36%20-129%20-61%20-195%20-135%20-297%20-334%20-89%20-176%20-138%20-208%20-391%20-258%20-379%20-75%20-614%20-259%20-723%20-565%20-26%20-73%20-28%20-92%20-28%20-215%200%20-118%204%20-146%2028%20-225%2099%20-325%20442%20-712%20783%20-883%20336%20-169%20688%20-118%20919%20131%2036%2040%2086%20106%20110%20147%2041%2069%20104%20240%20119%20320%2021%20111%2061%20261%2080%20300%2035%2069%20108%20130%20235%20195%20224%20117%20330%20271%20330%20485%200%20130%20-39%20233%20-144%20385%20l-55%2080%20167%20170%20c92%2094%20319%20324%20503%20511%20310%20315%20339%20342%20377%20349%2023%204%2061%2020%2084%2036%2024%2016%2046%2029%2050%2029%203%200%204%20-18%201%20-39%20-4%20-32%20-2%20-41%2015%20-50%2017%20-9%2026%20-6%2051%2015%2017%2014%2031%2032%2031%2039%200%2022%20-29%2045%20-57%2045%20-13%200%20-23%204%20-21%209%202%204%2055%2053%20118%20109%20109%2095%20143%20115%20120%2071%20-15%20-27%204%20-59%2035%20-59%2027%200%2065%2032%2065%2054%200%2023%20-30%2047%20-50%2041%20-36%20-11%20-29%2014%2012%2049%2042%2035%2043%2036%2042%2098%200%2050%20-8%2081%20-38%20149%20-21%2048%20-48%2097%20-60%20109%20-30%2027%20-198%2090%20-243%2090%20-26%200%20-44%20-10%20-82%20-45z%20m193%20-45%20c44%20-16%2085%20-35%2092%20-42%2022%20-24%2077%20-163%2078%20-198%201%20-32%20-9%20-43%20-179%20-193%20-99%20-87%20-196%20-169%20-215%20-182%20-35%20-23%20-110%20-43%20-110%20-28%201%2013%2088%2078%20112%2083%2014%204%2024%2015%2026%2028%204%2024%2076%2088%20107%2094%2013%202%2020%2011%2020%2027%200%2026%2069%2091%2096%2091%2022%200%2043%2026%2035%2045%20-11%2030%20-38%2030%20-65%20-2%20-39%20-44%20-391%20-304%20-409%20-301%20-8%202%20-19%2010%20-25%2019%20-8%2013%203%2031%2052%2090%20121%20144%20146%20173%20187%20228%2023%2031%2054%2067%2068%2080%2031%2029%2033%2056%207%2071%20-15%207%20-23%206%20-35%20-6%20-9%20-8%20-16%20-21%20-16%20-28%200%20-15%20-70%20-84%20-101%20-100%20-13%20-6%20-25%20-20%20-27%20-31%20-5%20-25%20-60%20-84%20-89%20-96%20-13%20-5%20-23%20-17%20-23%20-28%200%20-17%20-76%20-91%20-93%20-91%20-7%200%2031%2099%2048%20123%208%2011%2087%20101%20176%20199%20113%20125%20168%20178%20183%20178%2011%200%2057%20-13%20100%20-30z%20m-534%20-230%20c0%20-5%20-5%20-10%20-11%20-10%20-5%200%20-7%205%20-4%2010%203%206%208%2010%2011%2010%202%200%204%20-4%204%20-10z%20m320%206%20c0%20-2%20-8%20-10%20-17%20-17%20-16%20-13%20-17%20-12%20-4%204%2013%2016%2021%2021%2021%2013z%20m250%20-56%20c0%20-5%20-5%20-10%20-11%20-10%20-5%200%20-7%205%20-4%2010%203%206%208%2010%2011%2010%202%200%204%20-4%204%20-10z%20m-350%20-65%20c-13%20-14%20-26%20-23%20-28%20-20%20-3%203%205%2016%2018%2030%2013%2014%2026%2023%2028%2020%203%20-3%20-5%20-16%20-18%20-30z%20m-70%20-82%20c-1%20-5%20-21%20-30%20-45%20-57%20-38%20-43%20-45%20-47%20-51%20-31%20-5%2013%203%2028%2034%2057%2039%2036%2063%2048%2062%2031z%20m210%20-38%20c-19%20-19%20-39%20-35%20-44%20-35%20-11%201%2062%2070%2073%2070%203%200%20-10%20-16%20-29%20-35z%20m-410%20-110%20c-27%20-27%20-46%20-41%20-49%20-33%20-4%2013%2065%2078%2083%2078%205%200%20-10%20-20%20-34%20-45z%20m310%2035%20c0%20-17%20-84%20-88%20-98%20-83%20-19%208%20-12%2017%2038%2057%2047%2037%2060%2042%2060%2026z%20m-272%20-76%20c-28%20-29%20-50%20-44%20-58%20-39%20-8%205%203%2023%2036%2056%2033%2033%2051%2046%2058%2039%207%20-7%20-5%20-25%20-36%20-56z%20m84%202%20c0%20-4%20-19%20-28%20-42%20-53%20-31%20-32%20-46%20-41%20-53%20-34%20-8%208%202%2024%2033%2056%2041%2042%2061%2052%2062%2031z%20m-242%20-71%20c-24%20-25%20-49%20-45%20-54%20-45%20-6%200%2010%2020%2034%2045%2024%2025%2049%2045%2054%2045%206%200%20-10%20-20%20-34%20-45z%20m290%2037%20c0%20-4%20-19%20-30%20-43%20-57%20-29%20-32%20-47%20-46%20-56%20-41%20-9%206%200%2022%2035%2057%2046%2047%2064%2058%2064%2041z%20m-210%20-35%20c0%20-21%20-87%20-100%20-100%20-92%20-8%205%204%2023%2036%2056%2050%2050%2064%2058%2064%2036z%20m240%20-15%20c0%20-14%20-79%20-86%20-87%20-79%20-4%204%2011%2025%2032%2047%2038%2039%2055%2049%2055%2032z%20m-190%20-33%20c0%20-12%20-90%20-98%20-102%20-99%20-20%20-1%20-4%2029%2039%2072%2043%2044%2063%2052%2063%2027z%20m-255%20-79%20c-28%20-28%20-51%20-46%20-53%20-41%20-4%2011%2078%2090%2093%2091%205%200%20-13%20-23%20-40%20-50z%20m295%2037%20c0%20-21%20-87%20-100%20-100%20-92%20-8%205%204%2023%2036%2056%2050%2050%2064%2058%2064%2036z%20m-214%20-28%20c3%20-6%20-14%20-32%20-40%20-57%20-36%20-37%20-48%20-44%20-58%20-34%20-9%209%20-3%2022%2032%2057%2047%2048%2055%2052%2066%2034z%20m205%20-62%20c-27%20-28%20-54%20-48%20-58%20-44%20-9%2010%2088%20108%20100%20100%205%20-3%20-14%20-28%20-42%20-56z%20m-197%20-38%20c-43%20-44%20-64%20-53%20-64%20-28%200%205%2019%2029%2042%2054%2033%2035%2045%2042%2055%2033%2011%20-9%205%20-20%20-33%20-59z%20m-208%20-27%20c-25%20-25%20-49%20-43%20-53%20-39%20-9%2010%2078%2098%2090%2090%205%20-3%20-11%20-26%20-37%20-51z%20m288%2040%20c6%20-10%20-78%20-102%20-94%20-102%20-21%200%20-9%2026%2032%2066%2046%2044%2054%2049%2062%2036z%20m-208%20-33%20c4%20-6%20-14%20-32%20-40%20-58%20-38%20-38%20-48%20-43%20-56%20-31%20-7%2011%201%2026%2032%2057%2045%2046%2053%2050%2064%2032z%20m203%20-65%20c-23%20-24%20-46%20-41%20-52%20-37%20-5%203%2013%2027%2039%2054%2027%2027%2050%2045%2053%2038%202%20-6%20-16%20-31%20-40%20-55z%20m-155%2018%20c3%20-5%20-17%20-30%20-44%20-57%20-43%20-43%20-50%20-46%20-56%20-30%20-6%2014%203%2028%2037%2057%2046%2040%2054%2044%2063%2030z%20m-204%20-30%20c0%20-17%20-88%20-94%20-95%20-83%20-4%207%2012%2028%2037%2051%2043%2039%2058%2047%2058%2032z%20m207%20-69%20c-35%20-35%20-50%20-44%20-58%20-36%20-8%208%201%2023%2037%2057%2033%2032%2051%2043%2058%2036%207%20-7%20-4%20-25%20-37%20-57z%20m-163%2029%20c3%20-5%20-15%20-28%20-39%20-52%20-35%20-34%20-48%20-41%20-57%20-32%20-9%209%20-3%2021%2027%2052%2038%2039%2059%2048%2069%2032z%20m236%20-19%20c-1%20-5%20-18%20-27%20-40%20-51%20-24%20-27%20-41%20-39%20-45%20-31%20-4%206%2010%2028%2031%2050%2036%2037%2054%2048%2054%2032z%20m-194%20-24%20c3%20-6%20-13%20-31%20-37%20-55%20-33%20-34%20-46%20-41%20-56%20-32%20-11%209%20-6%2019%2029%2055%2045%2045%2053%2050%2064%2032z%20m-242%20-80%20c-24%20-25%20-41%20-36%20-48%20-29%20-6%206%206%2023%2035%2049%2055%2049%2065%2033%2013%20-20z%20m286%2028%20c0%20-7%20-18%20-31%20-40%20-52%20-32%20-31%20-43%20-36%20-52%20-27%20-10%2010%20-4%2021%2027%2051%2042%2040%2065%2050%2065%2028z%20m-200%20-20%20c0%20-7%20-18%20-31%20-40%20-52%20-31%20-30%20-43%20-36%20-52%20-27%20-9%209%20-3%2021%2027%2052%2039%2040%2065%2051%2065%2027z%20m240%20-17%20c0%20-17%20-80%20-91%20-91%20-84%20-7%204%207%2024%2032%2050%2043%2044%2059%2053%2059%2034z%20m-231%20-76%20c-34%20-34%20-46%20-41%20-56%20-32%20-11%209%20-6%2019%2028%2054%2034%2034%2046%2041%2056%2032%2011%20-9%206%20-19%20-28%20-54z%20m-203%20-12%20c-19%20-20%20-39%20-33%20-42%20-29%20-10%2010%2057%2078%2069%2070%205%20-3%20-7%20-22%20-27%20-41z%20m280%2017%20c7%20-12%20-64%20-89%20-83%20-89%20-22%200%20-15%2016%2025%2059%2040%2043%2047%2047%2058%2030z%20m-201%20-19%20c3%20-6%20-9%20-26%20-28%20-47%20-25%20-26%20-40%20-34%20-53%20-29%20-15%206%20-12%2012%2021%2046%2041%2042%2050%2046%2060%2030z%20m245%20-27%20c0%20-13%20-74%20-83%20-87%20-83%20-21%200%20-15%2012%2024%2052%2034%2035%2063%2049%2063%2031z%20m-229%20-67%20c-32%20-32%20-43%20-38%20-53%20-28%20-18%2018%2060%2097%2079%2080%2012%20-9%207%20-19%20-26%20-52z%20m-721%204%20c61%20-24%20189%20-97%20233%20-132%20l28%20-23%20-149%20-152%20-149%20-151%20-84%201%20c-171%202%20-307%20-81%20-378%20-232%20-24%20-51%20-26%20-67%20-27%20-184%20l0%20-128%20-149%20-149%20c-83%20-83%20-155%20-150%20-161%20-150%20-6%200%20-50%2041%20-98%2090%20-61%2063%20-94%2090%20-111%2090%20-27%200%20-139%20-120%20-133%20-144%205%20-23%20617%20-646%20635%20-646%2019%200%20143%20119%20143%20138%200%207%20-46%2063%20-101%20123%20l-102%20109%20142%20149%20c77%2081%20147%20154%20155%20160%2010%209%2031%209%2086%200%20140%20-24%20270%2020%20363%20121%2075%2080%2099%20146%20103%20270%20l2%2095%20147%20153%20c81%2084%20153%20151%20159%20149%2016%20-5%2094%20-123%20131%20-200%2085%20-174%2064%20-365%20-55%20-500%20-43%20-48%20-110%20-93%20-252%20-170%20-160%20-87%20-210%20-159%20-254%20-362%20-73%20-338%20-142%20-488%20-289%20-623%20-165%20-151%20-403%20-204%20-628%20-138%20-203%2060%20-380%20179%20-592%20397%20-348%20359%20-444%20714%20-278%201031%20111%20213%20330%20347%20683%20417%20213%2043%20290%20103%20390%20304%2038%2077%2082%20147%20111%20180%2049%2055%20137%20109%20205%20127%2063%2015%20211%205%20274%20-20z%20m560%2022%20c0%20-5%20-13%20-21%20-29%20-36%20-40%20-38%20-62%20-24%20-25%2015%2026%2028%2054%2038%2054%2021z%20m210%20-67%20c-31%20-32%20-60%20-45%20-60%20-28%200%204%2017%2024%2037%2045%2025%2025%2040%2035%2047%2028%207%20-7%20-1%20-22%20-24%20-45z%20m-189%20-8%20c-20%20-20%20-35%20-28%20-47%20-23%20-15%206%20-13%2011%2016%2041%2026%2027%2036%2032%2047%2023%2012%20-9%209%20-17%20-16%20-41z%20m259%206%20c0%20-13%20-64%20-73%20-77%20-73%20-20%200%20-16%2011%2019%2047%2029%2030%2058%2043%2058%2026z%20m-190%20-15%20c0%20-16%20-51%20-68%20-67%20-68%20-21%200%20-15%2022%2014%2052%2028%2029%2053%2037%2053%2016z%20m-202%20-28%20c-20%20-27%20-48%20-41%20-48%20-23%200%2013%2043%2053%2057%2053%2010%200%207%20-9%20-9%20-30z%20m62%20-24%20c0%20-7%20-11%20-23%20-25%20-36%20-19%20-18%20-28%20-21%20-37%20-12%20-9%209%20-5%2019%2017%2042%2028%2029%2045%2031%2045%206z%20m180%202%20c0%20-16%20-41%20-58%20-57%20-58%20-19%200%20-16%208%2015%2045%2026%2031%2042%2036%2042%2013z%20m-310%20-41%20c0%20-20%20-37%20-50%20-50%20-42%20-8%205%20-4%2015%2011%2031%2025%2027%2039%2031%2039%2011z%20m176%202%20c3%20-6%20-6%20-24%20-22%20-40%20-21%20-22%20-30%20-26%20-41%20-17%20-11%209%20-9%2016%2013%2040%2030%2030%2039%2034%2050%2017z%20m178%203%20c3%20-5%20-10%20-23%20-28%20-41%20-43%20-41%20-61%20-23%20-20%2020%2029%2030%2039%2035%2048%2021z%20m-304%20-45%20c0%20-8%20-11%20-24%20-25%20-37%20-19%20-18%20-28%20-21%20-37%20-12%20-9%209%20-6%2018%2012%2037%2025%2027%2050%2033%2050%2012z%20m170%20-10%20c0%20-20%20-47%20-60%20-60%20-52%20-8%205%20-3%2016%2016%2036%2030%2032%2044%2036%2044%2016z%20m-300%20-25%20c0%20-14%20-39%20-46%20-47%20-39%20-3%204%202%2016%2012%2027%2019%2021%2035%2026%2035%2012z%20m160%20-47%20c-28%20-29%20-36%20-31%20-44%20-8%20-4%2010%202%2025%2016%2040%2019%2021%2024%2022%2037%208%2013%20-13%2012%20-17%20-9%20-40z%20m183%2038%20c8%20-7%20-41%20-63%20-55%20-63%20-15%200%20-8%2024%2014%2047%2023%2024%2030%2027%2041%2016z%20m-293%20-36%20c0%20-8%20-9%20-22%20-20%20-32%20-16%20-14%20-23%20-16%20-32%20-7%20-9%209%20-7%2016%207%2032%2021%2023%2045%2026%2045%207z%20m148%20-43%20c-37%20-38%20-58%20-21%20-22%2017%2019%2020%2031%2026%2038%2019%207%20-7%202%20-19%20-16%20-36z%20m-268%2013%20c0%20-20%20-37%20-50%20-50%20-42%20-8%205%20-4%2015%2011%2031%2025%2027%2039%2031%2039%2011z%20m146%20-46%20c-20%20-20%20-28%20-23%20-38%20-13%20-18%2018%2029%2067%2049%2050%2012%20-9%2010%20-16%20-11%20-37z%20m184%2021%20c0%20-16%20-32%20-52%20-46%20-52%20-19%200%20-18%2019%203%2042%2016%2018%2043%2025%2043%2010z%20m-284%20-13%20c3%20-6%20-5%20-23%20-20%20-38%20-22%20-22%20-28%20-24%20-36%20-11%20-6%2010%20-3%2021%2012%2037%2024%2026%2034%2028%2044%2012z%20m149%20-49%20c-17%20-19%20-45%20-27%20-45%20-13%200%204%2010%2017%2022%2030%2028%2030%2051%2014%2023%20-17z%20m-272%2013%20c8%20-7%20-21%20-43%20-35%20-43%20-12%200%20-10%2024%204%2038%2014%2014%2022%2015%2031%205z%20m173%20-15%20c4%20-6%20-3%20-19%20-16%20-30%20-42%20-34%20-69%20-15%20-33%2024%2018%2021%2039%2023%2049%206z%20m154%20-21%20c0%20-16%20-38%20-39%20-51%20-31%20-6%204%20-2%2015%2012%2030%2022%2023%2039%2024%2039%201z%20m-285%20-7%20c8%20-13%20-13%20-40%20-31%20-40%20-17%200%20-18%2022%20-2%2038%2015%2015%2025%2015%2033%202z%20m155%20-45%20c-16%20-17%20-27%20-22%20-34%20-15%20-6%206%20-2%2018%2014%2035%2016%2017%2027%2022%2034%2015%206%20-6%202%20-18%20-14%20-35z%20m-262%209%20c-4%20-21%20-44%20-48%20-52%20-36%20-8%2013%2022%2052%2040%2052%209%200%2014%20-7%2012%20-16z%20m162%20-18%20c0%20-20%20-28%20-39%20-46%20-32%20-15%206%20-14%209%206%2031%2023%2025%2040%2025%2040%201z%20m154%20-5%20c3%20-4%20-5%20-18%20-18%20-30%20-29%20-27%20-47%20-10%20-20%2020%2019%2021%2030%2024%2038%2010z%20m-269%20-12%20c8%20-12%20-23%20-49%20-42%20-49%20-18%200%20-16%2020%204%2042%2018%2021%2029%2023%2038%207z%20m-234%20-33%20c-14%20-15%20-39%20-26%20-67%20-31%20-148%20-22%20-249%20-130%20-261%20-279%20-5%20-51%20-11%20-70%20-29%20-87%20-13%20-12%20-26%20-20%20-30%20-17%20-12%2013%20-4%20140%2012%20191%2045%20144%20183%20246%20333%20247%20l64%200%20-22%20-24z%20m387%208%20c-4%20-20%20-34%20-41%20-44%20-31%20-8%208%2024%2047%2038%2047%205%200%208%20-7%206%20-16z%20m-273%20-5%20c8%20-12%20-23%20-49%20-42%20-49%20-17%200%20-16%205%203%2035%2018%2027%2029%2031%2039%2014z%20m154%20-45%20c-17%20-19%20-25%20-21%20-36%20-12%20-11%209%20-10%2015%208%2034%2017%2019%2025%2021%2036%2012%2011%20-9%2010%20-15%20-8%20-34z%20m167%2015%20c3%20-6%20-3%20-21%20-15%20-32%20-16%20-16%20-23%20-19%20-33%20-9%20-9%209%20-7%2016%207%2032%2020%2023%2031%2025%2041%209z%20m-270%20-10%20c10%20-17%20-31%20-53%20-52%20-45%20-15%206%20-15%209%206%2031%2026%2028%2035%2030%2046%2014z%20m158%20-17%20c2%20-4%20-4%20-19%20-14%20-32%20-15%20-20%20-22%20-22%20-31%20-13%20-10%2010%20-9%2017%206%2033%2019%2021%2031%2025%2039%2012z%20m-114%20-35%20c0%20-7%20-5%20-18%20-12%20-25%20-16%20-16%20-38%20-15%20-38%201%200%207%205%2018%2012%2025%2016%2016%2038%2015%2038%20-1z%20m156%20-8%20c3%20-6%20-3%20-21%20-15%20-32%20-16%20-16%20-23%20-19%20-33%20-9%20-9%209%20-7%2016%207%2032%2020%2023%2031%2025%2041%209z%20m-521%20-99%20c-55%20-55%20-103%20-100%20-106%20-100%20-15%200%2015%2080%2043%20114%2031%2038%20109%2085%20143%2086%2014%200%20-9%20-28%20-80%20-100z%20m195%2094%20c0%20-12%20-298%20-303%20-304%20-297%20-3%204%20-6%2016%20-6%2028%200%2032%20252%20275%20286%20275%2013%200%2024%20-3%2024%20-6z%20m214%20-23%20c3%20-4%20-5%20-18%20-18%20-30%20-28%20-26%20-42%20-14%20-20%2017%2016%2023%2029%2028%2038%2013z%20m-164%20-11%20c12%20-8%20-18%20-42%20-149%20-174%20-129%20-130%20-168%20-163%20-178%20-154%20-8%206%20-12%2015%20-11%2019%204%2011%20311%20319%20318%20319%203%200%2012%20-5%2020%20-10z%20m210%20-37%20c0%20-12%20-33%20-43%20-47%20-43%20-17%200%20-17%2010%204%2032%2016%2018%2043%2025%2043%2011z%20m-154%20-14%20c4%20-7%20-62%20-80%20-157%20-175%20-145%20-146%20-165%20-162%20-179%20-149%20-13%2014%203%2033%20145%20175%2088%2088%20165%20160%20172%20160%206%200%2015%20-5%2019%20-11z%20m34%20-66%20c0%20-22%20-269%20-293%20-291%20-293%20-8%200%20-19%203%20-23%207%20-8%209%20284%20303%20301%20303%207%200%2013%20-8%2013%20-17z%20m127%20-90%20c-18%20-191%20-165%20-325%20-360%20-326%20-89%20-1%20-104%208%20-76%2042%2015%2018%2026%2022%2052%2018%2040%20-6%20121%2010%20167%2033%2077%2040%20142%20134%20155%20225%208%2048%2039%2090%2059%2078%205%20-3%206%20-35%203%20-70z%20m-129%20-25%20c-18%20-80%20-72%20-141%20-147%20-167%20-83%20-28%20-79%20-14%2034%2099%2060%2061%20113%20110%20116%20110%204%200%203%20-19%20-3%20-42z%20m-491%20-64%20c3%20-8%20-4%20-25%20-18%20-40%20-20%20-21%20-24%20-22%20-32%20-9%20-6%2011%20-3%2024%207%2041%2019%2028%2034%2031%2043%208z%20m28%20-104%20c-22%20-24%20-31%20-25%20-39%20-4%20-4%2010%201%2025%2011%2036%2015%2017%2018%2017%2032%204%2013%20-14%2013%20-18%20-4%20-36z%20m-106%2015%20c2%20-14%20-39%20-60%20-145%20-162%20-139%20-134%20-169%20-156%20-169%20-123%200%2017%20287%20309%20300%20306%206%20-2%2012%20-11%2014%20-21z%20m169%20-37%20c9%20-9%208%20-16%20-5%20-30%20-9%20-10%20-22%20-18%20-29%20-18%20-22%200%20-27%2021%20-8%2041%2020%2022%2026%2023%2042%207z%20m-128%20-17%20c8%20-17%20-10%20-39%20-137%20-165%20-141%20-140%20-147%20-145%20-165%20-129%20-19%2017%20-14%2022%20134%20165%2084%2081%20154%20147%20155%20148%201%200%207%20-9%2013%20-19z%20m194%20-20%20c9%20-15%20-38%20-51%20-54%20-41%20-12%207%20-11%2012%204%2029%2020%2022%2041%2027%2050%2012z%20m-277%20-198%20c-138%20-138%20-148%20-147%20-164%20-131%20-15%2016%20-7%2026%20131%20164%20137%20137%20149%20146%20164%20130%2015%20-15%206%20-27%20-131%20-163z%20m-429%2055%20c71%20-76%2092%20-111%2052%20-86%20-25%2016%20-38%203%20-21%20-24%2011%20-17%2010%20-23%20-3%20-36%20-15%20-15%20-23%20-10%20-96%2063%20-44%2044%20-80%2084%20-80%2089%200%2012%2062%2077%2070%2074%203%20-2%2038%20-38%2078%20-80z%20m487%20-103%20c-142%20-150%20-148%20-155%20-167%20-138%20-18%2016%20-14%2022%20134%20170%20133%20133%20154%20151%20167%20138%2012%20-12%20-5%20-34%20-134%20-170z%20m-365%20-35%20c0%20-5%20-2%20-10%20-4%20-10%20-3%200%20-8%205%20-11%2010%20-3%206%20-1%2010%204%2010%206%200%2011%20-4%2011%20-10z%20m-42%20-33%20c7%20-8%207%20-18%202%20-27%20-7%20-12%20-12%20-11%20-30%205%20-16%2014%20-17%2020%20-8%2027%2018%2011%2024%2010%2036%20-5z%20m98%20-24%20c-7%20-7%20-26%207%20-26%2019%200%206%206%206%2015%20-2%209%20-7%2013%20-15%2011%20-17z%20m-46%20-18%20c6%20-8%209%20-23%205%20-36%20-6%20-17%20-4%20-20%2012%20-15%2013%204%2026%20-1%2037%20-12%2015%20-17%2015%20-20%201%20-32%20-14%20-12%20-22%20-7%20-61%2034%20-35%2038%20-42%2051%20-33%2062%2015%2018%2024%2018%2039%20-1z%20m100%20-37%20c0%20-6%20-7%20-5%20-15%202%20-8%207%20-15%2017%20-15%2022%200%206%207%205%2015%20-2%208%20-7%2015%20-17%2015%20-22z%20m45%20-38%20c3%20-5%202%20-10%20-4%20-10%20-5%200%20-13%205%20-16%2010%20-3%206%20-2%2010%204%2010%205%200%2013%20-4%2016%20-10z%20m-38%20-39%20c10%20-16%209%20-22%20-3%20-32%20-12%20-10%20-18%20-9%20-31%204%20-13%2013%20-14%2019%20-3%2031%2016%2021%2023%2020%2037%20-3z%20m168%20-91%20l90%20-90%20-38%20-38%20-38%20-37%20-90%2095%20c-49%2052%20-89%2098%20-89%20101%200%204%206%2012%2013%2018%2011%208%2018%206%2032%20-9%2010%20-11%2024%20-20%2032%20-20%2018%200%2016%2030%20-4%2052%20-9%2010%20-12%2018%20-7%2018%205%200%2050%20-41%2099%20-90z'/%3e%3cpath%20d='M4310%203911%20c-21%20-40%20-6%20-81%2031%20-81%2018%200%2069%2043%2069%2059%200%2038%20-81%2056%20-100%2022z%20m50%20-31%20c0%20-5%20-5%20-10%20-11%20-10%20-5%200%20-7%205%20-4%2010%203%206%208%2010%2011%2010%202%200%204%20-4%204%20-10z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M1405%204533%20c-155%20-20%20-340%20-129%20-451%20-263%20-59%20-73%20-121%20-198%20-139%20-285%20-19%20-90%20-19%20-252%200%20-335%2019%20-83%2057%20-169%20107%20-242%2033%20-49%2037%20-61%2028%20-79%20-17%20-30%20-3%20-75%2035%20-115%2032%20-33%2037%20-35%2092%20-33%2050%202%2066%20-2%20123%20-34%2082%20-45%20191%20-76%20301%20-84%20l86%20-6%2012%20-34%20c18%20-48%2064%20-75%20119%20-70%2048%205%2038%2013%20277%20-198%2044%20-39%20117%20-101%20163%20-139%2070%20-58%2083%20-73%2081%20-95%20-2%20-17%209%20-42%2030%20-71%2075%20-101%20121%20-260%20121%20-421%200%20-83%20-2%20-90%20-35%20-139%20-19%20-28%20-39%20-68%20-45%20-88%20-6%20-20%20-13%20-176%20-17%20-345%20-7%20-342%20-10%20-327%2059%20-327%20l38%200%202%20-276%20c3%20-246%205%20-278%2020%20-287%2012%20-8%2021%20-7%2032%202%2014%2012%2016%2050%2016%20287%20l0%20274%20100%200%20100%200%200%20-274%20c0%20-237%202%20-275%2016%20-287%2011%20-9%2020%20-10%2032%20-2%2015%209%2017%2041%2020%20287%20l2%20276%2034%200%20c70%200%2066%20-20%2066%20314%20l0%20302%2038%2013%20c20%208%2056%2026%2080%2042%2035%2024%2046%2027%2066%2018%2017%20-8%2029%20-8%2045%201%2026%2014%2015%2021%20171%20-115%20379%20-331%20358%20-315%20401%20-315%2022%200%2057%209%2078%2020%2036%2018%2040%2018%2053%203%2032%20-39%20220%20-193%20243%20-199%2018%20-5%2037%201%2067%2021%20l41%2027%2018%20-23%20c38%20-49%20109%20-199%20124%20-260%2020%20-88%2018%20-237%20-5%20-324%20-16%20-61%20-16%20-72%20-4%20-85%2024%20-24%2047%201%2067%2071%2057%20204%2019%20411%20-114%20616%20l-41%2062%2022%2023%20c51%2055%2037%2089%20-96%20227%20l-95%2099%2016%2050%20c25%2076%2010%20116%20-79%20210%20-40%2042%20-223%20241%20-407%20442%20-309%20339%20-564%20615%20-967%201049%20-155%20166%20-162%20176%20-162%20215%200%2051%20-29%20100%20-74%20127%20-36%2021%20-46%2042%20-46%2098%200%2084%20-65%20264%20-121%20335%20-17%2022%20-22%2040%20-20%2073%202%2039%20-1%2048%20-37%2083%20-35%2036%20-45%2040%20-88%2040%20-38%200%20-61%208%20-103%2035%20-146%2093%20-321%20131%20-496%20108z%20m319%20-93%20c68%20-23%20187%20-89%20193%20-106%207%20-22%20-348%20-424%20-538%20-609%20-136%20-132%20-354%20-325%20-367%20-325%20-4%200%20-23%2026%20-43%2058%20-127%20204%20-141%20436%20-39%20649%2058%20119%20179%20243%20290%20296%20120%2058%20168%2067%20310%2063%2098%20-2%20140%20-8%20194%20-26z%20m324%20-134%20c26%20-33%2020%20-47%20-64%20-153%20-251%20-317%20-626%20-696%20-876%20-886%20-41%20-32%20-70%20-30%20-89%204%20-15%2028%20-5%2040%20136%20160%20221%20188%20457%20428%20671%20680%2071%2085%20140%20168%20152%20186%2022%2032%2050%2035%2070%209z%20m128%20-311%20c14%20-44%2028%20-114%2031%20-155%20l5%20-75%20-209%20-215%20c-114%20-119%20-252%20-262%20-305%20-318%20l-98%20-102%20-73%200%20c-85%200%20-205%2028%20-280%2065%20-29%2015%20-55%2030%20-60%2034%20-4%204%2055%2062%20130%20128%20259%20228%20463%20441%20682%20711%20l83%20104%2034%20-48%20c19%20-27%2046%20-84%2060%20-129z%20m127%20-303%20c9%20-8%2017%20-28%2017%20-43%200%20-24%20-38%20-68%20-212%20-250%20-117%20-122%20-239%20-250%20-272%20-285%20-85%20-94%20-139%20-117%20-170%20-72%20-9%2012%20-16%2028%20-16%2035%200%207%20107%20124%20238%20260%20131%20137%20268%20279%20304%20317%2067%2070%2071%2071%20111%2038z%20m158%20-274%20c127%20-135%20983%20-1063%201284%20-1391%20105%20-114%20194%20-219%20199%20-234%206%20-18%204%20-35%20-7%20-59%20-22%20-46%20-220%20-248%20-262%20-268%20-31%20-15%20-38%20-15%20-62%20-2%20-29%2016%20-496%20422%20-501%20437%20-2%204%2013%2086%2032%20181%2051%20245%2057%20231%20-213%20481%20-171%20158%20-206%20186%20-246%20196%20-76%2019%20-122%202%20-288%20-106%20-85%20-55%20-101%20-62%20-115%20-51%20-133%20104%20-463%20390%20-460%20398%204%2012%20511%20540%20518%20540%203%200%2058%20-55%20121%20-122z%20m272%20-764%20c156%20-137%20350%20-322%20363%20-345%2020%20-39%2018%20-66%20-16%20-224%20-17%20-77%20-33%20-152%20-37%20-167%20-3%20-16%20-8%20-28%20-12%20-28%20-3%200%20-96%2079%20-206%20176%20-200%20176%20-435%20380%20-489%20426%20l-28%2024%2098%2064%20c168%20109%20194%20121%20241%20117%2031%20-3%2053%20-15%2086%20-43z%20m-138%20-475%20c77%20-68%20186%20-164%20243%20-212%2056%20-49%20100%20-93%2096%20-98%20-6%20-11%20-68%20-43%20-101%20-53%20-19%20-6%20-25%20-2%20-36%2027%20-22%2050%20-72%20103%20-124%20128%20-51%2025%20-153%2030%20-190%2011%20-20%20-11%20-21%20-8%20-27%2086%20-4%2053%20-16%20131%20-27%20174%20-25%2098%20-24%20106%204%2081%2012%20-11%2085%20-76%20162%20-144z%20m74%20-282%20c24%20-16%2048%20-44%2062%20-74%2023%20-46%2024%20-61%2031%20-333%204%20-156%205%20-286%203%20-288%20-8%20-8%20-404%20-11%20-408%20-4%20-2%204%20-1%20135%202%20292%20l6%20285%2028%2051%20c56%20100%20182%20133%20276%2071z%20m1376%20-382%20c53%20-58%2095%20-109%2093%20-114%20-5%20-15%20-109%20-121%20-118%20-121%20-14%200%20-220%20182%20-220%20194%200%2011%20130%20146%20141%20146%204%200%2050%20-47%20104%20-105z'/%3e%3cpath%20d='M2494%201821%20c-45%20-27%20-64%20-59%20-64%20-106%200%20-113%20132%20-175%20212%20-98%2044%2043%2055%2090%2030%20145%20-31%2072%20-113%2099%20-178%2059z%20m110%20-73%20c22%20-30%2020%20-54%20-5%20-79%20-27%20-27%20-66%20-21%20-92%2012%20-16%2023%20-17%2030%20-7%2050%2017%2031%2029%2039%2062%2039%2017%200%2033%20-9%2042%20-22z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M3765%204481%20c-60%20-32%20-168%20-91%20-240%20-131%20-71%20-40%20-220%20-122%20-330%20-183%20-110%20-60%20-402%20-222%20-650%20-360%20-247%20-138%20-544%20-303%20-660%20-367%20-239%20-133%20-873%20-486%20-1044%20-582%20-63%20-35%20-123%20-76%20-134%20-90%20-18%20-23%20-18%20-32%20-8%20-72%207%20-29%2011%20-159%2011%20-364%200%20-358%201%20-351%20-74%20-476%20-41%20-66%20-48%20-87%20-57%20-160%20-6%20-46%20-9%20-174%20-7%20-285%203%20-187%204%20-204%2022%20-217%2015%20-10%2054%20-14%20152%20-14%20l133%200%205%20-52%20c3%20-29%2017%20-158%2031%20-287%2014%20-129%2030%20-240%2036%20-248%2017%20-20%20182%20-18%20199%202%2012%2015%2032%20162%2060%20457%20l13%20128%20538%200%20539%200%200%20-200%200%20-200%20-25%200%20c-14%200%20-34%20-9%20-45%20-20%20-18%20-18%20-20%20-31%20-18%20-98%20l3%20-77%20339%20-3%20c242%20-2%20343%201%20352%209%2019%2015%2018%20122%20-1%20158%20-15%2030%20-33%2041%20-66%2041%20-18%200%20-19%209%20-19%20195%20l0%20195%20540%200%20539%200%205%20-33%20c3%20-17%2017%20-147%2031%20-287%2016%20-153%2031%20-260%2038%20-266%2018%20-17%20172%20-25%20193%20-10%2011%209%2021%2042%2030%20102%2013%2082%2044%20418%2044%20471%200%2023%201%2023%20134%2023%20194%200%20178%20-28%20174%20310%20l-3%20275%20-33%2055%20c-18%2030%20-47%2084%20-65%20120%20l-32%2065%20-3%20335%20c-3%20290%20-5%20337%20-19%20352%20-13%2015%20-33%2018%20-103%2018%20l-87%200%20-135%20238%20c-74%20130%20-204%20359%20-288%20507%20-84%20149%20-195%20344%20-247%20433%20-51%2090%20-93%20167%20-93%20172%200%204%2030%2024%2068%2044%20190%20102%20438%20246%20459%20266%2028%2027%2031%2079%206%20117%20-15%2022%20-67%2053%20-90%2053%20-4%200%20-57%20-27%20-118%20-59z%20m162%20-42%20c6%20-31%2059%200%20-687%20-411%20-239%20-132%20-473%20-262%20-520%20-288%20-47%20-27%20-310%20-173%20-585%20-325%20-749%20-415%20-1200%20-669%20-1225%20-690%20-18%20-17%20-152%20-23%20-157%20-8%20-6%2016%2010%2026%20592%20351%20143%2079%20379%20211%20525%20292%20146%2081%20380%20212%20520%20290%20251%20140%20783%20435%201255%20696%20214%20118%20242%20131%20260%20120%2011%20-8%2021%20-20%2022%20-27z%20m-410%20-699%20c83%20-146%20237%20-418%20343%20-605%20106%20-187%20204%20-357%20217%20-377%2012%20-21%2023%20-40%2023%20-43%200%20-3%20-191%20-5%20-425%20-5%20l-425%200%20-17%2027%20c-24%2037%20-24%20150%200%20222%20l18%2054%20-23%2023%20c-18%2017%20-47%2026%20-133%2039%20-60%209%20-166%2025%20-235%2036%20-261%2040%20-382%2037%20-735%20-22%20-232%20-38%20-223%20-36%20-236%20-60%20-8%20-16%20-7%20-36%206%20-84%2021%20-76%2018%20-197%20-6%20-220%20-13%20-13%20-72%20-15%20-446%20-13%20l-430%203%20266%20152%20c146%2083%20475%20267%20731%20408%20256%20142%20571%20316%20700%20388%20508%20282%20645%20356%20651%20349%203%20-4%2073%20-126%20156%20-272z%20m-727%20-680%20c255%20-38%20370%20-57%20377%20-64%204%20-4%202%20-33%20-5%20-64%20-21%20-100%20-12%20-178%2033%20-284%207%20-17%20-27%20-18%20-630%20-18%20-603%200%20-637%201%20-630%2018%203%209%2016%2052%2028%2096%2021%2077%2021%2080%203%20164%20-9%2046%20-16%2086%20-14%2087%204%204%20356%2062%20443%2074%20118%2015%20254%2012%20395%20-9z%20m-926%20-450%20l1%20-35%20695%200%20695%200%203%2038%203%2037%20533%200%20c417%200%20536%20-3%20544%20-13%207%20-8%2012%20-128%2014%20-327%203%20-300%205%20-318%2026%20-372%2013%20-32%2038%20-79%2056%20-105%2053%20-78%2056%20-96%2056%20-354%20l0%20-239%20-1925%200%20-1926%200%203%20248%203%20247%2035%2065%20c19%2036%2046%2087%2060%20115%20l25%2050%203%20325%20c3%20282%205%20327%2019%20342%2015%2017%2049%2018%20547%2016%20l530%20-3%200%20-35z%20m-707%20-1452%20c-3%20-13%20-13%20-108%20-22%20-213%20-9%20-104%20-20%20-217%20-23%20-250%20l-7%20-60%20-52%20-3%20-52%20-3%20-5%2043%20c-26%20213%20-38%20328%20-43%20411%20l-6%2097%20108%200%20c106%200%20107%200%20102%20-22z%20m1254%20-178%20l0%20-195%20-26%20-3%20-25%20-3%200%20201%200%20201%2026%20-3%2026%20-3%20-1%20-195z%20m229%200%20l0%20-200%20-80%200%20-80%200%200%20200%200%20200%2080%200%2080%200%200%20-200z%20m120%200%20l0%20-200%20-30%200%20-30%200%200%20200%200%20200%2030%200%2030%200%200%20-200z%20m1416%20103%20c-4%20-54%20-16%20-176%20-27%20-270%20-10%20-95%20-19%20-175%20-19%20-178%200%20-3%20-25%20-5%20-55%20-5%20-49%200%20-55%202%20-60%2023%20-4%2020%20-45%20486%20-45%20515%200%209%2031%2012%20106%2012%20l107%200%20-7%20-97z%20m-1316%20-403%20l0%20-40%20-295%200%20-295%200%200%2040%200%2040%20295%200%20295%200%200%20-40z'/%3e%3cpath%20d='M950%202512%20c-8%20-2%20-25%20-14%20-37%20-25%20-22%20-20%20-23%20-26%20-23%20-226%200%20-263%20-8%20-311%20-64%20-425%20-24%20-50%20-49%20-109%20-55%20-131%20-6%20-22%20-11%20-116%20-11%20-209%200%20-149%202%20-167%2016%20-162%209%203%20821%206%201806%206%20l1790%200%20-4%20183%20-3%20182%20-48%2093%20c-71%20139%20-77%20171%20-77%20424%200%20223%20-4%20254%20-41%20276%20-15%2010%20-390%2013%20-1627%2016%20-884%202%20-1614%201%20-1622%20-2z%20m3228%20-279%20l2%20-213%20-1615%200%20-1615%200%200%20215%200%20215%201613%20-2%201612%20-3%203%20-212z%20m-3128%20-295%20c0%20-13%20-9%20-84%20-19%20-158%20-11%20-74%20-17%20-138%20-15%20-142%203%20-4%2019%20-8%2036%20-8%2030%200%2030%20-1%2024%20-42%20-3%20-24%20-8%20-76%20-12%20-115%20l-7%20-73%20-83%200%20c-73%200%20-84%202%20-84%2018%200%2020%2070%20511%2076%20530%202%207%2020%2012%2044%2012%2035%200%2040%20-3%2040%20-22z%20m223%2015%20c2%20-5%20-4%20-69%20-15%20-143%20-23%20-164%20-22%20-173%2017%20-180%2017%20-3%2029%20-10%2029%20-15%20-1%20-6%20-5%20-56%20-9%20-112%20l-7%20-103%20-95%200%20-95%200%206%2048%20c3%2026%208%2077%2012%20114%206%2066%207%2067%2037%2070%20l32%203%2013%20139%20c8%2077%2018%20150%2023%20163%208%2022%2043%2032%2052%2016z%20m102%20-5%20c3%20-7%20-1%20-67%20-8%20-133%20l-12%20-120%20-29%20-3%20c-27%20-3%20-28%20-2%20-23%2030%204%2018%2011%2074%2017%20123%2014%20109%2015%20115%2035%20115%209%200%2018%20-6%2020%20-12z%20m181%20-60%20c-13%20-153%20-36%20-444%20-36%20-465%200%20-22%20-3%20-23%20-96%20-23%20l-97%200%207%2073%20c14%20154%2015%20157%2047%20157%2016%200%2029%204%2029%209%200%2029%2032%20306%2036%20313%203%204%2030%208%2061%208%20l56%200%20-7%20-72z%20m150%20-20%20c-3%20-51%20-9%20-125%20-12%20-165%20l-6%20-72%2033%20-3%20c19%20-2%2033%20-6%2032%20-10%20-2%20-5%20-3%20-55%20-3%20-113%20l0%20-105%20-95%200%20c-92%200%20-95%201%20-95%2023%200%2054%2040%20519%2045%20528%204%205%2029%209%2057%209%20l51%200%20-7%20-92z%20m107%2026%20c-2%20-33%20-6%20-92%20-9%20-131%20-5%20-69%20-7%20-73%20-30%20-73%20l-25%200%206%20113%20c8%20150%2010%20158%2038%20153%2020%20-3%2022%20-8%2020%20-62z%20m120%2059%20c2%20-5%20-2%20-75%20-8%20-158%20-7%20-82%20-10%20-153%20-6%20-157%203%20-3%2017%20-8%2031%20-10%2021%20-2%2026%20-9%2028%20-43%202%20-22%201%20-73%20-3%20-112%20l-7%20-73%20-91%200%20-92%200%203%20102%20c2%2057%205%20109%207%20116%202%206%2018%2012%2034%2012%20l29%200%206%20108%20c13%20209%2015%20222%2041%20222%2013%200%2026%20-3%2028%20-7z%20m102%20-3%20c3%20-5%203%20-66%20-1%20-135%20-7%20-124%20-7%20-125%20-31%20-125%20l-25%200%207%20128%20c4%2070%209%20130%2012%20135%206%2010%2031%209%2038%20-3z%20m176%20-100%20c0%20-58%20-4%20-183%20-7%20-277%20l-7%20-173%20-93%200%20-94%200%206%20103%20c7%20126%207%20125%2041%20129%20l28%203%208%20150%20c4%2083%209%20156%2012%20163%203%209%2021%2012%2056%2010%20l52%20-3%20-2%20-105z%20m153%20-55%20l1%20-160%2033%20-3%2032%20-3%200%20-115%200%20-114%20-97%200%20-96%200%207%20272%20c4%20149%209%20275%2012%20280%203%205%2028%208%2056%206%20l50%20-3%202%20-160z%20m106%2024%20l0%20-129%20-25%200%20-25%200%200%20129%20c0%20115%202%20130%2018%20134%209%202%2020%202%2025%200%204%20-2%207%20-62%207%20-134z%20m120%20-24%20l0%20-165%2030%200%2030%200%200%20-115%200%20-115%20-90%200%20-90%200%200%20115%200%20115%2030%200%2030%200%200%20165%200%20165%2030%200%2030%200%200%20-165z%20m284%2033%20c3%20-73%207%20-199%209%20-280%20l2%20-148%20-98%200%20-98%200%203%20113%203%20112%2033%203%2033%203%20-1%20157%20c-1%2086%20-1%20160%20-1%20165%201%204%2025%207%2055%207%20l54%200%206%20-132z%20m152%20-33%20c7%20-88%2012%20-161%2013%20-162%200%20-1%2016%20-3%2034%20-5%20l32%20-3%205%20-113%205%20-112%20-97%200%20-98%200%200%20108%20c0%2059%20-3%20185%20-7%20280%20l-6%20173%2054%20-3%2054%20-3%2011%20-160z%20m98%20148%20c2%20-10%208%20-71%2011%20-135%20l7%20-118%20-25%200%20c-24%200%20-25%203%20-31%2083%20-5%2078%20-9%20163%20-7%20180%202%2015%2040%206%2045%20-10z%20m120%20-45%20c3%20-35%209%20-108%2013%20-163%208%20-100%208%20-100%2036%20-103%2034%20-4%2034%20-3%2042%20-129%20l6%20-103%20-96%200%20-95%200%20-2%2095%20c-1%2052%20-2%20103%20-2%20112%20-1%2012%209%2020%2029%2023%2025%205%2030%2010%2028%2030%20-1%2014%20-7%2082%20-13%20153%20-6%2070%20-8%20132%20-5%20137%203%206%2017%2010%2030%2010%2022%200%2024%20-5%2029%20-62z%20m107%2012%20c3%20-25%209%20-84%2013%20-132%20l6%20-88%20-24%200%20c-28%200%20-31%2013%20-42%20173%20l-7%2099%2024%20-4%20c20%20-2%2025%20-10%2030%20-48z%20m174%2038%20c2%20-7%2011%20-107%2020%20-223%208%20-115%2018%20-236%2021%20-267%20l6%20-58%20-95%200%20-94%200%20-7%2038%20c-3%2020%20-6%2072%20-6%20114%200%2076%200%2077%2028%2080%2031%204%2031%204%2018%20206%20l-8%20122%2056%200%20c36%200%2058%20-4%2061%20-12z%20m149%204%20c4%20-8%2036%20-274%2036%20-306%200%20-9%2012%20-16%2033%20-18%20l32%20-3%207%20-75%20c4%20-41%209%20-92%2012%20-112%20l4%20-38%20-93%200%20-94%200%20-5%2043%20c-6%2048%20-36%20460%20-36%20495%200%2020%205%2022%2049%2022%2028%200%2052%20-4%2055%20-8z%20m110%20-14%20c3%20-13%2010%20-66%2016%20-118%206%20-52%2014%20-103%2016%20-112%204%20-14%20-1%20-18%20-23%20-18%20l-29%200%20-15%20131%20c-8%2071%20-13%20132%20-10%20135%2013%2013%2041%201%2045%20-18z%20m119%20-10%20c7%20-38%2026%20-207%2030%20-258%202%20-31%205%20-35%2034%20-38%2035%20-4%2036%20-7%2048%20-154%20l7%20-78%20-91%200%20c-49%200%20-92%203%20-94%208%20-3%204%20-8%2055%20-12%20115%20l-7%20107%2026%200%20c15%200%2029%206%2032%2014%203%207%20-4%2078%20-14%20157%20-11%2079%20-18%20147%20-15%20152%202%204%2015%207%2027%207%2019%200%2025%20-7%2029%20-32z%20m264%20-43%20c21%20-127%2073%20-462%2073%20-474%200%20-7%20-29%20-11%20-89%20-11%20l-89%200%20-7%2088%20c-3%2048%20-7%2098%20-8%20112%20-2%2020%204%2025%2028%2030%2036%207%2036%2011%2011%20183%20-10%2066%20-15%20126%20-12%20134%204%2010%2017%2013%2043%2011%20l38%20-3%2012%20-70z%20m-3010%2038%20c-3%20-16%20-12%20-74%20-18%20-130%20-12%20-98%20-14%20-103%20-36%20-103%20-28%200%20-28%206%20-8%20145%208%2055%2015%20103%2015%20108%200%204%2012%207%2026%207%2023%200%2026%20-3%2021%20-27z%20m1543%20-103%20l0%20-130%20-25%200%20-25%200%200%20130%200%20130%2025%200%2025%200%200%20-130z%20m1310%20118%20c0%20-7%207%20-62%2015%20-123%208%20-60%2015%20-113%2015%20-117%200%20-5%20-10%20-8%20-23%20-8%20-23%200%20-24%206%20-40%20123%20-10%2067%20-17%20125%20-17%20130%200%2013%2050%208%2050%20-5z%20m267%20-190%20c25%20-49%2027%20-63%2030%20-198%201%20-80%201%20-140%20-2%20-135%20-2%206%20-16%2087%20-30%20180%20-14%2094%20-28%20178%20-31%20188%20-10%2034%206%2016%2033%20-35z%20m-3427%20-153%20l-30%20-190%203%20145%20c3%20129%206%20150%2027%20192%2013%2026%2025%2046%2026%2045%202%20-1%20-10%20-88%20-26%20-192z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M2196%204525%20c-73%20-20%20-174%20-73%20-193%20-101%20-14%20-23%20-14%20-26%201%20-43%209%20-9%2016%20-22%2016%20-27%200%20-19%20-140%20-67%20-210%20-72%20-55%20-4%20-77%20-1%20-112%2016%20-29%2014%20-75%2022%20-143%2027%20l-101%207%20-113%20-46%20c-133%20-53%20-161%20-70%20-161%20-95%200%20-31%2025%20-42%20153%20-73%20165%20-39%20251%20-43%20441%20-24%20136%2014%20177%2022%20275%2057%20230%2080%20269%2084%20315%2029%2025%20-30%2041%20-96%2034%20-140%20-2%20-18%20-12%20-26%20-48%20-34%20l-45%20-11%20-6%20-160%20c-4%20-88%20-7%20-241%20-8%20-341%20-1%20-175%200%20-181%2022%20-201%2012%20-11%2033%20-24%2046%20-28%2024%20-7%2024%20-8%2018%20-119%20-4%20-61%20-11%20-268%20-17%20-461%20-6%20-192%20-13%20-364%20-16%20-381%20-3%20-25%20-10%20-33%20-33%20-37%20-55%20-11%20-58%20-22%20-66%20-209%20-4%20-95%20-5%20-189%20-3%20-208%203%20-32%206%20-36%2047%20-45%20l44%20-9%20-6%20-171%20c-4%20-93%20-7%20-214%20-7%20-268%200%20-69%20-4%20-99%20-12%20-101%20-7%20-2%20-32%20-9%20-54%20-15%20-23%20-6%20-45%20-18%20-48%20-26%20-5%20-14%2010%20-278%2019%20-320%206%20-27%2065%20-55%20113%20-55%2035%200%2041%20-5%2080%20-60%20129%20-182%20362%20-260%20597%20-200%20234%2060%20361%20241%20385%20549%206%2069%2017%20216%2025%20326%2036%20480%20110%20750%20245%20884%2070%2070%2091%2078%20145%2059%2053%20-20%2091%20-12%20118%2024%2028%2038%2010%2081%20-66%20155%20-93%2090%20-562%20490%20-596%20508%20-55%2028%20-100%2014%20-120%20-38%20-8%20-21%20-5%20-35%2014%20-72%2033%20-61%2031%20-79%20-10%20-150%20-173%20-295%20-236%20-580%20-261%20-1175%20-4%20-98%20-2%20-206%206%20-293%2012%20-133%2012%20-139%20-11%20-207%20-19%20-59%20-26%20-70%20-45%20-70%20-13%200%20-33%2013%20-48%2031%20-23%2027%20-26%2039%20-26%20105%200%2064%204%2081%2025%20112%2014%2020%2025%2042%2025%2049%200%206%2010%2013%2023%2015%20l22%203%200%20632%20c0%20604%20-1%20632%20-19%20652%20-14%2015%20-31%2021%20-63%2021%20-41%200%20-43%201%20-43%2030%200%2017%206%2033%2014%2036%208%203%2024%2024%2036%2048%2031%2057%2022%20108%20-27%20154%20l-36%2033%2032%2033%20c40%2041%2049%2091%2026%20140%20-10%2020%20-26%2041%20-36%2047%20-23%2012%20-25%2035%20-3%2043%208%203%2024%2026%2035%2051%2026%2060%2018%2096%20-32%20143%20l-39%2037%200%20120%20c0%2066%20-5%20200%20-10%20298%20-9%20173%20-9%20179%2013%20220%2075%20144%20-48%20340%20-248%20393%20-63%2017%20-205%2016%20-269%20-1z%20m296%20-74%20c92%20-35%20166%20-121%20183%20-214%2010%20-51%20-6%20-46%20-29%209%20-28%2069%20-105%20146%20-177%20179%20-56%2025%20-69%2027%20-153%2023%20-74%20-4%20-105%20-10%20-163%20-36%20-40%20-17%20-75%20-27%20-78%20-23%20-11%2019%2065%2058%20149%2077%2081%2018%20196%2012%20268%20-15z%20m-35%20-85%20c63%20-30%20126%20-106%20148%20-179%2018%20-58%2030%20-206%2041%20-504%20l7%20-201%20-32%20-17%20c-39%20-20%20-65%20-74%20-56%20-116%208%20-36%2041%20-78%2071%20-89%2023%20-9%2033%20-30%2015%20-30%20-5%200%20-23%20-11%20-39%20-25%20-56%20-47%20-47%20-125%2019%20-179%2022%20-18%2030%20-29%2021%20-33%20-27%20-11%20-70%20-54%20-82%20-83%20-10%20-24%20-10%20-40%20-1%20-70%2012%20-39%2061%20-90%2087%20-90%2029%200%2013%20-31%20-24%20-46%20-43%20-17%20-82%20-73%20-82%20-118%200%20-51%2052%20-120%2095%20-128%2013%20-2%2021%20-12%2023%20-29%203%20-23%20-4%20-30%20-45%20-50%20-32%20-16%20-54%20-36%20-67%20-60%20-19%20-35%20-19%20-38%20-2%20-83%2019%20-49%2054%20-76%20101%20-76%2016%200%2025%20-6%2025%20-15%200%20-16%20-5%20-19%20-53%20-30%20-79%20-17%20-106%20-125%20-47%20-184%2017%20-17%2046%20-33%2065%20-37%2025%20-4%2035%20-11%2035%20-25%200%20-14%20-7%20-19%20-29%20-19%20-39%200%20-88%20-43%20-101%20-88%20-8%20-30%20-6%20-44%2011%20-79%2022%20-45%2044%20-62%2094%20-73%2044%20-9%2038%20-33%20-9%20-41%20-28%20-5%20-50%20-17%20-73%20-43%20-28%20-31%20-33%20-43%20-33%20-86%200%20-86%2044%20-142%20120%20-155%20l40%20-7%200%20-70%20c0%20-45%206%20-83%2017%20-105%2021%20-45%2082%20-90%20136%20-98%2026%20-4%2054%20-18%2072%20-35%20107%20-102%20265%20-42%20265%20100%20-1%2096%20-68%20162%20-166%20164%20l-54%200%200%2063%200%2062%2035%20-15%20c51%20-21%20123%20-18%20175%209%20119%2059%20117%20251%20-2%20322%20-46%2027%20-123%2026%20-172%20-3%20-20%20-12%20-39%20-22%20-42%20-22%20-5%200%206%20132%2011%20138%201%202%2020%20-8%2040%20-23%2044%20-29%20128%20-35%20174%20-10%2064%2033%20109%20122%2097%20194%20-7%2045%20-49%20107%20-89%20131%20-39%2024%20-122%2027%20-172%206%20l-35%20-15%200%2032%20c0%2054%2029%20206%2062%20327%2024%2084%2056%20161%20119%20287%20l86%20172%2024%20-26%20c13%20-14%20117%20-109%20232%20-211%20114%20-102%20207%20-189%20207%20-193%200%20-5%20-12%20-15%20-27%20-23%20-63%20-33%20-145%20-134%20-188%20-229%20-83%20-189%20-129%20-464%20-155%20-937%20-6%20-107%20-15%20-217%20-20%20-245%20-39%20-226%20-203%20-380%20-425%20-401%20l-60%20-6%2033%2027%20c45%2037%2062%2075%2062%20138%200%2095%20-61%20158%20-157%20164%20-47%203%20-66%20-1%20-97%20-19%20-72%20-42%20-107%20-149%20-71%20-218%209%20-17%2013%20-30%2010%20-30%20-14%200%20-104%2073%20-132%20107%20-88%20110%20-116%20218%20-115%20438%201%20169%2022%20846%2047%201500%2023%20606%2034%20971%2037%201200%202%20206%201%20212%20-22%20260%20-38%2074%20-66%2090%20-158%2089%20-62%20-1%20-93%20-7%20-159%20-33%20-134%20-52%20-212%20-72%20-315%20-78%20l-98%20-6%200%2032%200%2031%2073%200%20c93%200%20125%2010%20282%2083%20163%2076%20194%2086%20275%2086%2049%201%2078%20-5%20117%20-23z%20m-819%20-115%20c9%20-5%2012%20-25%2010%20-57%20l-3%20-49%20-71%202%20c-63%203%20-261%2037%20-271%2047%20-3%202%2031%2018%2074%2035%2065%2025%2092%2030%20163%2030%2047%201%2091%20-3%2098%20-8z%20m756%20-548%20c-6%20-301%20-12%20-376%20-27%20-370%20-9%203%20-11%2081%20-8%20303%202%20164%205%20302%208%20307%202%204%2011%207%2018%207%2013%200%2014%20-37%209%20-247z%20m320%20-299%20c17%20-16%2021%20-51%208%20-70%20-22%20-34%20-85%20-23%20-97%2016%20-16%2050%2052%2091%2089%2054z%20m16%20-254%20c14%20-26%205%20-57%20-21%20-71%20-46%20-24%20-93%2024%20-64%2067%2020%2031%2069%2033%2085%204z%20m607%20-192%20c54%20-45%20170%20-145%20258%20-222%2088%20-78%20186%20-163%20218%20-190%2066%20-56%2084%20-83%2068%20-99%20-15%20-15%20-33%200%20-291%20224%20-258%20225%20-380%20340%20-380%20357%200%2027%2034%208%20127%20-70z%20m-613%20-47%20c25%20-27%2017%20-72%20-15%20-90%20-24%20-13%20-29%20-13%20-53%202%20-47%2031%20-27%20107%2028%20107%2013%200%2031%20-9%2040%20-19z%20m-9%20-286%20c30%20-29%2031%20-45%204%20-79%20-20%20-25%20-53%20-33%20-75%20-18%20-13%209%20-34%2046%20-34%2062%200%2017%2047%2060%2065%2060%209%200%2027%20-11%2040%20-25z%20m82%20-7%20c-3%20-8%20-6%20-5%20-6%206%20-1%2011%202%2017%205%2013%203%20-3%204%20-12%201%20-19z%20m12%20-850%20c0%20-142%20-2%20-258%20-5%20-258%20-3%200%20-14%2010%20-25%2023%20-22%2027%20-24%2091%20-4%20127%2021%2037%2019%20120%20-5%20150%20-26%2033%20-25%2073%202%20138%2022%2053%2022%2054%204%20100%20-29%2075%20-30%20106%20-6%20165%2019%2045%2020%2058%2011%2094%20-6%2022%20-18%2046%20-26%2053%20-25%2021%20-19%2097%2010%20132%2014%2016%2026%2037%2027%2046%203%2033%2015%20-516%2017%20-770z%20m-105%20546%20c52%20-51%20-22%20-126%20-76%20-77%20-25%2022%20-23%2059%204%2077%2029%2020%2052%2020%2072%200z%20m-364%20-216%20c0%20-150%20-10%20-238%20-26%20-238%20-16%200%20-18%2080%20-7%20243%204%2071%2010%2097%2020%2097%2010%200%2013%20-23%2013%20-102z%20m364%20-54%20c34%20-33%2011%20-84%20-37%20-84%20-38%200%20-57%2015%20-57%2046%200%2029%2025%2054%2055%2054%2013%200%2031%20-7%2039%20-16z%20m483%20-33%20c41%20-37%2050%20-73%2032%20-124%20-17%20-49%20-52%20-77%20-107%20-84%20-49%20-7%20-83%2012%20-112%2060%20-32%2052%20-26%2093%2019%20138%2034%2035%2044%2039%2088%2039%2040%200%2054%20-5%2080%20-29z%20m-473%20-243%20c9%20-12%2016%20-30%2016%20-40%200%20-24%20-35%20-58%20-60%20-58%20-24%200%20-60%2038%20-60%2064%200%2052%2075%2076%20104%2034z%20m423%20-143%20c37%20-10%2073%20-62%2073%20-105%200%20-84%20-46%20-130%20-131%20-130%20-38%200%20-50%205%20-78%2034%20-45%2046%20-53%20108%20-20%20150%2025%2031%2095%2068%20119%2061%208%20-2%2025%20-6%2037%20-10z%20m-403%20-146%20c14%20-17%2026%20-42%2026%20-56%200%20-28%20-49%20-83%20-75%20-83%20-57%200%20-106%2069%20-86%20123%2021%2056%2094%2065%20135%2016z%20m-419%20-374%20c4%20-47%2013%20-111%2020%20-142%207%20-32%2012%20-59%2010%20-61%20-2%20-2%20-16%200%20-32%205%20-28%2010%20-28%2010%20-40%20139%20-9%2098%20-9%20131%200%20136%2028%2018%2035%206%2042%20-77z%20m784%2038%20c60%20-75%2026%20-163%20-63%20-163%20-37%200%20-48%205%20-70%2031%20-25%2029%20-36%2095%20-20%20112%204%203%2021%20-10%2040%20-30%2028%20-30%2036%20-34%2049%20-23%2022%2018%2018%2040%20-12%2072%20l-27%2028%2041%200%20c33%200%2046%20-5%2062%20-27z%20m-257%20-282%20c29%20-26%2033%20-35%2033%20-80%200%20-66%20-31%20-101%20-99%20-108%20-42%20-5%20-48%20-3%20-81%2030%20-39%2039%20-45%2078%20-20%20127%2034%2067%20111%2081%20167%2031z'/%3e%3cpath%20d='M2502%203761%20c-10%20-6%20-16%20-152%20-28%20-642%20-8%20-349%20-13%20-713%20-12%20-809%203%20-167%204%20-175%2023%20-175%2012%200%2022%209%2027%2025%206%2020%2033%201290%2033%201522%200%2060%20-19%2094%20-43%2079z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M3105%203235%20c-120%20-160%20-230%20-207%20-550%20-239%20-285%20-29%20-936%20-56%20-1350%20-56%20-148%200%20-299%20-5%20-335%20-11%20-193%20-31%20-313%20-165%20-313%20-349%20-1%20-160%2085%20-292%20224%20-347%2040%20-16%20106%20-18%20717%20-21%20l672%20-3%200%20-99%200%20-100%20-57%200%20c-89%200%20-179%2018%20-265%2052%20-66%2026%20-82%2029%20-103%2020%20-25%20-11%20-25%20-14%20-25%20-130%200%20-105%202%20-121%2019%20-136%2019%20-17%2022%20-17%2079%203%2033%2011%2088%2025%20123%2031%2042%206%20483%2010%201249%2010%20l1185%200%2050%2024%20c98%2046%20148%20126%20148%20233%20-1%20117%20-85%20217%20-203%20242%20-35%208%20-403%2011%20-1170%2011%20l-1120%200%200%20191%200%20191%20138%20-6%20c184%20-9%20423%20-33%20520%20-51%20175%20-33%20251%20-74%20364%20-195%20116%20-124%20140%20-110%20159%2092%2015%20169%207%20572%20-14%20647%20-16%2056%20-28%2071%20-64%2071%20-16%200%20-38%20-21%20-78%20-75z%20m106%20-127%20c16%20-164%201%20-630%20-20%20-627%20-3%200%20-29%2028%20-56%2062%20-147%20179%20-333%20226%20-1000%20257%20-282%2013%20-1239%2025%20-1286%2016%20-59%20-11%20-122%20-60%20-154%20-118%20-23%20-43%20-29%20-66%20-29%20-118%200%20-36%206%20-82%2013%20-104%2018%20-51%2076%20-115%20126%20-137%2038%20-18%20118%20-19%201778%20-19%201281%200%201750%20-3%201784%20-12%2087%20-21%20153%20-110%20153%20-203%20-1%20-81%20-74%20-166%20-160%20-184%20-35%20-8%20-396%20-11%20-1175%20-11%20l-1125%200%200%2025%200%2025%201138%200%201138%200%2044%2023%20c104%2053%20109%20209%208%20264%20-31%2017%20-123%2018%20-1803%2023%20-1956%206%20-1799%200%20-1876%2068%20-82%2072%20-121%20230%20-85%20340%2023%2069%2091%20143%20158%20173%2050%2022%2069%2023%20363%2030%201247%2031%201616%2059%201789%20138%2068%2031%20157%20107%20212%20183%2047%2063%2051%2057%2065%20-94z%20m-2343%20-638%20l-3%20-100%20-43%2021%20c-61%2030%20-95%2085%20-100%20160%20-7%20101%2036%20177%20118%20207%20l25%209%203%20-98%20c1%20-55%201%20-144%200%20-199z%20m72%20100%20c0%20-127%20-4%20-200%20-10%20-200%20-6%200%20-10%2073%20-10%20200%200%20127%204%20200%2010%20200%206%200%2010%20-73%2010%20-200z%20m230%200%20l0%20-200%20-92%200%20-93%200%200%20200%200%20200%2093%200%2092%200%200%20-200z%20m57%20-107%20c-1%20-59%20-3%20-13%20-3%20102%200%20116%202%20164%203%20108%202%20-56%202%20-151%200%20-210z%20m716%20290%20c4%20-2%207%20-89%207%20-194%20l0%20-189%20-335%200%20-335%200%200%20201%200%20201%20328%20-7%20c180%20-4%20330%20-9%20335%20-12z%20m87%20-188%20c0%20-188%20-1%20-195%20-20%20-195%20-19%200%20-20%207%20-20%20195%200%20188%201%20195%2020%20195%2019%200%2020%20-7%2020%20-195z%20m220%20-450%20c0%20-87%20-3%20-105%20-15%20-105%20-12%200%20-15%2018%20-15%2098%200%2054%203%20102%207%20105%2018%2019%2023%20-2%2023%20-98z%20m300%200%20c0%20-98%20-1%20-105%20-20%20-105%20-19%200%20-20%207%20-20%2098%200%20100%203%20112%2027%20112%2010%200%2013%20-24%2013%20-105z%20m-90%20-5%20l0%20-101%20-77%203%20-78%203%20-3%2098%20-3%2097%2081%200%2080%200%200%20-100z%20m1921%2071%20c48%20-49%2035%20-126%20-26%20-156%20-29%20-13%20-137%20-15%20-894%20-15%20l-861%200%200%20100%200%20100%20876%200%20876%200%2029%20-29z%20m-2563%20-171%20c23%20-11%2074%20-28%20112%20-36%2061%20-14%2070%20-19%2070%20-38%200%20-20%20-8%20-24%20-75%20-34%20-42%20-7%20-89%20-19%20-105%20-27%20-16%20-8%20-34%20-15%20-40%20-15%20-6%200%20-10%2032%20-10%2085%200%2047%201%2085%203%2085%202%200%2022%20-9%2045%20-20z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M3665%204495%20c-29%20-28%20-30%20-45%20-9%20-145%2031%20-144%20-5%20-310%20-103%20-481%20-99%20-172%20-220%20-314%20-579%20-679%20-143%20-146%20-313%20-319%20-377%20-384%20-113%20-117%20-117%20-119%20-142%20-106%20-21%2011%20-27%2011%20-43%20-3%20-26%20-24%20-34%20-22%20-70%2016%20-29%2030%20-32%2037%20-22%2061%2012%2033%200%2062%20-30%2071%20-22%207%20-57%20-15%20-132%20-84%20-44%20-39%20-46%20-51%20-16%20-91%2025%20-34%2043%20-37%2076%20-14%2022%2015%2025%2015%2044%20-2%2034%20-32%2042%20-54%2024%20-73%20-25%20-27%20-19%20-67%2015%20-105%2044%20-51%2026%20-65%20-22%20-16%20-45%2046%20-56%2048%20-93%2019%20l-26%20-21%20-30%2029%20c-30%2028%20-39%2057%20-20%2068%2028%2017%20-20%2095%20-59%2095%20-21%200%20-141%20-120%20-141%20-141%200%20-40%2077%20-88%2095%20-59%2010%2016%2018%2012%2047%20-24%20l28%20-35%20-20%20-34%20-21%20-35%2036%20-47%20c45%20-58%2037%20-71%20-13%20-22%20-42%2041%20-61%2045%20-98%2021%20-24%20-16%20-26%20-16%20-55%2012%20-28%2027%20-30%2037%20-15%2075%209%2020%20-39%2079%20-63%2079%20-18%200%20-151%20-128%20-151%20-146%200%20-11%2058%20-74%2069%20-74%204%200%2017%207%2030%2016%2022%2016%2024%2015%2054%20-15%2027%20-27%2030%20-34%2019%20-49%20-22%20-31%20-25%20-44%20-15%20-71%2010%20-25%201%20-35%20-207%20-241%20-218%20-215%20-271%20-282%20-286%20-359%20-5%20-23%20-49%20-71%20-183%20-199%20-261%20-250%20-292%20-276%20-369%20-307%20-197%20-81%20-223%20-100%20-208%20-159%208%20-33%20151%20-203%20190%20-227%2069%20-42%20104%20-23%20160%2089%2068%20134%20119%20199%20273%20347%20l143%20136%2024%20-54%20c44%20-100%20132%20-177%20253%20-223%2061%20-23%2079%20-25%20168%20-22%20169%207%20221%2040%20508%20317%20103%2099%20190%20181%20194%20181%203%200%2034%20-27%2069%20-60%2056%20-54%2066%20-60%20105%20-60%2038%200%2048%206%2096%2053%2045%2046%2053%2059%2053%2092%200%2035%20-9%2047%20-115%20155%20-109%20110%20-131%20140%20-103%20140%207%200%2067%20-54%20133%20-120%2076%20-75%20129%20-120%20142%20-120%2029%200%20114%2060%20141%20100%2037%2055%2031%2070%20-78%20187%20-55%2060%20-100%20114%20-100%20121%200%2029%2031%206%20123%20-93%2054%20-58%20109%20-108%20122%20-111%2032%20-8%2088%2021%20130%2067%2028%2031%2035%2047%2035%2080%200%2037%20-7%2048%20-67%20111%20l-68%2069%2080%2077%20c573%20550%20611%20590%20646%20682%2076%20200%2021%20400%20-143%20517%20-26%2019%20-48%2039%20-48%2044%200%2017%20149%20119%20252%20173%20140%2074%20235%2099%20368%20100%2058%200%20131%20-6%20162%20-13%2049%20-10%2061%20-10%2087%204%2070%2036%2030%20124%20-159%20350%20-112%20134%20-323%20349%20-445%20454%20-172%20148%20-204%20163%20-250%20116z%20m131%20-92%20c95%20-78%20349%20-328%20449%20-443%2092%20-106%20245%20-307%20245%20-322%200%20-7%20-20%20-7%20-57%20-2%20-32%205%20-112%209%20-178%208%20-104%200%20-132%20-4%20-205%20-28%20-142%20-47%20-314%20-144%20-441%20-248%20-45%20-37%20-46%20-37%20-115%20-31%20-82%207%20-172%20-13%20-241%20-54%20-43%20-25%20-256%20-221%20-575%20-530%20-121%20-117%20-148%20-137%20-148%20-112%200%207%20148%20161%20328%20343%20480%20484%20573%20586%20696%20763%20147%20212%20207%20444%20163%20633%20-13%2055%20-12%2080%202%2080%204%200%2038%20-26%2077%20-57z%20m-178%20-1168%20c81%20-44%20147%20-122%20172%20-202%2044%20-142%2017%20-250%20-98%20-390%20-19%20-24%20-38%20-43%20-42%20-43%20-5%200%20-14%2016%20-20%2035%20-11%2033%20-10%2038%2021%2072%2017%2021%2043%2061%2057%2091%2034%2074%2029%20187%20-11%20255%20-53%2090%20-148%20147%20-246%20147%20-98%200%20-128%20-24%20-578%20-455%20-566%20-543%20-699%20-670%20-1220%20-1177%20l-450%20-437%20-34%2029%20c-34%2028%20-34%2029%20-14%2048%2011%2010%20189%20178%20395%20372%20206%20194%20476%20453%20600%20574%20124%20122%20340%20330%20480%20462%20140%20133%20334%20317%20430%20409%20244%20232%20269%20247%20415%20242%2077%20-2%2098%20-7%20143%20-32z%20m-97%20-110%20c55%20-20%2085%20-47%20115%20-107%2032%20-64%2032%20-144%200%20-213%20-35%20-76%20-48%20-83%20-99%20-54%20-31%2018%20-57%2024%20-102%2024%20-80%200%20-97%20-13%20-370%20-279%20l-220%20-215%20-90%2090%20-90%2090%2055%2052%20c30%2029%20178%20169%20328%20312%20334%20318%20365%20338%20473%20300z%20m-1251%20-359%20c0%20-14%20-61%20-59%20-69%20-50%20-6%205%2050%2064%2061%2064%204%200%208%20-6%208%20-14z%20m1227%20-65%20c63%20-29%2091%20-103%2064%20-174%20-8%20-21%20-143%20-157%20-403%20-407%20-87%20-83%20-88%20-83%20-109%20-64%20l-21%2019%20241%20235%20c226%20220%20242%20237%20241%20270%200%2075%20-57%20103%20-116%2058%20-16%20-13%20-128%20-118%20-249%20-235%20-219%20-213%20-219%20-213%20-239%20-193%20-20%2020%20-20%2020%2019%2061%2022%2023%20131%20128%20242%20235%20188%20180%20226%20209%20278%20213%206%200%2029%20-8%2052%20-18z%20m-1027%20-96%20l24%20-25%20-44%20-45%20c-24%20-25%20-49%20-45%20-55%20-45%20-6%200%20-22%2012%20-36%2026%20l-24%2025%2050%2044%20c28%2024%2053%2044%2056%2045%203%200%2016%20-11%2029%20-25z%20m980%20-18%20c0%20-11%20-99%20-112%20-367%20-372%20-66%20-64%20-96%20-86%20-103%20-79%20-8%208%2056%2076%20222%20238%20128%20124%20236%20226%20240%20226%205%200%208%20-6%208%20-13z%20m-1428%20-50%20c-43%20-42%20-51%20-28%20-11%2018%2020%2022%2035%2032%2037%2025%203%20-7%20-9%20-26%20-26%20-43z%20m233%20-143%20c17%20-26%2017%20-27%20-26%20-70%20-24%20-24%20-48%20-44%20-54%20-44%20-6%200%20-22%2011%20-35%2025%20l-23%2024%2049%2045%20c27%2025%2054%2045%2060%2046%207%200%2019%20-12%2029%20-26z%20m652%20-275%20c153%20-160%20279%20-297%20281%20-305%204%20-18%20-60%20-84%20-81%20-84%20-8%200%20-32%2019%20-53%2043%20-21%2023%20-144%20154%20-273%20290%20-130%20136%20-238%20252%20-240%20258%20-3%2011%2067%2089%2080%2089%205%200%20133%20-131%20286%20-291z%20m-1107%20206%20c-18%20-19%20-36%20-32%20-39%20-30%20-2%203%2011%2021%2029%2040%2018%2019%2036%2032%2039%2030%202%20-3%20-11%20-21%20-29%20-40z%20m854%20-229%20c91%20-96%20166%20-179%20166%20-185%200%20-31%20-42%204%20-194%20164%20-147%20153%20-178%20195%20-147%20195%205%200%2083%20-78%20175%20-174z%20m-604%2070%20c0%20-14%20-81%20-96%20-95%20-96%20-6%200%20-22%2012%20-36%2026%20l-24%2026%2055%2049%2055%2048%2022%20-21%20c13%20-12%2023%20-26%2023%20-32z%20m511%20-118%20c79%20-84%20204%20-215%20277%20-290%20108%20-110%20133%20-140%20127%20-157%20-7%20-23%20-60%20-71%20-79%20-71%20-8%200%20-74%2064%20-147%20142%20-74%2078%20-198%20209%20-277%20292%20l-143%20150%2043%2043%20c23%2024%2045%2043%2049%2043%203%200%2071%20-69%20150%20-152z%20m-107%20-176%20c69%20-73%20126%20-137%20126%20-142%200%20-6%20-8%20-10%20-18%20-10%20-20%200%20-312%20301%20-312%20323%200%2028%2015%2027%2046%20-5%2017%20-18%2088%20-93%20158%20-166z%20m-624%2062%20c-123%20-125%20-373%20-354%20-380%20-347%20-8%208%20433%20433%20450%20433%208%200%20-24%20-39%20-70%20-86z%20m455%20-36%20c49%20-51%20176%20-182%20282%20-290%20106%20-108%20193%20-201%20193%20-206%200%20-16%20-78%20-84%20-92%20-80%20-8%201%20-139%20134%20-291%20293%20l-275%20290%2041%2043%20c23%2023%2044%2042%2047%2042%204%200%2046%20-42%2095%20-92z%20m-159%20-120%20c114%20-118%20117%20-92%20-27%20-232%20-69%20-66%20-133%20-137%20-142%20-158%20-21%20-45%20-22%20-133%20-2%20-172%2015%20-28%2014%20-31%20-12%20-59%20-46%20-48%20-101%20-71%20-168%20-71%20-133%200%20-235%20104%20-235%20241%200%2041%203%2044%20247%20282%20135%20133%20251%20241%20257%20241%206%200%2043%20-33%2082%20-72z%20m170%20-179%20c19%20-21%2019%20-21%20-91%20-127%20-120%20-115%20-145%20-145%20-145%20-180%200%20-26%2041%20-72%2065%20-72%209%200%2078%2058%20154%20130%20131%20123%20139%20129%20155%20111%2022%20-24%2021%20-30%20-11%20-59%20-16%20-14%20-76%20-72%20-134%20-129%20-106%20-102%20-107%20-103%20-155%20-103%20-58%201%20-88%2015%20-115%2056%20-28%2042%20-25%20103%207%20150%2024%2036%20232%20242%20245%20244%203%200%2014%20-10%2025%20-21z%20m-46%20-190%20c-63%20-59%20-117%20-105%20-120%20-102%20-3%203%2046%2054%20109%20114%2063%2060%20117%20106%20120%20103%203%20-4%20-46%20-55%20-109%20-115z%20m-766%20-150%20c23%20-144%20157%20-246%20311%20-237%2078%205%20117%2022%20175%2075%20l40%2035%2051%20-13%2052%20-13%20-49%20-44%20c-27%20-24%20-83%20-60%20-123%20-80%20-70%20-35%20-81%20-37%20-165%20-37%20-176%201%20-291%2080%20-360%20247%20-16%2037%20-16%2038%2015%2073%2017%2019%2035%2035%2039%2035%204%200%2010%20-18%2014%20-41z%20m-359%20-149%20l29%20-30%20-69%20-70%20-70%20-70%20-34%2035%20-35%2035%2069%2064%20c39%2036%2073%2065%2076%2066%203%200%2018%20-14%2034%20-30z%20m-191%20-184%20c30%20-36%2030%20-37%2012%20-64%20-9%20-15%20-38%20-69%20-62%20-119%20-25%20-51%20-50%20-93%20-57%20-93%20-13%200%20-116%20109%20-153%20162%20-15%2021%20-24%2044%20-21%2052%203%207%2041%2026%2084%2040%2043%2015%2094%2035%20113%2046%2019%2011%2039%2018%2044%2016%206%20-1%2023%20-19%2040%20-40z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4280%204525%20c-16%20-9%20-41%20-12%20-71%20-8%20-54%206%20-95%20-13%20-130%20-60%20-17%20-24%20-20%20-39%20-17%20-83%204%20-51%203%20-55%20-33%20-90%20l-37%20-36%20-36%2028%20c-26%2021%20-34%2034%20-30%2049%208%2032%20-36%2088%20-82%20104%20-48%2017%20-84%204%20-118%20-42%20-19%20-26%20-19%20-30%20-6%20-69%2011%20-32%2025%20-48%2055%20-65%2022%20-13%2048%20-23%2058%20-23%2026%200%2067%20-30%2067%20-49%200%20-9%20-20%20-33%20-44%20-53%20l-43%20-37%20-27%2028%20c-17%2017%20-26%2038%20-26%2058%200%2069%20-96%20130%20-158%20101%20-15%20-7%20-35%20-30%20-45%20-50%20-16%20-32%20-17%20-43%20-7%20-73%2014%20-42%2058%20-75%20110%20-82%2022%20-3%2048%20-15%2060%20-28%20l22%20-23%20-23%20-31%20c-19%20-26%20-441%20-433%20-590%20-569%20l-47%20-42%20-53%2036%20c-227%20153%20-450%20181%20-656%2083%20-93%20-44%20-211%20-163%20-283%20-284%20-64%20-109%20-92%20-141%20-147%20-165%20-38%20-16%20-63%20-44%20-63%20-68%200%20-5%2015%20-29%2034%20-52%2046%20-58%2052%20-98%2027%20-155%20-40%20-92%20-207%20-234%20-316%20-272%20-30%20-10%20-66%20-14%20-101%20-11%20-49%204%20-60%209%20-103%2052%20-58%2057%20-85%2058%20-116%207%20-50%20-83%20-97%20-122%20-220%20-183%20-146%20-71%20-233%20-135%20-301%20-219%20-261%20-324%20-189%20-784%20181%20-1155%20264%20-266%20569%20-424%20815%20-424%20297%200%20529%20181%20670%20522%2039%2096%2057%20118%20131%20169%2041%2027%2059%2046%2059%2061%200%2012%20-22%2044%20-49%2073%20-67%2070%20-80%20117%20-57%20205%2042%20165%20210%20349%20319%20350%2020%200%2040%20-12%2068%20-40%2061%20-61%2095%20-51%20135%2038%2033%2074%2061%20103%20164%20165%20155%2093%20266%20233%20305%20383%2045%20174%20-4%20393%20-132%20581%20l-35%2051%20223%20254%20c123%20139%20272%20303%20331%20363%20l108%20110%2024%20-30%20c14%20-16%2025%20-37%2026%20-46%200%20-34%2033%20-110%2053%20-124%2037%20-26%2094%20-19%20128%2014%2062%2063%2015%20159%20-91%20184%20-14%204%20-39%2020%20-55%2037%20l-29%2030%2044%2045%2044%2045%2027%20-26%20c15%20-14%2030%20-41%2033%20-59%209%20-44%2041%20-84%2083%20-101%2028%20-12%2038%20-12%2067%200%2038%2016%2066%2050%2066%2081%200%2056%20-70%20125%20-128%20125%20-12%200%20-36%2010%20-52%2022%20-28%2020%20-29%2023%20-14%2039%2011%2012%2038%2020%2084%2025%2081%208%20121%2029%20143%2077%2015%2031%2015%2039%202%2077%20-13%2037%20-13%2045%200%2070%2032%2061%2011%20121%20-59%20170%20-49%2033%20-95%2038%20-136%2015z%20m73%20-56%20c66%20-34%2083%20-79%2048%20-128%20-17%20-23%20-18%20-29%20-5%20-51%2014%20-27%2019%20-86%207%20-93%20-5%20-2%20-40%20-7%20-79%20-11%20l-72%20-7%20-61%2057%20-62%2057%203%2065%20c3%2057%206%2067%2030%2085%2026%2019%2028%2019%2053%203%2025%20-17%2028%20-16%2053%201%2024%2016%2050%2030%2060%2032%202%201%2013%20-4%2025%20-10z%20m-515%20-105%20c24%20-17%2030%20-59%208%20-67%20-19%20-8%20-60%2015%20-64%2036%20-4%2017%2014%2047%2027%2047%204%200%2017%20-7%2029%20-16z%20m112%20-265%20c-139%20-133%20-160%20-150%20-160%20-130%200%2013%20292%20282%20299%20275%203%20-3%20-59%20-68%20-139%20-145z%20m-274%2098%20c35%20-30%2027%20-57%20-16%20-57%20-23%200%20-33%206%20-42%2024%20-13%2029%20-5%2056%2016%2056%208%200%2027%20-11%2042%20-23z%20m468%20-5%20c6%20-10%20-277%20-292%20-293%20-292%20-29%200%20-1%2036%20131%20162%2079%2076%20146%20138%20150%20138%204%200%209%20-4%2012%20-8z%20m50%20-49%20c4%20-4%20-57%20-71%20-136%20-150%20-117%20-117%20-144%20-140%20-156%20-130%20-12%2010%2010%2035%20129%20149%2079%2076%20147%20138%20150%20138%203%200%209%20-3%2013%20-7z%20m161%20-199%20c22%20-23%2015%20-58%20-12%20-62%20-25%20-4%20-59%2039%20-49%2063%207%2020%2040%2019%2061%20-1z%20m-647%20-85%20c-24%20-23%20-324%20-321%20-668%20-663%20-344%20-342%20-646%20-641%20-671%20-664%20-44%20-40%20-47%20-41%20-63%20-23%20-16%2017%20-2%2032%20281%20302%20895%20855%201143%201089%201156%201089%205%200%20-11%20-19%20-35%20-41z%20m62%20-6%20c-12%20-15%20-162%20-174%20-334%20-353%20-172%20-179%20-473%20-495%20-670%20-702%20-197%20-208%20-361%20-378%20-365%20-378%20-4%200%20-17%2010%20-29%2023%20l-22%2023%20518%20515%20c684%20681%20905%20899%20915%20899%205%200%20-1%20-12%20-13%20-27z%20m-227%20-326%20c-153%20-167%20-440%20-480%20-638%20-696%20-198%20-216%20-376%20-411%20-395%20-434%20-33%20-37%20-37%20-39%20-58%20-26%20-12%208%20-22%2017%20-22%2022%200%2010%20969%201033%201274%201345%20210%20214%20117%2092%20-161%20-211z%20m317%20274%20c0%20-5%20-7%20-15%20-16%20-22%20-9%20-7%20-75%20-81%20-148%20-164%20-235%20-269%20-1082%20-1220%20-1152%20-1295%20-23%20-23%20-25%20-23%20-41%20-7%20-16%2016%20-15%2019%2013%2049%2017%2018%2079%2087%20140%20153%2060%2066%20161%20176%20225%20245%2063%2069%20211%20231%20329%20360%20352%20388%20634%20690%20642%20690%204%200%208%20-4%208%20-9z%20m349%20-54%20c17%20-44%20-15%20-63%20-51%20-30%20-21%2018%20-24%2059%20-5%2066%2018%207%2047%20-12%2056%20-36z%20m-1416%20-288%20c75%20-25%20232%20-110%20232%20-126%200%20-9%20-166%20-170%20-687%20-669%20-79%20-75%20-128%20-129%20-128%20-141%200%20-11%209%20-28%2020%20-38%2011%20-10%2020%20-21%2020%20-25%200%20-3%20-75%20-82%20-167%20-174%20l-168%20-167%20-20%2026%20-21%2025%20-26%20-27%20-27%20-28%2025%20-29%2025%20-28%20-63%20-67%20c-35%20-36%20-90%20-96%20-122%20-133%20l-58%20-67%20-27%2020%20c-15%2011%20-34%2017%20-42%2014%20-27%20-11%20-90%20-104%20-150%20-222%20-52%20-103%20-165%20-271%20-174%20-261%20-2%202%201%2028%207%2058%2021%20116%20-31%20250%20-136%20348%20-77%2071%20-165%20116%20-284%20145%20-50%2012%20-92%2025%20-92%2030%200%2025%2076%20152%20120%20200%2069%2076%20129%20118%20257%20182%20137%2067%20185%20103%20218%20160%2015%2025%2029%2045%2032%2045%203%200%2022%20-15%2043%20-34%2065%20-58%20168%20-66%20275%20-21%20117%2048%20297%20211%20330%20298%2024%2063%2016%20134%20-20%20188%20-21%2033%20-24%2043%20-13%2050%207%205%2018%209%2023%209%2026%200%2085%2066%20140%20155%2066%20108%20154%20210%20224%20257%2024%2017%2076%2042%20115%2055%2091%2030%20216%2027%20319%20-8z%20m578%20-474%20c152%20-250%20139%20-506%20-33%20-691%20-33%20-35%20-104%20-93%20-159%20-130%20-106%20-70%20-162%20-127%20-179%20-180%20l-11%20-33%20-36%2024%20c-93%2064%20-195%2041%20-303%20-66%20-194%20-194%20-245%20-424%20-122%20-547%2034%20-33%2035%20-36%2017%20-46%20-11%20-6%20-41%20-31%20-67%20-56%20-38%20-35%20-58%20-66%20-89%20-140%20-60%20-138%20-112%20-223%20-190%20-305%20-115%20-120%20-245%20-175%20-419%20-175%20-126%200%20-209%2021%20-335%2085%20-152%2077%20-150%2075%20-130%20116%2022%2042%2016%20116%20-13%20157%20-12%2016%20-22%2037%20-22%2045%200%2023%2096%20131%20182%20206%2042%2037%20127%2095%20190%20131%20122%2069%20192%20119%20209%20152%209%2017%206%2025%20-17%2049%20l-28%2029%20129%20130%20129%20130%2026%20-25%20c32%20-31%2054%20-32%2075%20-2%2015%2021%2014%2023%20-15%2050%20-27%2024%20-29%2030%20-18%2046%2028%2039%20293%20331%20301%20331%205%200%2022%20-11%2039%20-25%2016%20-14%2034%20-25%2038%20-25%2017%200%2084%2065%20209%20206%20487%20545%20577%20643%20585%20641%205%20-2%2031%20-39%2057%20-82z%20m-1074%20-571%20c3%20-9%20-298%20-343%20-317%20-352%20-4%20-1%20-14%206%20-24%2017%20-17%2019%20-13%2024%20145%20186%20150%20153%20186%20180%20196%20149z%20m53%20-49%20c13%20-16%2024%20-3%20-189%20-238%20-63%20-70%20-118%20-127%20-121%20-127%20-4%200%20-15%209%20-25%2020%20-17%2018%20-13%2024%20141%20189%2088%2094%20164%20171%20170%20171%206%200%2017%20-7%2024%20-15z%20m60%20-50%20c10%20-11%208%20-19%20-7%20-38%20-42%20-53%20-296%20-327%20-303%20-327%20-4%200%20-13%207%20-20%2015%20-15%2018%20-27%202%20164%20212%2076%2084%20142%20153%20146%20153%204%200%2013%20-7%2020%20-15z%20m-522%20-354%20c-182%20-200%20-209%20-226%20-218%20-211%20-5%208%20-10%2020%20-10%2026%200%205%2052%2068%20116%20138%20112%20122%20117%20127%20135%20110%2018%20-16%2018%20-18%20-23%20-63z%20m83%203%20c17%20-16%2012%20-24%20-108%20-150%20-99%20-105%20-129%20-131%20-140%20-123%20-7%206%20-13%2017%20-13%2024%200%2012%20227%20265%20238%20265%203%200%2013%20-7%2023%20-16z%20m-41%20-199%20c-69%20-69%20-130%20-125%20-136%20-125%20-6%200%20-16%206%20-22%2013%20-8%209%2020%2045%20115%20145%20l126%20133%2021%20-20%2021%20-21%20-125%20-125z%20m-1058%2045%20c137%20-42%20262%20-156%20294%20-267%2023%20-80%2014%20-156%20-30%20-249%20-65%20-138%20-60%20-169%2053%20-280%2057%20-57%2071%20-77%2071%20-101%200%20-43%20-23%20-60%20-57%20-42%20-47%2025%20-252%20229%20-319%20318%20-78%20103%20-147%20240%20-170%20336%20-18%2077%20-23%20218%20-11%20279%20l8%2039%2047%20-6%20c26%20-3%2077%20-15%20114%20-27z%20m803%20-170%20l102%20-100%20-21%20-19%20c-12%20-10%20-64%20-43%20-116%20-72%20-52%20-29%20-119%20-70%20-149%20-92%20-73%20-54%20-192%20-168%20-238%20-229%20l-38%20-49%20-27%2031%20c-16%2016%20-28%2036%20-28%2044%200%207%2039%2055%2087%20107%20119%20129%20162%20190%20223%20316%2052%20107%2085%20163%2098%20163%203%200%2051%20-45%20107%20-100z'/%3e%3cpath%20d='M1905%202459%20c-53%20-28%20-85%20-53%20-180%20-139%20-135%20-123%20-211%20-162%20-250%20-130%20-20%2017%20-19%2030%203%2030%2026%200%2042%2020%2042%2052%200%2022%20-6%2031%20-27%2039%20-55%2021%20-104%20-51%20-82%20-118%2015%20-48%2053%20-73%20107%20-73%2066%200%20119%2030%20227%20128%20161%20146%20207%20182%20235%20182%2022%20-1%2023%20-2%208%20-11%20-35%20-20%20-14%20-89%2026%20-89%2058%200%2074%2073%2027%20121%20-36%2036%20-79%2038%20-136%208z'/%3e%3cpath%20d='M2365%202078%20c-38%20-22%20-46%20-55%20-19%20-82%2022%20-22%2050%20-20%2073%206%2018%2018%2021%2019%2027%205%2010%20-26%20-21%20-76%20-126%20-206%20-119%20-146%20-145%20-189%20-160%20-258%20-22%20-103%2017%20-163%20108%20-163%2060%200%20104%2058%2075%2099%20-11%2016%20-23%2021%20-46%2019%20-26%20-2%20-34%20-9%20-42%20-36%20-19%20-66%20-54%20-4%20-36%2064%2013%2049%2052%20109%20127%20194%2068%2078%20129%20169%20145%20217%208%2027%209%2045%200%2073%20-17%2056%20-84%2093%20-126%2068z'/%3e%3cpath%20d='M4422%203364%20c-26%20-18%20-182%20-229%20-592%20-799%20-178%20-247%20-380%20-529%20-450%20-625%20-70%20-96%20-297%20-413%20-505%20-705%20-208%20-291%20-393%20-550%20-411%20-574%20-19%20-24%20-34%20-48%20-34%20-52%200%20-10%2029%20-39%2040%20-39%205%200%2030%2027%2055%2060%2025%2033%2050%2060%2055%2060%205%200%2029%20-14%2054%20-31%2070%20-50%2075%20-46%20228%20168%20165%20231%20758%201074%20818%201163%2062%2092%20432%20603%20693%20958%2059%2081%20111%20158%20114%20172%204%2014%20-2%2054%20-11%2090%20-10%2036%20-18%2070%20-17%2075%201%206%204%2026%207%2046%207%2042%20-11%2056%20-44%2033z%20m-2%20-216%20c0%20-17%20-21%20-55%20-63%20-110%20-101%20-135%20-388%20-530%20-584%20-803%20-103%20-145%20-287%20-406%20-591%20-840%20-294%20-420%20-333%20-475%20-340%20-475%20-3%200%20-18%2012%20-34%2026%20-23%2023%20-25%2030%20-16%2048%2020%2037%20357%20514%20552%20781%20104%20143%20269%20370%20365%20505%20277%20389%20632%20882%20660%20918%20l26%2032%2012%20-27%20c7%20-16%2012%20-40%2013%20-55z%20m-1645%20-2263%20c23%20-19%2028%20-28%2020%20-39%20-5%20-8%20-28%20-42%20-50%20-75%20-44%20-67%20-60%20-73%20-100%20-38%20l-26%2022%2032%2045%20c67%2093%2080%20110%2087%20110%204%20-1%2021%20-12%2037%20-25z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4315%204533%20c-22%20-9%20-62%20-15%20-90%20-14%20-92%203%20-153%20-60%20-141%20-144%205%20-39%202%20-46%20-34%20-86%20l-40%20-43%20-30%2029%20c-17%2016%20-28%2035%20-25%2043%2017%2044%20-61%20122%20-123%20122%20-44%200%20-92%20-43%20-92%20-82%200%20-38%2064%20-105%20108%20-114%2017%20-3%2043%20-19%2058%20-35%20l28%20-29%20-39%20-40%20c-22%20-22%20-43%20-40%20-48%20-40%20-18%200%20-56%2057%20-57%2084%200%2019%20-12%2040%20-39%2067%20-32%2032%20-46%2039%20-78%2039%20-51%200%20-90%20-30%20-99%20-74%20-11%20-62%2048%20-136%20110%20-136%2023%200%2041%20-9%2062%20-31%20l29%20-31%20-41%20-36%20c-22%20-21%20-167%20-156%20-320%20-302%20-154%20-146%20-292%20-276%20-306%20-289%20l-27%20-23%20-60%2036%20c-86%2053%20-198%20102%20-259%20115%20-77%2016%20-219%2014%20-283%20-5%20-144%20-42%20-290%20-165%20-384%20-324%20-48%20-81%20-79%20-112%20-167%20-165%20-48%20-30%20-50%20-69%20-4%20-124%2065%20-78%2046%20-143%20-78%20-266%20-88%20-87%20-171%20-138%20-254%20-155%20-72%20-16%20-119%20-1%20-170%2055%20-60%2066%20-89%2061%20-132%20-24%20-33%20-66%20-67%20-92%20-191%20-150%20-198%20-91%20-317%20-198%20-393%20-352%20-74%20-150%20-91%20-271%20-61%20-444%2039%20-224%20150%20-411%20367%20-621%20131%20-126%20236%20-203%20371%20-275%20295%20-155%20613%20-127%20831%2072%2083%2076%20146%20171%20214%20323%2029%2066%2059%20127%2065%20135%207%208%2037%2030%2067%2049%2086%2055%2088%2064%2026%20130%20-59%2064%20-69%2087%20-69%20152%202%20131%20128%20326%20252%20390%2061%2031%20104%2027%20150%20-15%2021%20-19%2047%20-35%2058%20-35%2025%200%2055%2032%2087%2097%2026%2053%2064%2088%20171%20158%2091%2060%20197%20170%20234%20242%20101%20202%2075%20454%20-70%20672%20l-49%2075%2033%2035%20c18%2020%20119%20131%20222%20246%20104%20116%20243%20267%20308%20337%20l119%20127%2029%20-21%20c22%20-17%2029%20-30%2029%20-55%200%20-87%2082%20-149%20156%20-118%2065%2027%2075%20106%2021%20160%20-19%2019%20-47%2037%20-63%2041%20-31%208%20-104%2050%20-104%2060%200%209%2071%2088%2083%2093%2018%207%2067%20-52%2067%20-82%200%20-42%2066%20-107%20109%20-107%2090%200%20132%2079%2080%20151%20-21%2030%20-75%2059%20-109%2059%20-22%200%20-80%2035%20-80%2048%201%2016%2078%2042%20107%2036%2020%20-4%2043%201%2071%2015%2069%2035%2088%2081%2057%20141%20-14%2028%20-14%2033%206%2071%2026%2052%2020%2093%20-21%20137%20-26%2029%20-85%2063%20-107%2062%20-4%20-1%20-26%20-8%20-48%20-17z%20m96%20-82%20c34%20-35%2036%20-58%208%20-105%20-19%20-32%20-19%20-37%20-5%20-65%2036%20-69%2013%20-92%20-89%20-89%20-66%202%20-69%203%20-119%2052%20-47%2045%20-51%2053%20-53%20100%20-4%2068%203%2093%2028%20107%2015%208%2028%208%2049%20-1%2023%20-10%2034%20-8%2066%209%2053%2028%2080%2026%20115%20-8z%20m-539%20-88%20c22%20-20%2023%20-36%203%20-53%20-31%20-26%20-90%2024%20-64%2056%2015%2019%2038%2018%2061%20-3z%20m201%20-156%20c-222%20-232%20-242%20-252%20-253%20-241%20-8%208%2028%2049%20136%20153%2081%2077%20150%20139%20152%20136%203%20-3%20-12%20-24%20-35%20-48z%20m-363%203%20c24%20-24%2025%20-34%204%20-54%20-21%20-21%20-36%20-20%20-62%204%20-25%2023%20-28%2040%20-10%2058%2018%2018%2045%2015%2068%20-8z%20m305%20-134%20c-127%20-130%20-163%20-162%20-153%20-137%208%2021%20265%20281%20278%20281%208%200%20-49%20-65%20-125%20-144z%20m163%20115%20c-8%20-20%20-278%20-294%20-284%20-288%20-4%204%2055%2071%20132%20151%20126%20130%20162%20163%20152%20137z%20m35%20-37%20c7%20-7%20-261%20-294%20-274%20-294%20-25%200%203%2038%20122%20163%2072%2075%20134%20137%20138%20137%204%200%2011%20-3%2014%20-6z%20m171%20-203%20c40%20-44%20-12%20-83%20-54%20-41%20-16%2016%20-18%2024%20-10%2040%2014%2025%2042%2026%2064%201z%20m-894%20-323%20c-168%20-166%20-498%20-494%20-733%20-727%20-355%20-353%20-431%20-423%20-444%20-415%20-9%206%20-18%2015%20-20%2021%20-2%205%2076%2086%20174%20179%2098%2093%20273%20259%20388%20369%20116%20110%20316%20300%20445%20422%20129%20121%20289%20273%20355%20337%2066%2063%20125%20115%20130%20115%206%201%20-127%20-135%20-295%20-301z%20m280%20205%20c-30%20-32%20-214%20-222%20-410%20-423%20-195%20-201%20-452%20-467%20-570%20-590%20-118%20-124%20-254%20-267%20-302%20-317%20-88%20-92%20-89%20-93%20-113%20-77%20-14%209%20-25%2020%20-25%2024%200%207%201011%201009%201335%201322%20134%20130%20179%20162%2085%2061z%20m60%20-10%20c-18%20-21%20-90%20-99%20-160%20-173%20-206%20-219%20-492%20-531%20-859%20-933%20l-344%20-378%20-23%2022%20-24%2022%2042%2046%20c162%20179%201378%201431%201390%201431%205%200%20-5%20-17%20-22%20-37z%20m70%201%20c0%20-3%20-69%20-80%20-153%20-172%20-286%20-312%20-558%20-619%20-897%20-1008%20-19%20-22%20-100%20-113%20-179%20-203%20-137%20-155%20-144%20-161%20-162%20-145%20-15%2014%20-16%2020%20-6%2034%207%2010%20179%20199%20382%20421%20204%20222%20394%20430%20424%20463%20130%20146%20575%20616%20583%20616%204%200%208%20-3%208%20-6z%20m336%20-60%20c8%20-29%20-2%20-44%20-28%20-44%20-24%200%20-58%2027%20-58%2046%200%207%207%2019%2015%2028%2021%2020%2063%202%2071%20-30z%20m-1441%20-326%20c76%20-25%20229%20-108%20226%20-123%20-1%20-6%20-181%20-181%20-399%20-389%20-218%20-208%20-401%20-389%20-406%20-402%20-8%20-19%20-5%20-29%2013%20-48%20l22%20-24%20-163%20-171%20-163%20-170%20-20%2019%20c-49%2046%20-103%20-4%20-57%20-53%20l20%20-22%20-123%20-130%20c-119%20-126%20-124%20-129%20-142%20-112%20-11%209%20-24%2017%20-30%2017%20-23%200%20-82%20-81%20-146%20-201%20-63%20-116%20-175%20-280%20-196%20-287%20-6%20-2%20-5%2012%201%2035%2013%2046%206%20143%20-15%20202%20-51%20144%20-196%20256%20-395%20304%20-48%2011%20-89%2022%20-90%2023%20-2%201%2015%2039%2038%2084%2048%2090%20129%20181%20213%20234%2028%2018%2099%2057%20157%2086%20131%2065%20165%2090%20191%20143%2012%2023%2023%2043%2024%2045%202%202%2024%20-13%2049%20-32%2092%20-70%20180%20-72%20313%20-6%2093%2046%20227%20163%20270%20237%2053%2091%2050%20171%20-8%20238%20l-31%2035%2027%2010%20c67%2026%20113%2070%20174%20169%20104%20170%20233%20276%20371%20308%2073%2017%20188%209%20275%20-19z%20m557%20-451%20c88%20-131%20131%20-306%20109%20-439%20-25%20-154%20-99%20-254%20-285%20-387%20-114%20-81%20-160%20-128%20-186%20-191%20l-13%20-30%20-35%2027%20c-81%2061%20-198%2035%20-304%20-69%20-185%20-181%20-240%20-423%20-122%20-540%20l36%20-37%20-40%20-25%20c-55%20-35%20-83%20-74%20-137%20-195%20-68%20-150%20-111%20-217%20-190%20-297%20-83%20-83%20-159%20-128%20-263%20-155%20-158%20-40%20-315%20-19%20-489%2067%20-136%2067%20-141%2072%20-118%20120%2022%2046%2014%20104%20-21%20157%20-23%2036%20-24%2040%20-10%2062%2075%20115%20222%20243%20392%20340%20123%2071%20171%20108%20186%20141%2010%2020%208%2028%20-12%2049%20l-23%2024%20118%20126%20c65%2069%20120%20125%20123%20125%202%200%2017%20-11%2034%20-25%2023%20-20%2033%20-23%2049%20-15%2025%2014%2024%2048%20-2%2077%20l-22%2022%2077%2085%20c42%2046%20115%20124%20161%20172%20l85%2088%2028%20-27%20c37%20-36%2064%20-34%2097%206%20122%20145%20722%20806%20730%20804%205%20-2%2027%20-29%2047%20-60z%20m-1057%20-588%20c0%20-8%20-71%20-89%20-157%20-180%20-148%20-154%20-159%20-163%20-174%20-147%20-16%2016%20-8%2027%20141%20183%20149%20157%20190%20188%20190%20144z%20m55%20-44%20c15%20-18%20-3%20-41%20-184%20-230%20-123%20-129%20-124%20-130%20-145%20-111%20-21%2019%20-21%2019%20140%20187%2089%2093%20165%20169%20169%20169%204%200%2013%20-7%2020%20-15z%20m60%20-60%20c11%20-13%20-12%20-41%20-147%20-183%20-88%20-92%20-164%20-167%20-168%20-167%20-4%200%20-12%207%20-18%2016%20-9%2014%2017%2046%20144%20182%2085%2091%20159%20166%20165%20166%206%201%2017%20-6%2024%20-14z%20m-506%20-271%20c9%20-3%2016%20-12%2016%20-19%200%20-7%20-53%20-68%20-117%20-135%20-91%20-93%20-122%20-120%20-135%20-115%20-10%204%20-18%2012%20-18%2017%200%207%20230%20258%20237%20258%201%200%208%20-3%2017%20-6z%20m17%20-153%20c-38%20-42%20-94%20-100%20-125%20-130%20-47%20-46%20-57%20-52%20-70%20-41%20-9%207%20-16%2017%20-16%2022%200%205%2055%2066%20122%20134%20115%20117%20122%20123%20140%20108%2017%20-16%2014%20-20%20-51%20-93z%20m119%2015%20c0%20-6%20-54%20-65%20-119%20-130%20-84%20-84%20-124%20-117%20-135%20-113%20-9%204%20-16%2011%20-16%2018%200%206%2055%2067%20122%20135%2095%2097%20124%20121%20135%20113%207%20-6%2013%20-17%2013%20-23z%20m-1163%20-87%20c115%20-38%20217%20-119%20263%20-209%2052%20-102%2047%20-210%20-16%20-329%20-53%20-100%20-42%20-164%2040%20-226%2043%20-32%2096%20-110%2096%20-140%200%20-12%20-6%20-29%20-13%20-39%20-12%20-17%20-20%20-13%20-104%2057%20-204%20172%20-343%20359%20-409%20552%20-24%2071%20-28%2095%20-28%20210%20-1%2072%202%20137%206%20146%205%2014%2014%2015%2055%208%2026%20-5%2076%20-18%20110%20-30z%20m805%20-159%20l103%20-100%20-25%20-19%20c-14%20-11%20-47%20-32%20-75%20-47%20-160%20-86%20-344%20-234%20-432%20-349%20-29%20-37%20-33%20-39%20-59%20-30%20-60%2021%20-43%2061%2083%20199%2088%2095%20144%20178%20213%20317%2055%20109%2067%20129%2080%20129%205%200%2055%20-45%20112%20-100z'/%3e%3cpath%20d='M1885%202435%20c-32%20-20%20-95%20-69%20-141%20-110%20-138%20-126%20-241%20-182%20-265%20-144%20-13%2022%20-11%2027%2018%2041%2034%2016%2041%2043%2017%2069%20-40%2045%20-104%201%20-104%20-72%200%20-29%208%20-47%2029%20-71%2026%20-30%2035%20-33%2083%20-33%2073%201%20136%2039%20272%20165%20112%20104%20149%20130%20188%20130%2017%200%2019%20-3%2010%20-12%20-22%20-22%20-14%20-57%2015%20-64%2038%20-10%2058%207%2061%2053%203%2034%20-1%2044%20-24%2062%20-40%2032%20-90%2027%20-159%20-14z'/%3e%3cpath%20d='M2347%202052%20c-10%20-10%20-17%20-27%20-17%20-38%200%20-43%2050%20-60%2072%20-24%2015%2024%2024%2025%2032%204%2011%20-27%20-29%20-96%20-109%20-189%20-81%20-95%20-143%20-181%20-163%20-228%20-16%20-38%20-15%20-122%202%20-156%2025%20-47%2083%20-63%20135%20-36%2045%2023%2055%2069%2022%2099%20-26%2024%20-52%2017%20-71%20-19%20-8%20-17%20-16%20-32%20-18%20-35%20-7%20-11%20-22%2028%20-22%2059%200%2053%2031%20106%20136%20231%2053%2063%20107%20138%20120%20165%2049%20103%2020%20185%20-64%20185%20-25%200%20-45%20-7%20-55%20-18z'/%3e%3cpath%20d='M4424%203373%20c-25%20-25%20-327%20-432%20-526%20-708%20-338%20-471%20-520%20-723%20-591%20-820%20-40%20-55%20-191%20-266%20-336%20-470%20-146%20-203%20-322%20-449%20-391%20-545%20-165%20-228%20-158%20-216%20-138%20-236%2024%20-24%2048%20-10%2096%2056%20l42%2060%2051%20-40%20c28%20-22%2054%20-40%2058%20-40%2021%200%2059%2044%20137%20158%2048%2070%20138%20197%20199%20282%2061%2085%20273%20385%20470%20665%20366%20520%20531%20749%20805%201118%2085%20114%20163%20222%20173%20239%2021%2039%2022%2099%203%20162%20-11%2035%20-12%2053%20-3%2075%208%2023%208%2033%20-2%2045%20-17%2020%20-25%2020%20-47%20-1z%20m0%20-172%20c8%20-54%20-4%20-81%20-83%20-186%20-37%20-49%20-106%20-142%20-153%20-205%20-46%20-63%20-117%20-159%20-156%20-212%20-109%20-147%20-390%20-543%20-657%20-923%20-229%20-326%20-524%20-745%20-532%20-754%20-5%20-6%20-63%2051%20-63%2061%200%2011%20314%20457%20569%20808%20101%20140%20246%20340%20320%20443%2075%20104%20253%20349%20395%20545%20142%20197%20277%20382%20300%20414%2023%2031%2044%2054%2047%2052%204%20-2%209%20-21%2013%20-43z%20m-1660%20-2310%20c18%20-18%2026%20-36%2023%20-46%20-10%20-25%20-87%20-135%20-95%20-135%20-4%200%20-21%2014%20-39%2030%20l-32%2030%2052%2074%20c29%2041%2055%2075%2058%2075%203%201%2018%20-12%2033%20-28z'/%3e%3c/g%3e%3c/svg%3e\"","{\n \"version\": 1,\n \"source\": \"https://raw.githubusercontent.com/gleitz/midi-js-soundfonts/gh-pages/FluidR3_GM/names.json\",\n \"programNumbering\": \"GM 1-128\",\n \"icons\": {\n \"piano\": \"src/icons/piano.svg\",\n \"guitar\": \"src/icons/guitar.svg\",\n \"bassguitar\": \"src/icons/bassguitar.svg\",\n \"double-bass\": \"src/icons/double-bass.svg\",\n \"drum-kit\": \"src/icons/drum-kit.svg\",\n \"alto-saxophone\": \"src/icons/alto-saxophone.svg\",\n \"tenor-saxophone\": \"src/icons/tenor-saxophone.svg\",\n \"bari-saxophone\": \"src/icons/bari-saxophone.svg\",\n \"flute\": \"src/icons/flute.svg\",\n \"clarinet\": \"src/icons/clarinet.svg\",\n \"trumpet\": \"src/icons/trumpet.svg\",\n \"trombone\": \"src/icons/trombone.svg\",\n \"violin\": \"src/icons/violin.svg\",\n \"viola\": \"src/icons/viola.svg\",\n \"cello\": \"src/icons/cello.svg\",\n \"microphone\": \"src/icons/microphone.svg\"\n },\n \"programs\": [\n {\n \"program\": 1,\n \"soundfont\": \"acoustic_grand_piano\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/acoustic_grand_piano.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 2,\n \"soundfont\": \"bright_acoustic_piano\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/bright_acoustic_piano.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 3,\n \"soundfont\": \"electric_grand_piano\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/electric_grand_piano.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 4,\n \"soundfont\": \"honkytonk_piano\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/honkytonk_piano.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 5,\n \"soundfont\": \"electric_piano_1\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/electric_piano_1.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 6,\n \"soundfont\": \"electric_piano_2\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/electric_piano_2.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 7,\n \"soundfont\": \"harpsichord\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/harpsichord.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 8,\n \"soundfont\": \"clavinet\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/clavinet.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 9,\n \"soundfont\": \"celesta\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/celesta.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 10,\n \"soundfont\": \"glockenspiel\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/glockenspiel.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 11,\n \"soundfont\": \"music_box\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/music_box.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 12,\n \"soundfont\": \"vibraphone\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/vibraphone.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 13,\n \"soundfont\": \"marimba\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/marimba.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 14,\n \"soundfont\": \"xylophone\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/xylophone.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 15,\n \"soundfont\": \"tubular_bells\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/tubular_bells.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 16,\n \"soundfont\": \"dulcimer\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/dulcimer.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 17,\n \"soundfont\": \"drawbar_organ\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/drawbar_organ.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 18,\n \"soundfont\": \"percussive_organ\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/percussive_organ.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 19,\n \"soundfont\": \"rock_organ\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/rock_organ.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 20,\n \"soundfont\": \"church_organ\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/church_organ.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 21,\n \"soundfont\": \"reed_organ\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/reed_organ.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 22,\n \"soundfont\": \"accordion\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/accordion.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 23,\n \"soundfont\": \"harmonica\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/harmonica.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 24,\n \"soundfont\": \"tango_accordion\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/tango_accordion.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 25,\n \"soundfont\": \"acoustic_guitar_nylon\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/acoustic_guitar_nylon.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 26,\n \"soundfont\": \"acoustic_guitar_steel\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/acoustic_guitar_steel.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 27,\n \"soundfont\": \"electric_guitar_jazz\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/electric_guitar_jazz.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 28,\n \"soundfont\": \"electric_guitar_clean\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/electric_guitar_clean.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 29,\n \"soundfont\": \"electric_guitar_muted\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/electric_guitar_muted.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 30,\n \"soundfont\": \"overdriven_guitar\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/overdriven_guitar.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 31,\n \"soundfont\": \"distortion_guitar\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/distortion_guitar.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 32,\n \"soundfont\": \"guitar_harmonics\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/guitar_harmonics.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 33,\n \"soundfont\": \"acoustic_bass\",\n \"icon\": \"double-bass\",\n \"localPack\": \"/soundfonts/fluidr3/acoustic_bass.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 34,\n \"soundfont\": \"electric_bass_finger\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/electric_bass_finger.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 35,\n \"soundfont\": \"electric_bass_pick\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/electric_bass_pick.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 36,\n \"soundfont\": \"fretless_bass\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/fretless_bass.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 37,\n \"soundfont\": \"slap_bass_1\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/slap_bass_1.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 38,\n \"soundfont\": \"slap_bass_2\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/slap_bass_2.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 39,\n \"soundfont\": \"synth_bass_1\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/synth_bass_1.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 40,\n \"soundfont\": \"synth_bass_2\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/synth_bass_2.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 41,\n \"soundfont\": \"violin\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/violin.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 42,\n \"soundfont\": \"viola\",\n \"icon\": \"viola\",\n \"localPack\": \"/soundfonts/fluidr3/viola.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 43,\n \"soundfont\": \"cello\",\n \"icon\": \"cello\",\n \"localPack\": \"/soundfonts/fluidr3/cello.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 44,\n \"soundfont\": \"contrabass\",\n \"icon\": \"double-bass\",\n \"localPack\": \"/soundfonts/fluidr3/contrabass.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 45,\n \"soundfont\": \"tremolo_strings\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/tremolo_strings.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 46,\n \"soundfont\": \"pizzicato_strings\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/pizzicato_strings.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 47,\n \"soundfont\": \"orchestral_harp\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/orchestral_harp.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 48,\n \"soundfont\": \"timpani\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/timpani.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 49,\n \"soundfont\": \"string_ensemble_1\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/string_ensemble_1.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 50,\n \"soundfont\": \"string_ensemble_2\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/string_ensemble_2.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 51,\n \"soundfont\": \"synth_strings_1\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/synth_strings_1.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 52,\n \"soundfont\": \"synth_strings_2\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/synth_strings_2.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 53,\n \"soundfont\": \"choir_aahs\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/choir_aahs.json\",\n \"family\": \"Voice\"\n },\n {\n \"program\": 54,\n \"soundfont\": \"voice_oohs\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/voice_oohs.json\",\n \"family\": \"Voice\"\n },\n {\n \"program\": 55,\n \"soundfont\": \"synth_choir\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/synth_choir.json\",\n \"family\": \"Voice\"\n },\n {\n \"program\": 56,\n \"soundfont\": \"orchestra_hit\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/orchestra_hit.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 57,\n \"soundfont\": \"trumpet\",\n \"icon\": \"trumpet\",\n \"localPack\": \"/soundfonts/fluidr3/trumpet.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 58,\n \"soundfont\": \"trombone\",\n \"icon\": \"trombone\",\n \"localPack\": \"/soundfonts/fluidr3/trombone.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 59,\n \"soundfont\": \"tuba\",\n \"icon\": \"trombone\",\n \"localPack\": \"/soundfonts/fluidr3/tuba.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 60,\n \"soundfont\": \"muted_trumpet\",\n \"icon\": \"trumpet\",\n \"localPack\": \"/soundfonts/fluidr3/muted_trumpet.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 61,\n \"soundfont\": \"french_horn\",\n \"icon\": \"trombone\",\n \"localPack\": \"/soundfonts/fluidr3/french_horn.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 62,\n \"soundfont\": \"brass_section\",\n \"icon\": \"trumpet\",\n \"localPack\": \"/soundfonts/fluidr3/brass_section.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 63,\n \"soundfont\": \"synth_brass_1\",\n \"icon\": \"trumpet\",\n \"localPack\": \"/soundfonts/fluidr3/synth_brass_1.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 64,\n \"soundfont\": \"synth_brass_2\",\n \"icon\": \"trumpet\",\n \"localPack\": \"/soundfonts/fluidr3/synth_brass_2.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 65,\n \"soundfont\": \"soprano_sax\",\n \"icon\": \"alto-saxophone\",\n \"localPack\": \"/soundfonts/fluidr3/soprano_sax.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 66,\n \"soundfont\": \"alto_sax\",\n \"icon\": \"alto-saxophone\",\n \"localPack\": \"/soundfonts/fluidr3/alto_sax.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 67,\n \"soundfont\": \"tenor_sax\",\n \"icon\": \"tenor-saxophone\",\n \"localPack\": \"/soundfonts/fluidr3/tenor_sax.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 68,\n \"soundfont\": \"baritone_sax\",\n \"icon\": \"bari-saxophone\",\n \"localPack\": \"/soundfonts/fluidr3/baritone_sax.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 69,\n \"soundfont\": \"oboe\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/oboe.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 70,\n \"soundfont\": \"english_horn\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/english_horn.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 71,\n \"soundfont\": \"bassoon\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/bassoon.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 72,\n \"soundfont\": \"clarinet\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/clarinet.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 73,\n \"soundfont\": \"piccolo\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/piccolo.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 74,\n \"soundfont\": \"flute\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/flute.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 75,\n \"soundfont\": \"recorder\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/recorder.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 76,\n \"soundfont\": \"pan_flute\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/pan_flute.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 77,\n \"soundfont\": \"blown_bottle\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/blown_bottle.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 78,\n \"soundfont\": \"shakuhachi\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/shakuhachi.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 79,\n \"soundfont\": \"whistle\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/whistle.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 80,\n \"soundfont\": \"ocarina\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/ocarina.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 81,\n \"soundfont\": \"lead_1_square\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_1_square.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 82,\n \"soundfont\": \"lead_2_sawtooth\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_2_sawtooth.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 83,\n \"soundfont\": \"lead_3_calliope\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_3_calliope.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 84,\n \"soundfont\": \"lead_4_chiff\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_4_chiff.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 85,\n \"soundfont\": \"lead_5_charang\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_5_charang.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 86,\n \"soundfont\": \"lead_6_voice\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/lead_6_voice.json\",\n \"family\": \"Voice\"\n },\n {\n \"program\": 87,\n \"soundfont\": \"lead_7_fifths\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_7_fifths.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 88,\n \"soundfont\": \"lead_8_bass__lead\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_8_bass__lead.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 89,\n \"soundfont\": \"pad_1_new_age\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_1_new_age.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 90,\n \"soundfont\": \"pad_2_warm\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_2_warm.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 91,\n \"soundfont\": \"pad_3_polysynth\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_3_polysynth.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 92,\n \"soundfont\": \"pad_4_choir\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/pad_4_choir.json\",\n \"family\": \"Voice\"\n },\n {\n \"program\": 93,\n \"soundfont\": \"pad_5_bowed\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_5_bowed.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 94,\n \"soundfont\": \"pad_6_metallic\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_6_metallic.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 95,\n \"soundfont\": \"pad_7_halo\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_7_halo.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 96,\n \"soundfont\": \"pad_8_sweep\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_8_sweep.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 97,\n \"soundfont\": \"fx_1_rain\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_1_rain.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 98,\n \"soundfont\": \"fx_2_soundtrack\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_2_soundtrack.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 99,\n \"soundfont\": \"fx_3_crystal\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_3_crystal.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 100,\n \"soundfont\": \"fx_4_atmosphere\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_4_atmosphere.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 101,\n \"soundfont\": \"fx_5_brightness\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_5_brightness.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 102,\n \"soundfont\": \"fx_6_goblins\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_6_goblins.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 103,\n \"soundfont\": \"fx_7_echoes\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_7_echoes.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 104,\n \"soundfont\": \"fx_8_scifi\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_8_scifi.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 105,\n \"soundfont\": \"sitar\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/sitar.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 106,\n \"soundfont\": \"banjo\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/banjo.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 107,\n \"soundfont\": \"shamisen\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/shamisen.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 108,\n \"soundfont\": \"koto\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/koto.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 109,\n \"soundfont\": \"kalimba\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/kalimba.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 110,\n \"soundfont\": \"bagpipe\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/bagpipe.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 111,\n \"soundfont\": \"fiddle\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/fiddle.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 112,\n \"soundfont\": \"shanai\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/shanai.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 113,\n \"soundfont\": \"tinkle_bell\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/tinkle_bell.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 114,\n \"soundfont\": \"agogo\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/agogo.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 115,\n \"soundfont\": \"steel_drums\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/steel_drums.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 116,\n \"soundfont\": \"woodblock\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/woodblock.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 117,\n \"soundfont\": \"taiko_drum\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/taiko_drum.json\",\n \"family\": \"Drums\"\n },\n {\n \"program\": 118,\n \"soundfont\": \"melodic_tom\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/melodic_tom.json\",\n \"family\": \"Drums\"\n },\n {\n \"program\": 119,\n \"soundfont\": \"synth_drum\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/synth_drum.json\",\n \"family\": \"Drums\"\n },\n {\n \"program\": 120,\n \"soundfont\": \"reverse_cymbal\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/reverse_cymbal.json\",\n \"family\": \"Drums\"\n },\n {\n \"program\": 121,\n \"soundfont\": \"guitar_fret_noise\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/guitar_fret_noise.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 122,\n \"soundfont\": \"breath_noise\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/breath_noise.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 123,\n \"soundfont\": \"seashore\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/seashore.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 124,\n \"soundfont\": \"bird_tweet\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/bird_tweet.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 125,\n \"soundfont\": \"telephone_ring\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/telephone_ring.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 126,\n \"soundfont\": \"helicopter\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/helicopter.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 127,\n \"soundfont\": \"applause\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/applause.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 128,\n \"soundfont\": \"gunshot\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/gunshot.json\",\n \"family\": \"FX / Other\"\n }\n ],\n \"voices\": [\n {\n \"id\": \"piano\",\n \"label\": \"Piano\",\n \"icon\": \"piano\",\n \"program\": 1,\n \"localPack\": \"/soundfonts/fluidr3/acoustic_grand_piano.json\"\n },\n {\n \"id\": \"guitar\",\n \"label\": \"Guitar\",\n \"icon\": \"guitar\",\n \"program\": 25,\n \"localPack\": \"/soundfonts/fluidr3/acoustic_guitar_nylon.json\"\n },\n {\n \"id\": \"bassguitar\",\n \"label\": \"Bass Guitar\",\n \"icon\": \"bassguitar\",\n \"program\": 34,\n \"localPack\": \"/soundfonts/fluidr3/electric_bass_finger.json\"\n },\n {\n \"id\": \"double-bass\",\n \"label\": \"Double Bass\",\n \"icon\": \"double-bass\",\n \"program\": 33,\n \"localPack\": \"/soundfonts/fluidr3/acoustic_bass.json\"\n },\n {\n \"id\": \"drum-kit\",\n \"label\": \"Drum Kit\",\n \"icon\": \"drum-kit\",\n \"program\": null,\n \"localPack\": \"/soundfonts/TimGM6mb.sf2\"\n },\n {\n \"id\": \"alto-saxophone\",\n \"label\": \"Alto Saxophone\",\n \"icon\": \"alto-saxophone\",\n \"program\": 66,\n \"localPack\": \"/soundfonts/fluidr3/alto_sax.json\"\n },\n {\n \"id\": \"tenor-saxophone\",\n \"label\": \"Tenor Saxophone\",\n \"icon\": \"tenor-saxophone\",\n \"program\": 67,\n \"localPack\": \"/soundfonts/fluidr3/tenor_sax.json\"\n },\n {\n \"id\": \"bari-saxophone\",\n \"label\": \"Baritone Saxophone\",\n \"icon\": \"bari-saxophone\",\n \"program\": 68,\n \"localPack\": \"/soundfonts/fluidr3/baritone_sax.json\"\n },\n {\n \"id\": \"flute\",\n \"label\": \"Flute\",\n \"icon\": \"flute\",\n \"program\": 74,\n \"localPack\": \"/soundfonts/fluidr3/flute.json\"\n },\n {\n \"id\": \"clarinet\",\n \"label\": \"Clarinet\",\n \"icon\": \"clarinet\",\n \"program\": 72,\n \"localPack\": \"/soundfonts/fluidr3/clarinet.json\"\n },\n {\n \"id\": \"trumpet\",\n \"label\": \"Trumpet\",\n \"icon\": \"trumpet\",\n \"program\": 57,\n \"localPack\": \"/soundfonts/fluidr3/trumpet.json\"\n },\n {\n \"id\": \"trombone\",\n \"label\": \"Trombone\",\n \"icon\": \"trombone\",\n \"program\": 58,\n \"localPack\": \"/soundfonts/fluidr3/trombone.json\"\n },\n {\n \"id\": \"violin\",\n \"label\": \"Violin\",\n \"icon\": \"violin\",\n \"program\": 41,\n \"localPack\": \"/soundfonts/fluidr3/violin.json\"\n },\n {\n \"id\": \"viola\",\n \"label\": \"Viola\",\n \"icon\": \"viola\",\n \"program\": 42,\n \"localPack\": \"/soundfonts/fluidr3/viola.json\"\n },\n {\n \"id\": \"cello\",\n \"label\": \"Cello\",\n \"icon\": \"cello\",\n \"program\": 43,\n \"localPack\": \"/soundfonts/fluidr3/cello.json\"\n },\n {\n \"id\": \"microphone\",\n \"label\": \"Voice\",\n \"icon\": \"microphone\",\n \"program\": 54,\n \"localPack\": \"/soundfonts/fluidr3/voice_oohs.json\"\n }\n ]\n}\n","import manifest from './gm-soundfont-manifest.json';\nimport type { SourceDocument } from './notation/document';\nconst iconUrls = import.meta.glob('../icons/*.svg', { eager: true, query: '?url', import: 'default' }) as Record<string, string>;\n\nexport type Pitch = { step: string; octave: number; alter: number; midi: number; sourceId?: string; unpitched?: boolean; displayStep?: string; displayOctave?: number; accidental?: string; cautionary?: boolean; tieStart?: boolean; tieStop?: boolean };\n/** Key mode from the source (MusicXML <mode>, MEI @mode); absent means major. */\nexport type KeyMode = 'major' | 'minor';\nexport type Transposition = { semitones: number; diatonic?: number };\nexport type ScoreNote = { id: string; sourceId?: string; start: number; duration: number; pitches: Pitch[]; transposition?: Transposition; chordSymbol?: string; lyric?: string; beamStart?: boolean; beamEnd?: boolean; rest?: boolean; dotted?: boolean; dots?: number; writtenType?: string; voice?: string; stem?: string; grace?: boolean; tuplet?: { actual: number; normal: number; number: string; start?: boolean; stop?: boolean }; slurStart?: string[]; slurStop?: string[]; tieStart?: boolean; tieStop?: boolean };\nexport type ScoreDirection = { start: number; symbols?: string[]; text?: string; placement?: 'above' | 'below'; voice?: string; wedge?: { type: string; number: string }; soundDynamics?: number; tempo?: number };\n/** A repeat barline inside a bar, at an exact quarter-note offset from the bar start (\"3\", \"5/2\"). */\nexport type BarlineNavigation = { beat: string; repeatStart?: boolean; repeatEnd?: boolean; repeatTimes?: number };\n/**\n * Format-neutral written navigation of one measure, filled by every importer.\n * Bar-level marks apply at the bar start (repeatStart, segno, coda) or the bar\n * end (repeatEnd, toCoda, daCapo, dalSegno, fine); `barlines` holds repeats\n * that fall inside the bar. JSON-serializable.\n */\nexport type MeasureNavigation = {\n repeatStart?: boolean; repeatEnd?: boolean;\n /** Total plays of a repeatEnd; omitted means 2, or the last ending number when the repeat ends inside an ending. */\n repeatTimes?: number;\n /** Volta numbers of the ending bracket this measure belongs to. */\n endings?: number[];\n segno?: boolean; coda?: boolean; toCoda?: boolean; daCapo?: boolean; dalSegno?: boolean; fine?: boolean;\n barlines?: BarlineNavigation[];\n};\nexport type Measure = { index: number; beats: number; notes: ScoreNote[]; dynamics?: { start: number; symbol: string }[]; directions?: ScoreDirection[]; nominalBeats?: number; number?: string; implicit?: boolean; key?: number; keyMode?: KeyMode; clef?: string; beatsPerBar?: number; beatType?: number; transposition?: Transposition; navigation?: MeasureNavigation };\nexport type Part = { id: string; name: string; clef: string; key?: number; keyMode?: KeyMode; instrument: InstrumentId; gmProgram?: number; gmSoundfont?: string; pitchBasis?: 'written' | 'concert'; transposition?: Transposition; measures: Measure[] };\nexport type Score = { title: string; subtitle?: string; composer?: string; credits?: string[]; source: string; tempo: number; beats: number; beatType: number; key: number; keyMode?: KeyMode; parts: Part[];\n /** Set on a transposed or flipped view of a score (transpose.ts `scoreForView`). */\n pitchView?: import('./transpose').PitchView; document?: SourceDocument };\nexport type InstrumentId = 'piano' | 'guitar' | 'bassguitar' | 'double-bass' | 'drum-kit' | 'alto-saxophone' | 'tenor-saxophone' | 'bari-saxophone' | 'flute' | 'clarinet' | 'trumpet' | 'trombone' | 'violin' | 'viola' | 'cello' | 'microphone';\nexport const GM_FAMILIES = ['Keyboard', 'Guitar', 'Voice', 'Percussion', 'Drums', 'Woodwinds', 'Brass', 'Strings', 'FX / Other'] as const;\nexport type GmFamily = typeof GM_FAMILIES[number];\nexport type GmSound = { program: number | null; label: string; soundfont: string | null; iconId: InstrumentId; icon: string; family: GmFamily };\nconst iconFor = (id: InstrumentId) => iconUrls[`../icons/${manifest.icons[id].split('/').at(-1)}`];\nexport const GM_SOUNDS: GmSound[] = [\n { program: null, label: 'Drum Kit', soundfont: null, iconId: 'drum-kit', icon: iconFor('drum-kit'), family: 'Drums' },\n ...manifest.programs.map(entry => ({ program: entry.program, label: gmSoundfontLabel(entry.soundfont), soundfont: entry.soundfont, iconId: entry.icon as InstrumentId, icon: iconFor(entry.icon as InstrumentId), family: entry.family as GmFamily })),\n];\n\nexport const INSTRUMENTS: { id: InstrumentId; label: string; program: number; icon: string; soundfont: string | null; localPack: string }[] = manifest.voices.map(voice => ({\n id: voice.id as InstrumentId,\n label: voice.label,\n program: voice.program === null ? 0 : voice.program - 1,\n icon: iconFor(voice.icon as InstrumentId),\n soundfont: voice.program === null ? null : manifest.programs[voice.program - 1].soundfont,\n localPack: voice.localPack,\n}));\nexport function instrumentForProgram(program: number): InstrumentId {\n return (manifest.programs[program]?.icon || 'piano') as InstrumentId;\n}\nexport function gmProgramForVirtualName(library: string, name: string) {\n if (library.toLowerCase().replace(/[^a-z]/g, '') !== 'generalmidi') return undefined;\n const normalized = name.toLowerCase().replace(/[^a-z0-9]/g, '');\n return manifest.programs.find(entry => entry.soundfont.replace(/[^a-z0-9]/g, '') === normalized);\n}\nexport function gmProgramForNumber(program: number) {\n return Number.isInteger(program) && program >= 1 && program <= 128 ? manifest.programs[program - 1] : undefined;\n}\n/** GM program (1-128) of a FluidR3 sound name. */\nexport function gmProgramForSoundfont(name: string): number | undefined {\n return manifest.programs.find(entry => entry.soundfont === name)?.program;\n}\nexport function isGmSoundfont(name: string) {\n return manifest.programs.some(entry => entry.soundfont === name);\n}\nexport function gmSoundfontLabel(name: string) {\n return name.split('_').filter(Boolean).map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');\n}\nexport const instrumentDetails = (id: InstrumentId) => INSTRUMENTS.find(item => item.id === id)!;\nexport const ucfirst = (name: string) => name ? name.charAt(0).toLocaleUpperCase() + name.slice(1) : name;\n\nconst semitones: Record<string, number> = { C: 0, D: 2, E: 4, F: 5, G: 7, A: 9, B: 11 };\nexport function pitch(step: string, octave: number, alter = 0): Pitch {\n const s = step.toUpperCase();\n return { step: s, octave, alter, midi: (octave + 1) * 12 + semitones[s] + alter };\n}\nexport function midiPitch(midi: number): Pitch {\n const names = ['C', 'C', 'D', 'D', 'E', 'F', 'F', 'G', 'G', 'A', 'A', 'B'];\n const altered = [0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0];\n const pc = ((midi % 12) + 12) % 12;\n return pitch(names[pc], Math.floor(midi / 12) - 1, altered[pc]);\n}\nexport function noteName(p: Pitch): string { return `${p.step}${p.alter === 1 ? '♯' : p.alter === -1 ? '♭' : ''}${p.octave}`; }\nexport function instrumentForName(name: string): InstrumentId {\n const n = name.toLowerCase();\n if (/drum|percussion/.test(n)) return 'drum-kit';\n if (/bass guitar|bassguitar|electric bass/.test(n)) return 'bassguitar';\n if (/double bass|contrabass|acoustic bass|upright bass|\\bbass\\b/.test(n)) return 'double-bass';\n if (/guitar/.test(n)) return 'guitar';\n if (/baritone sax|bari sax/.test(n)) return 'bari-saxophone';\n if (/tenor sax/.test(n)) return 'tenor-saxophone';\n if (/sax/.test(n)) return 'alto-saxophone';\n if (/flute/.test(n)) return 'flute';\n if (/clarinet/.test(n)) return 'clarinet';\n if (/trumpet/.test(n)) return 'trumpet';\n if (/trombone/.test(n)) return 'trombone';\n if (/violin/.test(n)) return 'violin';\n if (/viola/.test(n)) return 'viola';\n if (/cello/.test(n)) return 'cello';\n if (/voice|vocal|choir|singer/.test(n)) return 'microphone';\n return 'piano';\n}\nexport function exampleScore(): Score {\n const notes = [\n [[60, 64, 67], [62, 65, 69], [64, 67, 72], [65, 69, 72]],\n [[67, 71, 74], [65, 69, 72], [64, 67, 72], [62, 65, 69]],\n [[60, 64, 67], [64, 67, 72], [67, 72, 76], [64, 67, 72]],\n [[62, 65, 69], [65, 69, 74], [67, 71, 74], [60, 64, 67]],\n ];\n return { title: 'A little room to play', composer: 'Sample score', source: 'sample', tempo: 96, beats: 4, beatType: 4, key: 0, parts: [\n { id: 'p1', name: 'Piano', clef: 'treble', instrument: 'piano', measures: Array.from({ length: 24 }, (_, index) => ({ index, beats: 4, notes: notes[index % 4].map((chord, beat) => ({ id: `p1-${index}-${beat}`, start: beat, duration: 1, pitches: chord.map(midiPitch) })) })) },\n ] };\n}\n","/** Exact rational numbers for sub-bar positions (\"0\", \"3\", \"5/2\"). */\nexport type Fraction = { n: number; d: number };\n\nconst gcd = (a: number, b: number): number => { a = Math.abs(a); b = Math.abs(b); while (b) [a, b] = [b, a % b]; return a || 1; };\n\nexport function fraction(n: number, d = 1): Fraction {\n if (!Number.isInteger(n) || !Number.isInteger(d) || d === 0) throw new Error(`Invalid fraction ${n}/${d}`);\n if (d < 0) { n = -n; d = -d; }\n const g = gcd(n, d);\n return { n: n / g, d: d / g };\n}\n\n/** The closest rational with a bounded denominator (continued fractions); exact for tuplet-sized values. */\nexport function fromNumber(value: number, maxDenominator = 30240): Fraction {\n if (!Number.isFinite(value)) throw new Error(`Invalid beat ${value}`);\n const sign = value < 0 ? -1 : 1;\n let x = Math.abs(value);\n let [h0, h1, k0, k1] = [0, 1, 1, 0];\n for (let i = 0; i < 64; i++) {\n const a = Math.floor(x);\n const h2 = a * h1 + h0, k2 = a * k1 + k0;\n if (k2 > maxDenominator) break;\n [h0, h1, k0, k1] = [h1, h2, k1, k2];\n const rest = x - a;\n if (rest < 1e-12 || Math.abs(h1 / k1 - Math.abs(value)) < 1e-12) break;\n x = 1 / rest;\n }\n return fraction(sign * h1, k1 || 1);\n}\n\n/** Parses \"5/2\", \"3\", \"2.5\" or \"-1/4\"; undefined for anything else. */\nexport function parseFraction(text: unknown): Fraction | undefined {\n if (typeof text !== 'string') return undefined;\n const rational = /^\\s*(-?\\d{1,9})(?:\\s*\\/\\s*(\\d{1,9}))?\\s*$/.exec(text);\n if (rational) return rational[2] === undefined ? fraction(Number(rational[1])) : Number(rational[2]) > 0 ? fraction(Number(rational[1]), Number(rational[2])) : undefined;\n const decimal = /^\\s*(-?\\d{1,9})\\.(\\d{1,6})\\s*$/.exec(text);\n if (decimal) { const scale = 10 ** decimal[2].length; return fraction(Number(decimal[1]) * scale + Math.sign(Number(decimal[1] + '1')) * Number(decimal[2]), scale); }\n return undefined;\n}\n\nexport const addFraction = (a: Fraction, b: Fraction) => fraction(a.n * b.d + b.n * a.d, a.d * b.d);\nexport const subFraction = (a: Fraction, b: Fraction) => fraction(a.n * b.d - b.n * a.d, a.d * b.d);\nexport const compareFraction = (a: Fraction, b: Fraction) => Math.sign(a.n * b.d - b.n * a.d);\nexport const fractionValue = (a: Fraction) => a.n / a.d;\nexport const formatFraction = (a: Fraction) => a.d === 1 ? String(a.n) : `${a.n}/${a.d}`;\nexport const ZERO: Fraction = { n: 0, d: 1 };\n","/**\n * A small, strict, streaming (SAX-style) XML 1.0 tokenizer with no DOM dependency, so MusicXML can be read in a\n * worker (workers have no DOMParser). It reports start tags (with source offsets, so callers can splice the original\n * text), end tags and character data, and rejects what a browser's DOMParser rejects for the documents we read:\n * mismatched or unclosed tags, malformed or duplicate attributes, undefined entities, bad character references,\n * misplaced declarations, `--` in comments, `]]>` in text, illegal control characters and content outside the root.\n *\n * Not supported (rejected as invalid, like most non-validating browser parsers would mis-handle anyway): parameter\n * entities and entity values containing markup. Internal-subset general entities with plain text values are expanded.\n *\n * Character data follows the XML spec: line ends are normalized to LF, attribute values have literal tab/LF\n * normalized to a space (CDATA attribute type, since no external DTD is loaded) and references are decoded.\n */\n\nexport class XmlError extends Error {\n constructor(readonly detail: string, readonly offset: number) { super('This file is not valid XML.'); }\n}\n\nexport type XmlAttribute = {\n /** Qualified name, as written. */\n name: string;\n /** Normalized, decoded value. */\n value: string;\n /** Offset of the attribute name and one past its closing quote, for splicing. */\n start: number; end: number;\n};\n\nexport type XmlHandler = {\n /**\n * A start tag. `start` is the offset of `<`, `end` one past `>`. `attributes` is reused by the tokenizer only if\n * the handler does not keep it; the tokenizer always passes a fresh array.\n */\n startElement(name: string, attributes: XmlAttribute[], start: number, end: number, selfClosing: boolean): void;\n /** An end tag (also sent right after a self-closing start tag, with the same offsets). */\n endElement(name: string, start: number, end: number): void;\n /** Character data inside the root element (text and CDATA), decoded. Optional: skipped when absent. */\n text?(value: string): void;\n /** The general entities the DOCTYPE's internal subset declares (name → replacement text), once it is read. */\n doctype?(entities: Readonly<Record<string, string>>): void;\n};\n\nconst PREDEFINED: Record<string, string> = { lt: '<', gt: '>', amp: '&', apos: \"'\", quot: '\"' };\n/** Characters XML 1.0 forbids anywhere in a document (C0 controls other than tab/LF/CR, and U+FFFE/U+FFFF). */\nconst ILLEGAL_CHARS = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]/;\n\nconst isWhite = (c: number) => c === 0x20 || c === 0x0A || c === 0x09 || c === 0x0D;\nconst isNameStart = (c: number) => (c >= 0x61 && c <= 0x7A) || (c >= 0x41 && c <= 0x5A) || c === 0x5F || c === 0x3A || (c >= 0xC0 && c !== 0xD7 && c !== 0xF7);\nconst isNameChar = (c: number) => isNameStart(c) || (c >= 0x30 && c <= 0x39) || c === 0x2D || c === 0x2E || c === 0xB7;\n\n/** Local name of a qualified name (`mx:note` → `note`). */\nexport const localNameOf = (name: string) => { const colon = name.indexOf(':'); return colon < 0 ? name : name.slice(colon + 1); };\n\nfunction validCodePoint(code: number): boolean {\n return code === 0x9 || code === 0xA || code === 0xD || (code >= 0x20 && code <= 0xD7FF) || (code >= 0xE000 && code <= 0xFFFD) || (code >= 0x10000 && code <= 0x10FFFF);\n}\n\n/**\n * Tokenize `text`, calling `handler` for each start tag, end tag and run of character data. Throws XmlError when\n * the document is not well-formed. Returns the qualified name of the root element.\n */\nexport function scanXml(text: string, handler: XmlHandler): string {\n if (ILLEGAL_CHARS.test(text)) throw new XmlError('illegal character', text.search(ILLEGAL_CHARS));\n const n = text.length;\n let i = text.charCodeAt(0) === 0xFEFF ? 1 : 0;\n const bodyStart = i;\n const entities: Record<string, string> = Object.create(null);\n const stack: string[] = [];\n let root: string | undefined;\n let rootClosed = false;\n let sawDoctype = false;\n const fail = (detail: string, at = i): never => { throw new XmlError(detail, at); };\n\n /** Decode references in `raw` (offset `at` for errors). */\n const decode = (raw: string, at: number): string => {\n let out = '';\n let from = 0;\n for (let amp = raw.indexOf('&'); amp >= 0; amp = raw.indexOf('&', from)) {\n const semi = raw.indexOf(';', amp + 1);\n if (semi < 0) fail('unterminated reference', at + amp);\n const ref = raw.slice(amp + 1, semi);\n let value: string | undefined;\n if (ref.charCodeAt(0) === 0x23) {\n const hex = ref.charCodeAt(1) === 0x78;\n const digits = ref.slice(hex ? 2 : 1);\n if (!digits || !(hex ? /^[0-9A-Fa-f]+$/ : /^[0-9]+$/).test(digits)) fail('bad character reference', at + amp);\n const code = parseInt(digits, hex ? 16 : 10);\n if (!validCodePoint(code)) fail('character reference to an illegal character', at + amp);\n value = String.fromCodePoint(code);\n } else {\n if (!ref || !isNameStart(ref.charCodeAt(0)) || ![...ref].every(ch => isNameChar(ch.charCodeAt(0)))) fail('bad entity reference', at + amp);\n value = PREDEFINED[ref] ?? entities[ref];\n if (value === undefined) fail(`undefined entity &${ref};`, at + amp);\n }\n out += raw.slice(from, amp) + value;\n from = semi + 1;\n }\n return from ? out + raw.slice(from) : raw;\n };\n const normalizeLines = (raw: string) => raw.indexOf('\\r') < 0 ? raw : raw.replace(/\\r\\n?/g, '\\n');\n const attributeValue = (raw: string, at: number) => {\n if (raw.indexOf('<') >= 0) fail('\"<\" in an attribute value', at);\n const literal = /[\\t\\n\\r]/.test(raw) ? normalizeLines(raw).replace(/[\\t\\n]/g, ' ') : raw;\n return literal.indexOf('&') < 0 ? literal : decode(literal, at);\n };\n const readName = (): string => {\n const start = i;\n if (i >= n || !isNameStart(text.charCodeAt(i))) fail('expected a name');\n i++;\n while (i < n && isNameChar(text.charCodeAt(i))) i++;\n return text.slice(start, i);\n };\n const skipWhite = () => { while (i < n && isWhite(text.charCodeAt(i))) i++; };\n const expect = (literal: string) => { if (!text.startsWith(literal, i)) fail(`expected \"${literal}\"`); i += literal.length; };\n const quoted = (): string => {\n const quote = text.charCodeAt(i);\n if (quote !== 0x22 && quote !== 0x27) fail('expected a quoted value');\n const close = text.indexOf(quote === 0x22 ? '\"' : \"'\", i + 1);\n if (close < 0) fail('unterminated quoted value');\n const value = text.slice(i + 1, close);\n i = close + 1;\n return value;\n };\n\n const characterData = (start: number, end: number) => {\n const raw = text.slice(start, end);\n if (!stack.length) {\n if (!/^[ \\t\\r\\n]*$/.test(raw)) fail('text outside the root element', start);\n return;\n }\n if (raw.indexOf(']]>') >= 0) fail('\"]]>\" in text', start + raw.indexOf(']]>'));\n const lines = normalizeLines(raw);\n const value = lines.indexOf('&') < 0 ? lines : decode(lines, start);\n handler.text?.(value);\n };\n\n const doctype = () => {\n if (sawDoctype || root) fail('misplaced DOCTYPE');\n sawDoctype = true;\n i += 9;\n if (!isWhite(text.charCodeAt(i))) fail('expected whitespace after DOCTYPE');\n skipWhite(); readName(); skipWhite();\n if (text.startsWith('SYSTEM', i)) { i += 6; skipWhite(); quoted(); skipWhite(); }\n else if (text.startsWith('PUBLIC', i)) { i += 6; skipWhite(); quoted(); skipWhite(); quoted(); skipWhite(); }\n if (text.charCodeAt(i) === 0x5B) {\n i++;\n // Internal subset: markup declarations, comments, PIs and parameter-entity references.\n for (;;) {\n skipWhite();\n if (i >= n) fail('unterminated DOCTYPE');\n if (text.charCodeAt(i) === 0x5D) { i++; break; }\n if (text.startsWith('<!--', i)) { comment(); continue; }\n if (text.startsWith('<?', i)) { processingInstruction(); continue; }\n if (text.charCodeAt(i) === 0x25) fail('parameter entities are not supported');\n if (text.startsWith('<!ENTITY', i)) {\n i += 8;\n if (!isWhite(text.charCodeAt(i))) fail('expected whitespace in ENTITY');\n skipWhite();\n if (text.charCodeAt(i) === 0x25) fail('parameter entities are not supported');\n const name = readName(); skipWhite();\n if (text.charCodeAt(i) === 0x22 || text.charCodeAt(i) === 0x27) {\n const at = i;\n const raw = quoted();\n if (raw.indexOf('<') >= 0) fail('entity values with markup are not supported', at);\n // The first declaration of an entity is binding.\n if (!(name in entities)) entities[name] = decode(normalizeLines(raw), at);\n } else {\n // External entity: not loaded, so references to it are undefined (like a browser parser).\n if (text.startsWith('SYSTEM', i)) { i += 6; skipWhite(); quoted(); }\n else if (text.startsWith('PUBLIC', i)) { i += 6; skipWhite(); quoted(); skipWhite(); quoted(); }\n else fail('bad ENTITY declaration');\n skipWhite();\n if (text.startsWith('NDATA', i)) { i += 5; skipWhite(); readName(); }\n }\n skipWhite(); expect('>');\n continue;\n }\n if (text.startsWith('<!', i)) {\n // ELEMENT / ATTLIST / NOTATION: skip, honouring quoted strings.\n i += 2;\n while (i < n && text.charCodeAt(i) !== 0x3E) { if (text.charCodeAt(i) === 0x22 || text.charCodeAt(i) === 0x27) quoted(); else i++; }\n expect('>');\n continue;\n }\n fail('bad internal subset');\n }\n skipWhite();\n }\n expect('>');\n handler.doctype?.(entities);\n };\n function comment() {\n const close = text.indexOf('--', i + 4);\n if (close < 0) fail('unterminated comment');\n if (text.charCodeAt(close + 2) !== 0x3E) fail('\"--\" in a comment', close);\n i = close + 3;\n }\n function processingInstruction() {\n const start = i;\n i += 2;\n const target = readName();\n if (target.toLowerCase() === 'xml' && (start !== bodyStart || target !== 'xml')) fail('misplaced XML declaration', start);\n const close = text.indexOf('?>', i);\n if (close < 0) fail('unterminated processing instruction');\n if (close > i && !isWhite(text.charCodeAt(i))) fail('bad processing instruction');\n i = close + 2;\n }\n\n while (i < n) {\n const lt = text.indexOf('<', i);\n if (lt < 0) { characterData(i, n); i = n; break; }\n if (lt > i) characterData(i, lt);\n i = lt;\n const next = text.charCodeAt(i + 1);\n if (next === 0x2F) {\n // End tag.\n const start = i;\n i += 2;\n const name = readName();\n skipWhite(); expect('>');\n const open = stack.pop();\n if (open !== name) fail(open ? `</${name}> closes <${open}>` : `unexpected </${name}>`, start);\n if (!stack.length) rootClosed = true;\n handler.endElement(name, start, i);\n } else if (next === 0x21) {\n if (text.startsWith('<!--', i)) comment();\n else if (text.startsWith('<![CDATA[', i)) {\n if (!stack.length) fail('CDATA outside the root element');\n const close = text.indexOf(']]>', i + 9);\n if (close < 0) fail('unterminated CDATA section');\n handler.text?.(normalizeLines(text.slice(i + 9, close)));\n i = close + 3;\n } else if (text.startsWith('<!DOCTYPE', i)) doctype();\n else fail('bad markup declaration');\n } else if (next === 0x3F) processingInstruction();\n else {\n // Start tag.\n const start = i;\n i++;\n if (rootClosed) fail('content after the root element', start);\n const name = readName();\n const attributes: XmlAttribute[] = [];\n let selfClosing = false;\n for (;;) {\n const white = i < n && isWhite(text.charCodeAt(i));\n skipWhite();\n const c = text.charCodeAt(i);\n if (c === 0x3E) { i++; break; }\n if (c === 0x2F) { i++; expect('>'); selfClosing = true; break; }\n if (i >= n) fail('unterminated start tag', start);\n if (!white) fail('expected whitespace between attributes');\n const attributeStart = i;\n const attributeName = readName();\n skipWhite(); expect('='); skipWhite();\n const valueAt = i + 1;\n const raw = quoted();\n for (const other of attributes) if (other.name === attributeName) fail(`duplicate attribute ${attributeName}`, attributeStart);\n attributes.push({ name: attributeName, value: attributeValue(raw, valueAt), start: attributeStart, end: i });\n }\n root ??= name;\n stack.push(name);\n handler.startElement(name, attributes, start, i, selfClosing);\n if (selfClosing) {\n stack.pop();\n if (!stack.length) rootClosed = true;\n handler.endElement(name, start, i);\n }\n }\n }\n if (!root) fail('no root element');\n if (stack.length) fail(`unclosed <${stack.at(-1)}>`, n);\n return root!;\n}\n\n/** A light element tree for a captured subtree; it mirrors the parts of the DOM Element API the importers use. */\nexport class XmlElement {\n readonly localName: string;\n readonly children: XmlElement[] = [];\n /** Child elements and text, in document order (for textContent). */\n private readonly content: (XmlElement | string)[] = [];\n private readonly attributeMap: Map<string, string>;\n constructor(readonly name: string, attributes: readonly XmlAttribute[], readonly parentElement: XmlElement | null = null) {\n this.localName = localNameOf(name);\n this.attributeMap = new Map(attributes.map(attribute => [attribute.name, attribute.value]));\n }\n getAttribute(name: string): string | null { return this.attributeMap.get(name) ?? null; }\n hasAttribute(name: string): boolean { return this.attributeMap.has(name); }\n setAttribute(name: string, value: string): void { this.attributeMap.set(name, value); }\n /** Concatenated character data of the subtree, like Node.textContent. */\n get textContent(): string {\n if (this.content.length === 1 && typeof this.content[0] === 'string') return this.content[0];\n let out = '';\n for (const item of this.content) out += typeof item === 'string' ? item : item.textContent;\n return out;\n }\n append(item: XmlElement | string): void {\n if (typeof item === 'string') {\n const last = this.content.length - 1;\n if (last >= 0 && typeof this.content[last] === 'string') this.content[last] += item;\n else this.content.push(item);\n } else { this.children.push(item); this.content.push(item); }\n }\n /** Descendant elements in document order (like getElementsByTagName('*')). */\n descendants(): XmlElement[] {\n const out: XmlElement[] = [];\n const walk = (element: XmlElement) => { for (const item of element.children) { out.push(item); walk(item); } };\n walk(this);\n return out;\n }\n}\n\n/** Builds light trees for subtrees a caller chooses to capture while a document streams past. */\nexport class XmlTreeBuilder {\n private current: XmlElement | null = null;\n /** Whether a captured subtree is open. */\n get capturing(): boolean { return this.current !== null; }\n /** Open an element: a new capture root when `capture` is set and nothing is captured, or a child of the open one. */\n open(name: string, attributes: readonly XmlAttribute[], capture: boolean): XmlElement | null {\n if (!this.current && !capture) return null;\n const element = new XmlElement(name, attributes, this.current);\n this.current?.append(element);\n this.current = element;\n return element;\n }\n /** Close the open element; returns it when it was a capture root (the subtree is complete). */\n close(): XmlElement | null {\n const element = this.current;\n if (!element) return null;\n this.current = element.parentElement;\n return this.current ? null : element;\n }\n text(value: string): void { this.current?.append(value); }\n}\n\n/** Parse a whole (small) document into a light tree; throws XmlError when it is not well-formed. */\nexport function parseXmlTree(text: string): XmlElement {\n const builder = new XmlTreeBuilder();\n let root: XmlElement | null = null;\n scanXml(text, {\n startElement: (name, attributes) => { builder.open(name, attributes, true); },\n endElement: () => { root = builder.close() || root; },\n text: value => builder.text(value),\n });\n return root!;\n}\n","import type { BarlineNavigation, MeasureNavigation, Score } from '../score';\nimport { formatFraction, fraction, fromNumber } from '../playback/fraction';\nimport { parseXmlTree } from './xml-stream';\n\n/**\n * Source-format readers for written navigation (repeats, endings, segno/coda,\n * D.C./D.S., Fine). Every importer fills Measure.navigation with these, and the\n * playback roadmap is built from that one format-neutral shape.\n */\nexport type NavigationWord = 'daCapo' | 'dalSegno' | 'toCoda' | 'fine' | 'coda' | 'segno';\n\n\n/** Volta numbers: \"1\", \"1, 2\", \"1,3\", \"1-2\", \"1.\" */\nexport function endingNumbers(value: string | null | undefined): number[] {\n const result = (value || '').replace(/[^\\d,\\-\\s]/g, ' ').split(/[\\s,]+/).flatMap(token => {\n const range = /^(\\d+)-(\\d+)$/.exec(token);\n if (range) return Array.from({ length: Math.max(0, Math.min(16, Number(range[2]) - Number(range[1]) + 1)) }, (_, i) => Number(range[1]) + i);\n const number = Number(token); return Number.isInteger(number) && number > 0 ? [number] : [];\n });\n return [...new Set(result)];\n}\n\n/**\n * Navigation meaning of a text direction. Anchored at the start so \"both hands\"\n * or \"Winds\" never trigger D.S. and \"Coda\" inside other words is ignored.\n * ABC decoration names (\"D.C.alfine\", \"D.S.alcoda\") use the same spelling.\n */\nexport function navigationWord(text: string): NavigationWord | undefined {\n const words = text.trim();\n if (/^(?:D\\.\\s*C\\.?|Da\\s+Capo)(?![a-z])/i.test(words)) return 'daCapo';\n if (/^(?:D\\.\\s*S\\.?|Dal\\s+Segno)(?![a-z])/i.test(words)) return 'dalSegno';\n if (/^to\\s*(?:the\\s+)?(?:coda|\\u{1D10C})/iu.test(words)) return 'toCoda';\n if (/^fine\\.?$/i.test(words)) return 'fine';\n if (/^(?:\\u{1D10C}\\s*)?coda\\.?$/iu.test(words) || words === '\\u{1D10C}') return 'coda';\n if (/^(?:\\u{1D10B}\\s*)?segno$/iu.test(words) || words === '\\u{1D10B}') return 'segno';\n return undefined;\n}\n\nexport const isEmptyNavigation = (nav: MeasureNavigation | undefined) => !nav || Object.keys(nav).length === 0;\n\n/** Copies each measure's navigation onto every part, so hiding any part keeps it. */\nexport function attachNavigation(score: Score, navigation: MeasureNavigation[]) {\n for (const part of score.parts) part.measures.forEach((measure, index) => {\n const nav = navigation[index];\n if (isEmptyNavigation(nav)) delete measure.navigation;\n else measure.navigation = JSON.parse(JSON.stringify(nav));\n });\n}\n\n/**\n * Formats that print one coda sign both at the jump (\"To Coda\") and at the\n * coda itself (MEI repeatMark, ABC !coda!): a sign before the first D.C./D.S.\n * is the jump when another sign follows the D.C./D.S.\n */\nexport function resolveCodaSigns(navigation: MeasureNavigation[]) {\n const jump = navigation.findIndex(nav => nav.daCapo || nav.dalSegno);\n if (jump < 0 || !navigation.slice(jump + 1).some(nav => nav.coda)) return;\n navigation.forEach((nav, i) => { if (i < jump && nav.coda) { delete nav.coda; nav.toCoda = true; } });\n}\n\n/** The parts of a DOM Element the MusicXML readers use; the streaming light tree (xml-stream.ts) has the same shape. */\nexport type ElementLike = {\n readonly localName: string;\n readonly children: ArrayLike<ElementLike> & Iterable<ElementLike>;\n getAttribute(name: string): string | null;\n hasAttribute(name: string): boolean;\n readonly textContent: string | null;\n};\nconst likeChildren = (el: ElementLike, name: string) => Array.from(el.children).filter(item => item.localName === name);\nconst likeFirst = (el: ElementLike, name: string) => likeChildren(el, name)[0] as ElementLike | undefined;\n\n/**\n * MusicXML navigation is read from the source, never inferred from SVG.\n * Explicit <sound> attributes are authoritative; when a measure has none,\n * <segno/>/<coda/> glyphs and anchored words (\"D.S. al Coda\", \"To Coda\", \"Fine\")\n * are used. Repeat barlines with location=\"middle\" keep their exact offset.\n *\n * The reader is fed the first part's measures in order (for a timewise score, each measure's first <part>); it\n * carries the open ending and divisions from one measure to the next.\n */\nexport function musicXmlNavigationReader(): (measure: ElementLike, diagnostics: string[]) => MeasureNavigation {\n const SOUND = ['dacapo', 'dalsegno', 'tocoda', 'fine', 'segno', 'coda'];\n let ending: number[] = [];\n let divisions = 1;\n return (measure, diagnostics) => {\n const nav: MeasureNavigation = {};\n // Offsets of middle barlines, in divisions; exact as long as durations are integers.\n let cursor = 0;\n const barlines: BarlineNavigation[] = [];\n for (const item of Array.from(measure.children)) {\n const name = item.localName;\n const duration = Number(likeFirst(item, 'duration')?.textContent) || 0;\n if (name === 'attributes') { const d = Number(likeFirst(item, 'divisions')?.textContent); if (d > 0) divisions = d; }\n else if (name === 'note') { if (likeFirst(item, 'chord')) continue; if (!likeFirst(item, 'grace')) cursor += duration; }\n else if (name === 'backup') cursor = Math.max(0, cursor - duration);\n else if (name === 'forward') cursor += duration;\n else if (name === 'barline' && item.getAttribute('location') === 'middle') {\n const repeat = likeFirst(item, 'repeat');\n if (!repeat) continue;\n const at = Number.isInteger(cursor) ? fraction(cursor, divisions) : fromNumber(cursor / divisions);\n const beat = formatFraction(at);\n const barline: BarlineNavigation = barlines.find(entry => entry.beat === beat) || { beat };\n if (!barlines.includes(barline)) barlines.push(barline);\n if (repeat.getAttribute('direction') === 'forward') barline.repeatStart = true;\n else if (repeat.getAttribute('direction') === 'backward') { barline.repeatEnd = true; const times = Number(repeat.getAttribute('times')); if (times > 0) barline.repeatTimes = Math.max(2, Math.min(16, times)); }\n if (likeFirst(item, 'ending')) diagnostics.push('An ending on a middle barline is not supported; it was ignored.');\n }\n }\n if (barlines.length) nav.barlines = barlines;\n for (const barline of likeChildren(measure, 'barline')) {\n if (barline.getAttribute('location') === 'middle') continue;\n const end = likeFirst(barline, 'ending');\n if (end?.getAttribute('type') === 'start') ending = endingNumbers(end.getAttribute('number'));\n if (end?.getAttribute('type') === 'stop' && barline.getAttribute('location') === 'left') ending = [];\n const repeat = likeFirst(barline, 'repeat');\n if (repeat?.getAttribute('direction') === 'forward') nav.repeatStart = true;\n if (repeat?.getAttribute('direction') === 'backward') {\n nav.repeatEnd = true;\n const times = Number(repeat.getAttribute('times'));\n if (times > 0) nav.repeatTimes = Math.max(2, Math.min(16, times));\n }\n }\n if (ending.length) nav.endings = [...ending];\n const directions = likeChildren(measure, 'direction');\n const sounds = [...likeChildren(measure, 'sound'), ...directions.flatMap(direction => likeChildren(direction, 'sound'))];\n const explicit = sounds.some(sound => SOUND.some(name => sound.hasAttribute(name)));\n for (const sound of sounds) {\n if (sound.getAttribute('dacapo') === 'yes') nav.daCapo = true;\n if (sound.hasAttribute('dalsegno')) nav.dalSegno = true;\n if (sound.hasAttribute('tocoda')) nav.toCoda = true;\n if (sound.hasAttribute('fine') && sound.getAttribute('fine') !== 'no') nav.fine = true;\n if (sound.hasAttribute('segno')) nav.segno = true;\n if (sound.hasAttribute('coda')) nav.coda = true;\n }\n let codaGlyph = false;\n if (!explicit) for (const direction of directions) {\n const types = likeChildren(direction, 'direction-type');\n const words = types.flatMap(type => likeChildren(type, 'words')).map(item => (item.textContent || '').trim()).filter(Boolean).join(' ').trim();\n const segnoGlyph = types.some(type => likeFirst(type, 'segno'));\n const hasCodaGlyph = types.some(type => likeFirst(type, 'coda'));\n const word = navigationWord(words);\n if (word === 'daCapo') nav.daCapo = true;\n else if (word === 'dalSegno') nav.dalSegno = true;\n else if (word === 'toCoda' || (hasCodaGlyph && /^to$/i.test(words))) nav.toCoda = true;\n else if (word === 'fine') nav.fine = true;\n else if (word === 'coda' || (hasCodaGlyph && !words)) codaGlyph = true;\n if (segnoGlyph || word === 'segno') nav.segno = true;\n }\n // A coda glyph printed beside \"To Coda\" marks the jump, not its target.\n if (codaGlyph && !nav.toCoda) nav.coda = true;\n for (const barline of likeChildren(measure, 'barline')) {\n const end = likeFirst(barline, 'ending');\n if (end && ['stop', 'discontinue'].includes(end.getAttribute('type') || '') && barline.getAttribute('location') !== 'left') ending = [];\n }\n return nav;\n };\n}\n\n/** Navigation of a MusicXML document (partwise: the first part's measures; timewise: each measure's first part). */\nexport function musicXmlNavigation(root: ElementLike, measureCount: number, diagnostics: string[]): MeasureNavigation[] {\n const navigation = Array.from({ length: measureCount }, () => ({} as MeasureNavigation));\n const sourceMeasures = root.localName === 'score-timewise'\n ? likeChildren(root, 'measure').map(measure => likeFirst(measure, 'part') || measure)\n : likeChildren(likeFirst(root, 'part') || root, 'measure');\n const read = musicXmlNavigationReader();\n sourceMeasures.slice(0, measureCount).forEach((measure, i) => { navigation[i] = read(measure, diagnostics); });\n return navigation;\n}\n\n/** Parses MusicXML text for navigation (used when a caller supplies XML instead of a Score). Works without a DOM. */\nexport function musicXmlTextNavigation(xml: string, measureCount: number, diagnostics: string[]): MeasureNavigation[] {\n let root: ElementLike;\n try { root = parseXmlTree(xml); }\n catch { diagnostics.push('MusicXML navigation could not be parsed.'); return Array.from({ length: measureCount }, () => ({})); }\n return musicXmlNavigation(root, measureCount, diagnostics);\n}\n\n/**\n * MEI: measure @left/@right repeat barlines, <ending n> containers,\n * <repeatMark func> and anchored <dir> words. `barlines` are mid-measure\n * <barLine form> offsets found while walking the first layer.\n */\nexport function meiNavigation(measures: Element[], barlines: Map<number, BarlineNavigation[]>): MeasureNavigation[] {\n const navigation = measures.map(() => ({} as MeasureNavigation));\n const FUNC: Record<string, NavigationWord> = { segno: 'segno', coda: 'coda', fine: 'fine', dacapo: 'daCapo', dalsegno: 'dalSegno' };\n measures.forEach((measure, i) => {\n const nav = navigation[i];\n const left = measure.getAttribute('left'), right = measure.getAttribute('right');\n if (left === 'rptstart' || left === 'rptboth') nav.repeatStart = true;\n if ((left === 'rptend' || left === 'rptboth') && i > 0) navigation[i - 1].repeatEnd = true;\n if (right === 'rptend' || right === 'rptboth') nav.repeatEnd = true;\n if (right === 'rptboth' && i + 1 < navigation.length) navigation[i + 1].repeatStart = true;\n let ancestor = measure.parentElement;\n while (ancestor && ancestor.localName !== 'ending' && ancestor.localName !== 'score') ancestor = ancestor.parentElement;\n if (ancestor?.localName === 'ending') {\n const numbers = endingNumbers(ancestor.getAttribute('n') || ancestor.getAttribute('label'));\n if (numbers.length) nav.endings = numbers;\n }\n const marks = Array.from(measure.children);\n for (const mark of marks) {\n if (mark.localName === 'repeatMark') {\n const text = (mark.textContent || '').trim();\n const word = FUNC[(mark.getAttribute('func') || '').toLowerCase()] || navigationWord(text);\n if (word === 'coda' && navigationWord(text) === 'toCoda') nav.toCoda = true;\n else if (word) nav[word] = true;\n } else if (mark.localName === 'dir') {\n const word = navigationWord(mark.textContent || '');\n if (word) nav[word] = true;\n }\n }\n const inside = barlines.get(i);\n if (inside?.length) nav.barlines = inside;\n });\n resolveCodaSigns(navigation);\n return navigation;\n}\n\n/** abcjs decoration names that carry navigation. */\nexport function abcDecorationWord(decoration: string): NavigationWord | undefined {\n const name = decoration.trim();\n if (name === 'segno') return 'segno';\n if (name === 'coda') return 'coda';\n if (name === 'fine') return 'fine';\n return /^D\\.[CS]\\./.test(name) ? navigationWord(name) : undefined;\n}\n","import { gmProgramForNumber, gmProgramForVirtualName, instrumentForName, midiPitch, pitch, ucfirst, type MeasureNavigation, type Measure, type Part, type Score, type ScoreNote, type Transposition } from '../score';\nimport { attachNavigation, musicXmlNavigationReader } from './navigation';\nimport { localNameOf, scanXml, XmlElement, XmlError, XmlTreeBuilder, type XmlAttribute } from './xml-stream';\nimport type { NoteMark, PedalChange, PlaybackMarks } from '../playback/source-marks';\n\n/**\n * Single-pass MusicXML reader (docs/specs/large-score-performance.md, Phase 2). One streaming pass over the source\n * text produces everything the reader needs, with no DOM, so it runs in a worker:\n *\n * - the Score model (identical to the former DOM importer's, enforced by validation/parser-diff.mjs),\n * - the engraving text: the source with stable note IDs and multi-measure rests expanded, made by splicing the\n * original text (so it parses to the same document the former DOM edit + XMLSerializer produced),\n * - the source feature inventory, navigation marks, and the playback marks (articulations, fermatas, cue notes,\n * pedals) the timeline reads.\n *\n * Only `<measure>` subtrees (and the small top-level header elements) are held as light trees, one at a time, so\n * memory stays bounded on very large scores. Timewise scores are first converted to partwise text.\n */\n\nexport type SourceDiagnostic = { feature: string; status: 'retained' | 'partial' | 'unsupported'; location: string; message: string };\nexport type FeatureInventory = { featureCounts: Record<string, number>; diagnostics: SourceDiagnostic[] };\nexport type MusicXmlRead = {\n /** The Score model, without its source document. */\n score: Score;\n /** Engraving copy: the source with note IDs and expanded multi-measure rests (the source itself when unchanged). */\n engravingText: string;\n inventory: FeatureInventory;\n /** Navigation that could not be honoured. */\n diagnostics: SourceDiagnostic[];\n playback: PlaybackMarks;\n};\n\nconst FAMILIES: Record<string, string[]> = {\n voices: ['voice', 'layer', 'backup', 'forward'], beams: ['beam'], lyrics: ['lyric', 'verse', 'syl'],\n percussion: ['unpitched', 'midi-unpitched', 'notehead'], tuplets: ['time-modification', 'tuplet'],\n navigation: ['repeat', 'ending', 'segno', 'coda'], expression: ['dynamics', 'wedge', 'pedal', 'sound'],\n ornaments: ['ornaments', 'articulations', 'tremolo'], notation: ['slur', 'tie', 'glissando', 'arpeggiate'],\n specialized: ['technical', 'scordatura', 'bend', 'fingering', 'string', 'fret', 'staff-tuning', 'image'],\n};\n/** Feature inventory from element counts by local name (see sourceFeatureInventory in document.ts). */\nexport function inventoryFromCounts(names: Map<string, number>, rootLocalName: string): FeatureInventory {\n const featureCounts = Object.fromEntries(Object.entries(FAMILIES).map(([family, tags]) => [family, tags.reduce((total, tag) => total + (names.get(tag) || 0), 0)]));\n const diagnostics: SourceDiagnostic[] = [];\n if (rootLocalName === 'score-timewise') diagnostics.push({ feature: 'timewise', status: 'retained', location: '/score-timewise', message: 'Original timewise score retained; a partwise view is used for engraving.' });\n for (const [family, count] of Object.entries(featureCounts)) {\n if (!count) continue;\n diagnostics.push({ feature: family, status: 'retained', location: `/${rootLocalName}`, message: `${count} source element${count === 1 ? '' : 's'} retained in the original document; engraving and performance require separate verification.` });\n }\n return { featureCounts, diagnostics };\n}\n/** Count elements by local name (and find the root) in one pass; throws XmlError when the text is not well-formed. */\nexport function countElements(text: string): { names: Map<string, number>; root: string } {\n const names = new Map<string, number>();\n const root = scanXml(text, { startElement: name => { const local = localNameOf(name); names.set(local, (names.get(local) || 0) + 1); }, endElement: () => {} });\n return { names, root: localNameOf(root) };\n}\n\nconst children = (node: XmlElement, tag: string) => node.children.filter(el => el.localName === tag);\nconst child = (node: XmlElement, tag: string): XmlElement | undefined => { for (const el of node.children) if (el.localName === tag) return el; return undefined; };\nconst value = (node: XmlElement, tag: string) => child(node, tag)?.textContent?.trim() || '';\nconst number = (node: XmlElement, tag: string, fallback = 0) => { const raw = value(node, tag); return raw !== '' && Number.isFinite(Number(raw)) ? Number(raw) : fallback; };\nconst firstDescendant = (node: XmlElement, tag: string): XmlElement | undefined => {\n for (const el of node.children) { if (el.localName === tag) return el; const deep = firstDescendant(el, tag); if (deep) return deep; }\n return undefined;\n};\nconst musicXmlTranspose = (node?: XmlElement): Transposition | undefined => {\n if (!node) return undefined;\n const octaves = number(node, 'octave-change');\n return { semitones: number(node, 'chromatic') + octaves * 12, diatonic: child(node, 'diatonic') ? number(node, 'diatonic') + octaves * 7 : undefined };\n};\nconst empty = (index: number, beats: number): Measure => ({ index, beats, notes: [] });\nexport const durationBeats = (dur: string, dots = 0) => ({ longa: 16, breve: 8, '1': 4, '2': 2, '4': 1, '8': .5, '16': .25, '32': .125, '64': .0625, '128': .03125, whole: 4, half: 2, quarter: 1, eighth: .5, '16th': .25, '32nd': .125 }[dur] || 1) * (dots ? 2 - 1 / (2 ** dots) : 1);\nconst accidental = (alter: number) => alter > 0 ? '♯'.repeat(alter) : '♭'.repeat(-alter);\nfunction musicXmlHarmony(element: XmlElement): string {\n const root = child(element, 'root');\n const step = root && value(root, 'root-step');\n if (!step) return '';\n const kinds: Record<string, string> = { major: '', minor: 'm', dominant: '7', 'major-seventh': 'maj7', 'minor-seventh': 'm7', diminished: 'dim', augmented: 'aug', 'half-diminished': 'm7♭5', 'diminished-seventh': 'dim7', 'suspended-fourth': 'sus4', 'suspended-second': 'sus2', 'major-sixth': '6', 'minor-sixth': 'm6', power: '5' };\n const kind = child(element, 'kind');\n const suffix = kind?.getAttribute('text') ?? kinds[kind?.textContent?.trim() || ''] ?? '';\n const bass = child(element, 'bass');\n const bassStep = bass && value(bass, 'bass-step');\n return `${step}${accidental(number(root!, 'root-alter'))}${suffix}${bassStep ? `/${bassStep}${accidental(number(bass!, 'bass-alter'))}` : ''}`;\n}\n/** Common five-line drum-set staff positions mapped to General MIDI percussion keys. */\nconst drumPositions: Record<string, number> = { D4: 44, E4: 35, F4: 36, G4: 41, A4: 43, B4: 45, C5: 38, D5: 47, E5: 48, F5: 51, G5: 42, A5: 49, B5: 57, C6: 49 };\nconst defaultDrumMidi = (step: string, octave: number) => drumPositions[`${step.toUpperCase()}${octave}`] ?? 38;\nconst clefName = (clefElement: XmlElement) => { const sign = value(clefElement, 'sign'); return sign === 'F' ? 'bass' : sign === 'C' ? number(clefElement, 'line', 3) === 4 ? 'tenor' : 'alto' : sign === 'percussion' ? 'percussion' : 'treble'; };\n\n/** Pad every part to the longest, sort notes by onset and fit measure lengths to their content (shared by importers). */\nexport const normalizedScore = (score: Score): Score => {\n const count = Math.max(...score.parts.map(p => p.measures.length), 0);\n score.parts.forEach(part => {\n part.name = ucfirst(part.name.trim());\n for (let i = part.measures.length; i < count; i++) part.measures.push(empty(i, score.beats * 4 / score.beatType));\n part.measures.forEach(m => { m.notes.sort((a, b) => a.start - b.start); m.beats = Math.max(m.beats, ...m.notes.map(n => n.start + n.duration), 0); });\n });\n if (!count || !score.parts.length) throw new Error('No readable notes or measures were found.');\n return score;\n};\n\n/** The root element's name, read past the XML declaration, comments and DOCTYPE without parsing the document. */\nexport function rootElementName(text: string): string | undefined {\n const prolog = /\\s*(?:<\\?[\\s\\S]*?\\?>|<!--[\\s\\S]*?-->|<!DOCTYPE(?:[^[>]|\\[[\\s\\S]*?\\])*>)/y;\n let index = 0;\n for (prolog.lastIndex = 0; prolog.exec(text); prolog.lastIndex = index) index = prolog.lastIndex;\n const root = /\\s*<([A-Za-z_][\\w.:-]*)/y;\n root.lastIndex = index;\n return root.exec(text)?.[1];\n}\n\nconst escapeAttribute = (text: string) => text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/\\t/g, '	').replace(/\\n/g, ' ').replace(/\\r/g, ' ');\nconst rawAttributes = (text: string, attributes: XmlAttribute[]) => attributes.map(attribute => ` ${text.slice(attribute.start, attribute.end)}`).join('');\nconst escapeMarkup = (text: string) => escapeAttribute(text).replace(/'/g, ''');\n/**\n * Replace references to internal-subset entities with their (escaped) replacement text, outside comments, CDATA\n * sections and PIs: copied markup must not depend on a DOCTYPE the new document does not carry.\n */\nfunction expandEntities(markup: string, entities: Readonly<Record<string, string>>): string {\n if (markup.indexOf('&') < 0) return markup;\n return markup.split(/(<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<!--[\\s\\S]*?-->|<\\?[\\s\\S]*?\\?>)/).map((piece, index) => index % 2 ? piece\n : piece.replace(/&([^\\s&;#]+);/g, (reference, name: string) => Object.prototype.hasOwnProperty.call(entities, name) ? escapeMarkup(entities[name]) : reference)).join('');\n}\n\n/**\n * Timewise → partwise, as text: the root's other children, then one <part> per part ID (part-list order, then any\n * found only in measures), each holding every measure's content for that part. Matches the former DOM conversion\n * (element children only; measures without a number get their position).\n */\nexport function timewiseToPartwise(text: string): { text: string; inventory: FeatureInventory } {\n const names = new Map<string, number>();\n type Measure = { attributes: string; parts: { id: string | null; content: string[] }[] };\n let rootAttributes = '';\n const header: string[] = [];\n const measures: Measure[] = [];\n const listedIds: string[] = [];\n let partListSeen = false, inFirstPartList = false;\n const stack: { local: string; start: number }[] = [];\n let entities: Readonly<Record<string, string>> = {};\n const copy = (markup: string) => expandEntities(markup, entities);\n const root = scanXml(text, {\n doctype: declared => { entities = declared; },\n startElement(name, attributes, start, end, selfClosing) {\n const local = localNameOf(name);\n names.set(local, (names.get(local) || 0) + 1);\n const depth = stack.length;\n if (depth === 0) rootAttributes = copy(rawAttributes(text, attributes));\n else if (depth === 1 && local === 'measure') measures.push({ attributes: copy(rawAttributes(text, attributes)) + (attributes.some(a => a.name === 'number') ? '' : ` number=\"${measures.length + 1}\"`), parts: [] });\n else if (depth === 1 && local === 'part-list' && !partListSeen) { partListSeen = true; inFirstPartList = true; }\n else if (depth === 2 && inFirstPartList && local === 'score-part') { const id = attributes.find(a => a.name === 'id')?.value; if (id) listedIds.push(id); }\n else if (depth === 2 && stack[1].local === 'measure' && local === 'part') measures.at(-1)!.parts.push({ id: attributes.find(a => a.name === 'id')?.value ?? null, content: [] });\n stack.push({ local, start });\n void end; void selfClosing;\n },\n endElement(_name, _start, end) {\n const frame = stack.pop()!;\n const depth = stack.length;\n if (depth === 1 && frame.local !== 'measure') { header.push(copy(text.slice(frame.start, end))); if (frame.local === 'part-list') inFirstPartList = false; }\n else if (depth === 3 && stack[1].local === 'measure' && stack[2].local === 'part') measures.at(-1)!.parts.at(-1)!.content.push(copy(text.slice(frame.start, end)));\n },\n });\n const rootLocal = localNameOf(root);\n if (rootLocal !== 'score-timewise') return { text, inventory: inventoryFromCounts(names, rootLocal) };\n const ids = [...new Set([...listedIds, ...measures.flatMap(measure => measure.parts.map(part => part.id).filter((id): id is string => Boolean(id)))])];\n const out: string[] = [`<score-partwise${rootAttributes}>`, ...header];\n for (const id of ids) {\n out.push(`<part id=\"${escapeAttribute(id)}\">`);\n for (const measure of measures) out.push(`<measure${measure.attributes}>`, ...(measure.parts.find(part => part.id === id)?.content || []), '</measure>');\n out.push('</part>');\n }\n out.push('</score-partwise>');\n return { text: out.join(''), inventory: inventoryFromCounts(names, rootLocal) };\n}\n\ntype PlaybackCollector = { notes: (element: XmlElement) => void; pedals: { begin(id: string): void; measure(element: XmlElement, index: number): void; end(): void }; result(): PlaybackMarks };\n/** Articulation, fermata and cue marks by note ID, and damper-pedal changes by source part (see timeline.ts). */\nfunction playbackCollector(): PlaybackCollector {\n const marks = new Map<string, NoteMark>();\n const markDiagnostics: string[] = [];\n const partPedals: { id: string; changes: PedalChange[]; diagnostics: string[] }[] = [];\n let current: { id: string; changes: PedalChange[]; diagnostics: string[]; divisions: number } | undefined;\n const visitNote = (note: XmlElement) => {\n const id = note.getAttribute('id');\n const notations = child(note, 'notations');\n // Cue notes are engraved for reference only and never sound.\n const silent = Boolean(child(note, 'cue'));\n if (!notations && !silent) return;\n const art = notations && child(notations, 'articulations');\n const names = art ? art.children.map(el => el.localName) : [];\n let durationScale = 1, velocityDelta = 0;\n if (names.includes('staccatissimo')) durationScale = .25;\n else if (names.includes('staccato')) durationScale = .5;\n else if (names.includes('detached-legato')) durationScale = .75;\n else if (names.includes('tenuto')) durationScale = .96;\n if (names.includes('strong-accent')) velocityDelta = 18;\n else if (names.includes('accent')) velocityDelta = 12;\n const fermata = Boolean(notations && child(notations, 'fermata'));\n const meaningful = durationScale !== 1 || velocityDelta || fermata || silent;\n if (id && meaningful) marks.set(id, { durationScale, velocityDelta, fermata, silent });\n else if (!id && meaningful) markDiagnostics.push('Some articulations lack MusicXML note IDs and could not be mapped to sound.');\n if (notations && child(notations, 'ornaments')) markDiagnostics.push('Ornaments are engraved but not synthesized.');\n };\n const walk = (element: XmlElement) => {\n if (element.localName === 'note') visitNote(element);\n for (const item of element.children) walk(item);\n };\n const duration = (el: XmlElement) => Number(child(el, 'duration')?.textContent) || 0;\n return {\n notes: walk,\n pedals: {\n begin(id) { current = { id, changes: [], diagnostics: [], divisions: 1 }; },\n measure(measure, measureIndex) {\n const state = current!;\n const { changes, diagnostics } = state;\n let cursor = 0;\n const damper = (sound: XmlElement | undefined, beat: number) => {\n if (sound?.hasAttribute('sostenuto-pedal')) diagnostics.push('Sostenuto pedal is engraved but not synthesized.');\n const value = sound?.getAttribute('damper-pedal');\n if (value === null || value === undefined) return;\n const down = value === 'yes' || (value !== 'no' && Number(value) > 0);\n changes.push({ measureIndex, beat, kind: down ? 'down' : 'up' });\n };\n for (const item of measure.children) {\n const name = item.localName;\n if (name === 'attributes') { const d = Number(child(item, 'divisions')?.textContent); if (d > 0) state.divisions = d; }\n else if (name === 'note') { if (!child(item, 'chord') && !child(item, 'grace')) cursor += duration(item) / state.divisions; }\n else if (name === 'backup') cursor = Math.max(0, cursor - duration(item) / state.divisions);\n else if (name === 'forward') cursor += duration(item) / state.divisions;\n else if (name === 'sound') damper(item, cursor);\n else if (name === 'direction') {\n const offset = child(item, 'offset');\n const beat = Math.max(0, cursor + (offset?.getAttribute('sound') === 'yes' ? (Number(offset.textContent) || 0) / state.divisions : 0));\n const pedals = children(item, 'direction-type').flatMap(type => children(type, 'pedal'));\n for (const pedal of pedals) {\n const type = pedal.getAttribute('type');\n if (type === 'start' || type === 'resume') changes.push({ measureIndex, beat, kind: 'down' });\n else if (type === 'stop' || type === 'discontinue') changes.push({ measureIndex, beat, kind: 'up' });\n else if (type === 'change') changes.push({ measureIndex, beat, kind: 'change' });\n else if (type === 'sostenuto') diagnostics.push('Sostenuto pedal is engraved but not synthesized.');\n }\n if (pedals.length) { if (child(item, 'sound')?.hasAttribute('sostenuto-pedal')) diagnostics.push('Sostenuto pedal is engraved but not synthesized.'); }\n else damper(child(item, 'sound'), beat);\n }\n }\n },\n end() { if (current) partPedals.push(current); current = undefined; },\n },\n result() {\n // A repeated part ID keeps its first position but the last part's changes (as a Map keyed by ID would).\n const last = new Map<string, number>();\n partPedals.forEach((entry, index) => last.set(entry.id, index));\n const pedals = new Map<string, PedalChange[]>();\n const pedalDiagnostics: string[] = [];\n for (const index of last.values()) {\n const entry = partPedals[index];\n pedalDiagnostics.push(...entry.diagnostics);\n if (entry.changes.length) pedals.set(entry.id, entry.changes);\n }\n return { marks, markDiagnostics, pedals, pedalDiagnostics };\n },\n };\n}\n\n/** Thrown when a header element the parts depend on (part-list, defaults, concert-score) follows a part. */\nclass LateHeader extends Error {}\n\n/**\n * Read a MusicXML document (partwise or timewise text) in one pass. Throws 'This file is not valid XML.' or\n * 'This file is not a MusicXML score.' like the former DOM importer.\n */\nexport function readMusicXml(text: string): MusicXmlRead {\n const name = rootElementName(text);\n let source = text;\n let inventory: FeatureInventory | undefined;\n if (!name || localNameOf(name) === 'score-timewise') {\n const converted = timewiseToPartwise(text);\n source = converted.text;\n inventory = converted.inventory;\n }\n try { return readPartwise(source, inventory); }\n catch (error) {\n if (!(error instanceof LateHeader)) throw error;\n // An out-of-order header: read it first, then read the document again with it known from the start.\n const prelude = new Map<string, XmlElement>();\n const builder = new XmlTreeBuilder();\n let depth = 0;\n scanXml(source, {\n startElement: (elementName, attributes) => { builder.open(elementName, attributes, depth === 1 && localNameOf(elementName) !== 'part'); depth++; },\n endElement: () => { depth--; const done = builder.close(); if (done && !prelude.has(done.localName)) prelude.set(done.localName, done); },\n text: value => builder.text(value),\n });\n return readPartwise(source, inventory, prelude);\n }\n}\n\ntype Frame = { local: string; start: number; kind: 'root' | 'top' | 'part' | 'measure' | 'part-other' | 'inner' | 'skip'; captured: boolean; childCount: number; onlyMultiRest: boolean };\ntype Edit = { start: number; end: number; text: string };\n\nfunction readPartwise(text: string, timewiseInventory: FeatureInventory | undefined, prelude?: Map<string, XmlElement>): MusicXmlRead {\n const names = new Map<string, number>();\n const stack: Frame[] = [];\n const edits: Edit[] = [];\n const builder = new XmlTreeBuilder();\n const playback = playbackCollector();\n const navigationMeasures: MeasureNavigation[] = [];\n const navigationNotes: string[][] = [];\n const readNavigation = musicXmlNavigationReader();\n let root: XmlElement | undefined;\n let partwise = false;\n let partNo = -1;\n let partsStarted = false;\n // identifyMusicXmlNotes state: IDs in use, and the measure/note counters of the note being read.\n const used = new Set<string>();\n let measureNo = -1, noteIndex = 0;\n\n // Score state (the former parseMusicXml, restructured per part and per measure).\n let concertScore = false;\n let scoreParts = new Map<string | null, XmlElement>();\n let partNames = new Map<string | null, string>();\n let beats = 4, beatType = 4, key = 0, tempo = 100;\n let keyMode: 'major' | 'minor' | undefined;\n let openingMeter = false, openingTempo = false;\n const parts: Part[] = [];\n type PartState = {\n element: XmlElement; id: string; name: string; definition?: XmlElement; channel10: boolean; unpitched: boolean;\n staffMap: Map<number, Part>; divisions: number; partKey: number; partKeyMode?: 'major' | 'minor'; partBeats: number; partBeatType: number; partClef: string;\n partTransposition: Transposition; staffTranspositions: Map<number, Transposition>;\n };\n let part: PartState | undefined;\n\n const header = (local: string) => prelude?.get(local) ?? (root && child(root, local));\n const instrumentFields = (state: PartState) => {\n const { definition, element, name } = state;\n const scoreInstruments = children(definition || element, 'score-instrument');\n const gmVirtual = scoreInstruments.map(item => child(item, 'virtual-instrument')).map(item => item && gmProgramForVirtualName(value(item, 'virtual-library'), value(item, 'virtual-name'))).find(Boolean);\n const hasOtherVirtual = scoreInstruments.some(item => {\n const library = value(child(item, 'virtual-instrument') || item, 'virtual-library');\n return library && library.toLowerCase().replace(/[^a-z]/g, '') !== 'generalmidi';\n });\n // Drum kits are often exported as program 1 on channel 10; never map them to piano.\n const drumKit = children(definition || element, 'midi-instrument').some(item => number(item, 'midi-channel') === 10) || state.unpitched;\n const midiProgram = !drumKit && !gmVirtual && !hasOtherVirtual ? children(definition || element, 'midi-instrument').map(item => gmProgramForNumber(number(item, 'midi-program', 0))).find(Boolean) : undefined;\n const gm = drumKit ? undefined : gmVirtual || midiProgram;\n return { instrument: drumKit ? 'drum-kit' : gm ? gm.icon as Part['instrument'] : instrumentForName(name), gmProgram: gm?.program, gmSoundfont: gm?.soundfont };\n };\n\n const beginPart = (element: XmlElement) => {\n if (!partsStarted) {\n partsStarted = true;\n const defaults = header('defaults');\n concertScore = Boolean(defaults ? child(defaults, 'concert-score') : header('concert-score'));\n const list = header('part-list');\n scoreParts = new Map((list ? children(list, 'score-part') : []).map(p => [p.getAttribute('id'), p]));\n partNames = new Map([...scoreParts].map(([id, p]) => [id, value(p, 'part-name')]));\n }\n partNo++;\n const id = element.getAttribute('id') || `P${partNo + 1}`;\n const definition = scoreParts.get(id);\n part = {\n element, id, name: partNames.get(id) || `Part ${partNo + 1}`, definition, unpitched: false,\n channel10: definition ? children(definition, 'midi-instrument').some(item => number(item, 'midi-channel') === 10) : false,\n staffMap: new Map(), divisions: 1, partKey: key, partBeats: 4, partBeatType: 4, partClef: '',\n partTransposition: { semitones: 0 }, staffTranspositions: new Map(),\n };\n playback.pedals.begin(element.getAttribute('id') || '');\n };\n\n const readMeasure = (m: XmlElement, index: number) => {\n const state = part!;\n const { id, name, definition, staffMap, staffTranspositions } = state;\n let cursor = 0;\n let last: ScoreNote | undefined;\n const harmonyByTime = new Map<number, string>();\n const attrs = child(m, 'attributes');\n const applyAttributes = (attributes: XmlElement) => {\n state.divisions = number(attributes, 'divisions', state.divisions);\n const time = child(attributes, 'time');\n if (time) {\n state.partBeats = number(time, 'beats', state.partBeats); state.partBeatType = number(time, 'beat-type', state.partBeatType);\n if (partNo === 0 && !openingMeter) { beats = state.partBeats; beatType = state.partBeatType; openingMeter = true; }\n }\n const k = child(attributes, 'key');\n if (k) { state.partKey = number(k, 'fifths', state.partKey); state.partKeyMode = value(k, 'mode') === 'minor' ? 'minor' : 'major'; if (partNo === 0 && index === 0) { key = state.partKey; keyMode = state.partKeyMode; } }\n const clefElement = children(attributes, 'clef').find(c => Number(c.getAttribute('number') || 1) === 1);\n if (clefElement) state.partClef = clefName(clefElement);\n const forPart = children(attributes, 'for-part').map(item => musicXmlTranspose(child(item, 'part-transpose'))).find(Boolean);\n if (concertScore && forPart) state.partTransposition = forPart;\n else for (const item of children(attributes, 'transpose')) {\n const interval = musicXmlTranspose(item)!;\n const staffNumber = Number(item.getAttribute('number'));\n if (staffNumber > 0) staffTranspositions.set(staffNumber, interval);\n else state.partTransposition = interval;\n }\n staffMap.forEach((staffPart, staff) => {\n const measure = staffPart.measures[index];\n if (!measure) return;\n const staffClef = children(attributes, 'clef').find(c => Number(c.getAttribute('number') || 1) === staff);\n if (staffClef) staffPart.clef = clefName(staffClef);\n measure.key = state.partKey; if (state.partKeyMode) measure.keyMode = state.partKeyMode; measure.clef = staffPart.clef; measure.beatsPerBar = state.partBeats; measure.beatType = state.partBeatType;\n measure.nominalBeats = state.partBeats * 4 / state.partBeatType;\n });\n };\n if (attrs) applyAttributes(attrs);\n const measureBeats = state.partBeats * 4 / state.partBeatType;\n const ensure = (staff: number) => {\n const transposition = staffTranspositions.get(staff) || state.partTransposition;\n if (!staffMap.has(staff)) {\n const clefEl = attrs && children(attrs, 'clef').find(c => Number(c.getAttribute('number') || 1) === staff);\n const clef = clefEl ? clefName(clefEl) : state.partClef || (/bass/i.test(name) ? 'bass' : 'treble');\n const provisional = instrumentFields(state);\n staffMap.set(staff, { id: `${id}-${staff}`, name: staff === 1 ? name : `${name} · ${staff}`, clef, key: state.partKey, ...(state.partKeyMode ? { keyMode: state.partKeyMode } : {}), instrument: provisional.instrument, gmProgram: provisional.gmProgram, gmSoundfont: provisional.gmSoundfont, pitchBasis: concertScore ? 'concert' : 'written', transposition, measures: Array.from({ length: index }, (_, i) => empty(i, measureBeats)) });\n }\n const p = staffMap.get(staff)!;\n if (!p.measures[index]) p.measures[index] = { ...empty(index, measureBeats), nominalBeats: measureBeats, number: m.getAttribute('number') || String(index + 1), implicit: m.getAttribute('implicit') === 'yes', key: state.partKey, ...(state.partKeyMode ? { keyMode: state.partKeyMode } : {}), clef: p.clef, beatsPerBar: state.partBeats, beatType: state.partBeatType };\n p.measures[index].transposition = transposition;\n return p.measures[index];\n };\n staffMap.forEach((_, staff) => ensure(staff));\n for (const item of m.children) {\n if (item.localName === 'attributes') { if (item !== attrs) applyAttributes(item); continue; }\n if (item.localName === 'harmony') {\n const symbol = musicXmlHarmony(item);\n if (symbol) harmonyByTime.set(cursor + number(item, 'offset') / state.divisions, symbol);\n }\n if (item.localName === 'direction') {\n const sound = child(item, 'sound');\n const metronome = child(item, 'direction-type') && child(child(item, 'direction-type')!, 'metronome');\n const metronomeUnit = metronome && value(metronome, 'beat-unit');\n const unitLength = metronomeUnit ? durationBeats(metronomeUnit, metronome ? children(metronome, 'beat-unit-dot').length : 0) : 1;\n const t = Number(sound?.getAttribute('tempo') || (metronome ? value(metronome, 'per-minute') : 0)) * (sound?.hasAttribute('tempo') ? 1 : unitLength);\n if (t > 0 && partNo === 0 && !openingTempo) { tempo = t; openingTempo = true; }\n const dynamics = children(item, 'direction-type').flatMap(type => children(type, 'dynamics')).flatMap(mark => mark.children);\n const measure = ensure(number(item, 'staff', 1));\n const start = Math.max(0, cursor + number(item, 'offset') / state.divisions);\n const symbols = dynamics.map(mark => (mark.localName === 'other-dynamics' ? mark.textContent || '' : mark.localName).trim().toLowerCase()).filter(Boolean);\n const text = children(item, 'direction-type').flatMap(type => children(type, 'words')).map(word => word.textContent?.trim() || '').filter(Boolean).join(' ');\n const wedge = children(item, 'direction-type').flatMap(type => children(type, 'wedge'))[0];\n const soundDynamics = sound?.hasAttribute('dynamics') ? Number(sound.getAttribute('dynamics')) : undefined;\n if (symbols.length || text || wedge || t > 0 || soundDynamics !== undefined) (measure.directions ||= []).push({ start, symbols, text, placement: item.getAttribute('placement') === 'above' ? 'above' : 'below', voice: value(item, 'voice') || undefined, wedge: wedge ? { type: wedge.getAttribute('type') || '', number: wedge.getAttribute('number') || '1' } : undefined, soundDynamics, tempo: t > 0 ? t : undefined });\n for (const symbol of symbols) (measure.dynamics ||= []).push({ start, symbol });\n }\n if (item.localName === 'backup') { cursor = Math.max(0, cursor - number(item, 'duration') / state.divisions); last = undefined; }\n if (item.localName === 'forward') { cursor += number(item, 'duration') / state.divisions; last = undefined; }\n if (item.localName !== 'note') continue;\n const staff = number(item, 'staff', 1);\n const measure = ensure(staff);\n const chord = Boolean(child(item, 'chord'));\n const grace = Boolean(child(item, 'grace'));\n const dots = children(item, 'dot').length;\n const duration = grace ? 0 : child(item, 'duration') ? number(item, 'duration') / state.divisions : durationBeats(value(item, 'type'), dots);\n const p = child(item, 'pitch');\n const unpitched = child(item, 'unpitched');\n const rest = Boolean(child(item, 'rest'));\n const primaryBeam = children(item, 'beam').find(beam => Number(beam.getAttribute('number') || 1) === 1)?.textContent?.trim().toLowerCase();\n const beamStart = primaryBeam === 'begin';\n const beamEnd = primaryBeam === 'end';\n const accidentalElement = child(item, 'accidental');\n const sourceId = item.getAttribute('id') || undefined;\n const instrumentId = child(item, 'instrument')?.getAttribute('id');\n const midiInstrument = definition && children(definition, 'midi-instrument').find(instrument => instrument.getAttribute('id') === instrumentId) || definition && children(definition, 'midi-instrument')[0];\n const midiUnpitched = midiInstrument ? number(midiInstrument, 'midi-unpitched', 0) : 0;\n const displayStep = unpitched ? value(unpitched, 'display-step') || 'C' : undefined;\n const displayOctave = unpitched ? number(unpitched, 'display-octave', 4) : undefined;\n const basePitch = p ? pitch(value(p, 'step') || 'C', number(p, 'octave', 4), number(p, 'alter')) : unpitched ? { ...midiPitch(midiUnpitched ? midiUnpitched - 1 : defaultDrumMidi(displayStep!, displayOctave!)), unpitched: true, displayStep, displayOctave } : undefined;\n const ties = children(item, 'tie');\n const notePitch = basePitch && !rest ? { ...basePitch, sourceId, accidental: accidentalElement?.textContent?.trim(), cautionary: accidentalElement?.getAttribute('cautionary') === 'yes' || accidentalElement?.getAttribute('parentheses') === 'yes', tieStart: ties.some(t => t.getAttribute('type') === 'start'), tieStop: ties.some(t => t.getAttribute('type') === 'stop') } : undefined;\n const notations = child(item, 'notations');\n const timeModification = child(item, 'time-modification');\n const tuplets = children(notations || item, 'tuplet');\n const tuplet = timeModification ? { actual: number(timeModification, 'actual-notes', 3), normal: number(timeModification, 'normal-notes', 2), number: tuplets[0]?.getAttribute('number') || '1', start: tuplets.some(t => t.getAttribute('type') === 'start'), stop: tuplets.some(t => t.getAttribute('type') === 'stop') } : undefined;\n // A MusicXML <chord> can contain notes with different durations. Only\n // combine equal-duration pitches; keep the others as concurrent voices.\n const onset = chord && last ? last.start : cursor;\n if (chord && last && notePitch && last.voice === (value(item, 'voice') || '1') && Math.abs(last.duration - duration) < .001) {\n last.pitches.push(notePitch);\n last.beamStart ||= beamStart;\n last.beamEnd ||= beamEnd;\n }\n else {\n const slurs = children(notations || item, 'slur');\n last = { id: `${id}-${staff}-${index}-${measure.notes.length}`, sourceId, start: onset, duration, pitches: notePitch ? [notePitch] : [], transposition: staffTranspositions.get(staff) || state.partTransposition, chordSymbol: harmonyByTime.get(onset), rest, dotted: Boolean(child(item, 'dot')), dots, writtenType: value(item, 'type') || undefined, voice: value(item, 'voice') || '1', stem: value(item, 'stem') || undefined, grace, tuplet, slurStart: slurs.filter(s => s.getAttribute('type') === 'start').map(s => s.getAttribute('number') || '1'), slurStop: slurs.filter(s => s.getAttribute('type') === 'stop').map(s => s.getAttribute('number') || '1'), tieStart: notePitch?.tieStart, tieStop: notePitch?.tieStop };\n measure.notes.push(last);\n }\n if (!chord && !grace) cursor += duration;\n }\n for (const staffPart of staffMap.values()) {\n const measure = staffPart.measures[index];\n if (measure?.implicit) measure.beats = Math.max(cursor, ...measure.notes.map(note => note.start + note.duration), 0);\n }\n };\n\n const endPart = () => {\n const state = part!;\n // Instrument fields depend on an <unpitched> anywhere in the part, known only now.\n const fields = instrumentFields(state);\n for (const staffPart of state.staffMap.values()) Object.assign(staffPart, fields);\n parts.push(...Array.from(state.staffMap.values()).sort((a, b) => Number(a.id.split('-').pop()) - Number(b.id.split('-').pop())));\n playback.pedals.end();\n part = undefined;\n };\n\n /** The engraving note ID for a structural <note> (identifyMusicXmlNotes); records the edit that writes it. */\n const identify = (attributes: XmlAttribute[], end: number, selfClosing: boolean): string => {\n const idAttribute = attributes.find(a => a.name === 'id');\n const native = idAttribute?.value || attributes.find(a => a.name === 'xml:id')?.value || '';\n let id = native || `mx_p${partNo + 1}_m${measureNo + 1}_n${++noteIndex}`;\n if (native) noteIndex++;\n if (used.has(id)) id = `${id}_${partNo + 1}_${measureNo + 1}_${noteIndex}`;\n used.add(id);\n if (!idAttribute) edits.push({ start: end - (selfClosing ? 2 : 1), end: end - (selfClosing ? 2 : 1), text: ` id=\"${escapeAttribute(id)}\"` });\n else if (idAttribute.value !== id) edits.push({ start: idAttribute.start, end: idAttribute.end, text: `id=\"${escapeAttribute(id)}\"` });\n return id;\n };\n\n const completed = (element: XmlElement, kind: Frame['kind']) => {\n playback.notes(element);\n if (kind === 'top') {\n root!.append(element);\n // The parts read part-list and defaults (or a root-level concert-score) when the first part starts.\n if (partsStarted && !prelude && ['part-list', 'defaults', 'concert-score'].includes(element.localName) && child(root!, element.localName) === element) throw new LateHeader();\n } else if (kind === 'measure') {\n readMeasure(element, measureNo);\n playback.pedals.measure(element, measureNo);\n if (partNo === 0) { const notes: string[] = []; navigationMeasures[measureNo] = readNavigation(element, notes); navigationNotes[measureNo] = notes; }\n } else if (kind === 'part-other') part!.element.append(element);\n };\n\n scanXml(text, {\n startElement(name, attributes, start, end, selfClosing) {\n const local = localNameOf(name);\n if (!timewiseInventory) names.set(local, (names.get(local) || 0) + 1);\n const parent = stack.at(-1);\n if (parent) { parent.childCount++; if (local !== 'multiple-rest') parent.onlyMultiRest = false; }\n let kind: Frame['kind'];\n let element: XmlElement | null = null;\n if (!parent) {\n kind = 'root';\n partwise = local === 'score-partwise';\n root = new XmlElement(name, attributes);\n } else if (!partwise) kind = 'skip';\n else if (parent.kind === 'root') {\n if (local === 'part') {\n kind = 'part'; measureNo = -1;\n beginPart(new XmlElement(name, attributes));\n } else { kind = 'top'; element = builder.open(name, attributes, true); }\n } else if (parent.kind === 'part') {\n if (local === 'measure') { kind = 'measure'; measureNo++; noteIndex = 0; }\n else kind = 'part-other';\n element = builder.open(name, attributes, true);\n } else {\n kind = 'inner';\n element = builder.open(name, attributes, false);\n if (local === 'note' && parent.kind === 'measure') element!.setAttribute('id', identify(attributes, end, selfClosing));\n if (local === 'unpitched' && part) part.unpitched = true;\n }\n stack.push({ local, start, kind, captured: element !== null, childCount: 0, onlyMultiRest: true });\n },\n endElement(_name, _start, end) {\n const frame = stack.pop()!;\n // A removal replaces any edit inside the removed span (nested multi-rests, the hint inside its measure-style).\n if (frame.local === 'multiple-rest' || (frame.local === 'measure-style' && frame.childCount > 0 && frame.onlyMultiRest)) {\n while (edits.length && edits.at(-1)!.start >= frame.start) edits.pop();\n edits.push({ start: frame.start, end, text: '' });\n }\n if (frame.captured) { const done = builder.close(); if (done) completed(done, frame.kind); }\n if (frame.kind === 'part') endPart();\n },\n text: value => builder.text(value),\n });\n if (!partwise) throw new Error('This file is not a MusicXML score.');\n\n const scoreRoot = root!;\n const credits = children(scoreRoot, 'credit');\n const identification = child(scoreRoot, 'identification');\n const credit = (type: string) => { const match = credits.find(c => children(c, 'credit-type').some(t => t.textContent?.trim().toLowerCase() === type)); return (match && firstDescendant(match, 'credit-words'))?.textContent?.trim() || ''; };\n const creators = children(identification || scoreRoot, 'creator');\n const movementTitle = value(scoreRoot, 'movement-title');\n const title = value(child(scoreRoot, 'work') || scoreRoot, 'work-title') || movementTitle || credit('title');\n const subtitle = credit('subtitle') || (movementTitle && movementTitle !== title ? movementTitle : '');\n const composer = creators.find(e => e.getAttribute('type') === 'composer')?.textContent?.trim() || credit('composer');\n const otherCredits = creators.filter(e => e.getAttribute('type') !== 'composer').map(e => {\n const name = e.textContent?.trim();\n const type = e.getAttribute('type');\n return name ? `${type ? type[0].toUpperCase() + type.slice(1) + ': ' : ''}${name}` : '';\n }).filter(Boolean);\n const rights = value(identification || scoreRoot, 'rights');\n if (rights) otherCredits.push(rights);\n const shown = new Set([title, subtitle, composer, ...otherCredits].filter(Boolean).map(s => s.trim()));\n for (const line of credits.flatMap(c => c.descendants().filter(e => e.localName === 'credit-words').map(e => e.textContent?.trim() || ''))) {\n if (line && !shown.has(line)) { otherCredits.push(line); shown.add(line); }\n }\n // Builder-style scores can contain many placeholder instruments with only\n // rests. They obscure the playable staves in the continuous reader. A silent\n // staff is kept only when its directions shape playback: a tempo, or\n // dynamics/wedges that apply to a sounding sibling staff of the same part.\n // Plain words (e.g. a template's \"(Easy 3)\" label) do not make it playable.\n const sounding = (p: Part) => p.measures.some(measure => measure.notes.some(note => note.pitches.length > 0));\n const sourcePart = (p: Part) => p.id.replace(/-\\d+$/, '');\n const soundingSources = new Set(parts.filter(sounding).map(sourcePart));\n const shapesPlayback = (p: Part) => p.measures.some(measure => measure.directions?.some(direction => (direction.tempo ?? 0) > 0\n || (soundingSources.has(sourcePart(p)) && (direction.symbols?.length || direction.wedge || direction.soundDynamics !== undefined))));\n const playableParts = parts.filter(p => sounding(p) || shapesPlayback(p));\n const score = normalizedScore({ title, subtitle, composer, credits: otherCredits, source: 'MusicXML', tempo, beats, beatType, key, ...(keyMode ? { keyMode } : {}), parts: playableParts.length ? playableParts : parts });\n // Navigation is read once from the first source part and shared by every staff.\n const measureCount = score.parts[0].measures.length;\n const navigation = Array.from({ length: measureCount }, (_, i) => navigationMeasures[i] || {});\n attachNavigation(score, navigation);\n const notes = navigationNotes.slice(0, measureCount).flat();\n\n let engravingText = text;\n if (edits.length) {\n const pieces: string[] = [];\n let from = 0;\n for (const edit of edits) { pieces.push(text.slice(from, edit.start), edit.text); from = edit.end; }\n pieces.push(text.slice(from));\n engravingText = pieces.join('');\n }\n return {\n score, engravingText,\n inventory: timewiseInventory || inventoryFromCounts(names, localNameOf(scoreRoot.name)),\n diagnostics: [...new Set(notes)].map(message => ({ feature: 'navigation', status: 'unsupported', location: '/', message })),\n playback: playback.result(),\n };\n}\n\n/** Playback marks of a MusicXML text (articulations, fermatas, cue notes, pedals); empty when it cannot be read. */\nexport function readPlaybackMarks(text: string | undefined): PlaybackMarks {\n const collector = playbackCollector();\n if (!text) return collector.result();\n const builder = new XmlTreeBuilder();\n const stack: ('root' | 'part' | 'measure' | 'other')[] = [];\n let timewise = false, measureIndex = -1;\n /** Timewise: part ID → its measures' <part> elements, in order (pedals are per part). */\n const timewiseParts = new Map<string, XmlElement[]>();\n try {\n scanXml(text, {\n startElement(name, attributes) {\n const local = localNameOf(name);\n const parent = stack.at(-1);\n if (!parent) { timewise = local === 'score-timewise'; stack.push('root'); return; }\n if (parent === 'root' && !timewise && local === 'part') { collector.pedals.begin(attributes.find(a => a.name === 'id')?.value || ''); measureIndex = -1; stack.push('part'); return; }\n const measure = parent === 'part' && local === 'measure';\n if (measure) measureIndex++;\n builder.open(name, attributes, parent === 'root' || parent === 'part');\n stack.push(measure ? 'measure' : 'other');\n },\n endElement() {\n const kind = stack.pop()!;\n if (kind === 'root') return;\n if (kind === 'part') { collector.pedals.end(); return; }\n const done = builder.close();\n if (!done) return;\n collector.notes(done);\n if (kind === 'measure') collector.pedals.measure(done, measureIndex);\n else if (timewise && done.localName === 'measure') for (const item of children(done, 'part')) { const id = item.getAttribute('id') || ''; timewiseParts.set(id, [...(timewiseParts.get(id) || []), item]); }\n },\n text: value => builder.text(value),\n });\n } catch (error) {\n if (error instanceof XmlError) return playbackCollector().result();\n throw error;\n }\n return timewise ? timewiseMarks(collector, timewiseParts) : collector.result();\n}\nfunction timewiseMarks(collector: PlaybackCollector, parts: Map<string, XmlElement[]>): PlaybackMarks {\n for (const [id, measures] of parts) {\n collector.pedals.begin(id);\n measures.forEach((measure, index) => collector.pedals.measure(measure, index));\n collector.pedals.end();\n }\n return collector.result();\n}\n","/**\n * Drum-set notation for General MIDI percussion (channel 10) on a five-line percussion staff, following the common\n * drum-set convention (PAS / MuseScore default kit): kick in the bottom space, snare in the third space, toms around\n * them, cymbals above the staff with x noteheads. Positions are written as treble-clef pitches; `loc` is the MEI staff\n * position (0 = bottom line, 1 = bottom space, ... 8 = top line).\n */\nexport type DrumHead = 'x' | 'diamond';\nexport type DrumNotation = { name: string; step: string; octave: number; head?: DrumHead };\n\nconst drum = (name: string, position: string, head?: DrumHead): DrumNotation => ({ name, step: position[0], octave: Number(position.slice(1)), ...(head ? { head } : {}) });\n\nexport const GM_DRUM_NOTATION: Readonly<Record<number, DrumNotation>> = {\n 35: drum('Acoustic Bass Drum', 'E4'),\n 36: drum('Bass Drum 1', 'F4'),\n 37: drum('Side Stick', 'C5', 'x'),\n 38: drum('Acoustic Snare', 'C5'),\n 39: drum('Hand Clap', 'B4', 'x'),\n 40: drum('Electric Snare', 'C5'),\n 41: drum('Low Floor Tom', 'G4'),\n 42: drum('Closed Hi-Hat', 'G5', 'x'),\n 43: drum('High Floor Tom', 'A4'),\n 44: drum('Pedal Hi-Hat', 'D4', 'x'),\n 45: drum('Low Tom', 'B4'),\n 46: drum('Open Hi-Hat', 'G5', 'x'),\n 47: drum('Low-Mid Tom', 'D5'),\n 48: drum('Hi-Mid Tom', 'E5'),\n 49: drum('Crash Cymbal 1', 'A5', 'x'),\n 50: drum('High Tom', 'E5'),\n 51: drum('Ride Cymbal 1', 'F5', 'x'),\n 52: drum('Chinese Cymbal', 'B5', 'x'),\n 53: drum('Ride Bell', 'F5', 'diamond'),\n 54: drum('Tambourine', 'E5', 'x'),\n 55: drum('Splash Cymbal', 'B5', 'x'),\n 56: drum('Cowbell', 'D5', 'diamond'),\n 57: drum('Crash Cymbal 2', 'A5', 'x'),\n 59: drum('Ride Cymbal 2', 'F5', 'x'),\n};\n/** Any other GM percussion sound: a diamond in the top space, apart from the kit. */\nexport const DRUM_FALLBACK: DrumNotation = drum('Percussion', 'E5', 'diamond');\n\nexport const drumNotation = (midi: number): DrumNotation => GM_DRUM_NOTATION[midi] ?? DRUM_FALLBACK;\n\n/** MEI @loc of a written treble-clef position on a five-line staff (E4 = 0, the bottom line). */\nexport function staffLoc(step: string, octave: number): number {\n return octave * 7 + 'CDEFGAB'.indexOf(step.toUpperCase()) - (4 * 7 + 2);\n}\n","import type { Part, Score, ScoreNote } from '../score';\nimport { countElements, inventoryFromCounts, type FeatureInventory, type SourceDiagnostic } from './musicxml-source';\nimport { XmlError } from './xml-stream';\nimport { drumNotation, staffLoc } from './drum-map';\n\nexport type { SourceDiagnostic };\nexport type SourceFormat = 'musicxml' | 'mxl' | 'mei' | 'abc' | 'midi' | 'sample';\nexport type EngravingFormat = 'musicxml' | 'mei';\nexport type SourceIdentity = {\n /** Legacy settings key -> source part and staff. */\n staffIdToSource: Record<string, { partId: string; staff: number; sourceId?: string }>;\n /** Source element ID -> existing ScoreNote ID. Several source pitches can share a chord ID. */\n sourceIdToNoteId: Record<string, string>;\n /** Existing ScoreNote ID -> first source note element ID. */\n noteIdToSourceId: Record<string, string>;\n};\nexport type SourceDocument = Readonly<{\n format: SourceFormat;\n engravingFormat: EngravingFormat;\n /** Original XML or ABC text; for MXL this is the extracted score member. Decoded on demand for imported files. */\n originalText?: string;\n /** Direct-import XML/MEI; it may contain IDs or timewise normalization. Decoded on demand for imported files. */\n engravingText: string;\n /** UTF-8 bytes of engravingText, without decoding it (what the Verovio worker is sent). */\n engravingBytes: () => Uint8Array;\n /** SHA-256 of original file bytes (archive bytes for MXL). */\n sha256?: string;\n filename?: string;\n featureCounts: Readonly<Record<string, number>>;\n diagnostics: readonly SourceDiagnostic[];\n identity: SourceIdentity;\n readOriginalBytes: () => Uint8Array;\n}>;\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst xmlId = (id: string) => `n_${id.replace(/[^A-Za-z0-9_.-]/g, '_')}`;\n/** Deterministic MEI staffDef ID for a Score part, so views can hide staves by identity. */\nexport const staffDefXmlId = (partId: string) => `staff_${partId.replace(/[^A-Za-z0-9_.-]/g, '_')}`;\nconst escape = (value: string) => value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\n/** Source feature inventory of an XML source (MusicXML, MXL member or MEI), read with the streaming tokenizer. */\nexport function sourceFeatureInventory(text: string, format: SourceFormat): FeatureInventory {\n if (!['musicxml', 'mxl', 'mei'].includes(format)) return { featureCounts: {}, diagnostics: [] };\n try {\n const { names, root } = countElements(text);\n return inventoryFromCounts(names, root);\n } catch (error) {\n if (!(error instanceof XmlError)) throw error;\n return { featureCounts: {}, diagnostics: [{ feature: 'xml', status: 'unsupported', location: '/', message: 'Source XML could not be parsed.' }] };\n }\n}\n\n/** A text held as UTF-8 bytes (imported files keep bytes, not strings, on the main thread) or as a string. */\nexport type SourceText = string | { bytes: Uint8Array; decode?: () => string };\nconst textOf = (source: SourceText) => typeof source === 'string' ? source : source.decode ? source.decode() : decoder.decode(source.bytes);\n\nexport function makeSourceDocument(args: {\n format: SourceFormat; engravingFormat: EngravingFormat; originalBytes?: Uint8Array; originalText?: SourceText;\n engravingText: SourceText; filename?: string; sha256?: string; identity?: SourceIdentity;\n diagnostics?: readonly SourceDiagnostic[];\n /** A feature inventory already taken of the same source (by the import worker, or re-wrapping a document), so it is not read again. */\n inventory?: { featureCounts: Readonly<Record<string, number>>; diagnostics: readonly SourceDiagnostic[] };\n}): SourceDocument {\n // Binary sources (MXL archives, MIDI) keep their bytes, owned by the document; a text source's bytes are its text,\n // encoded on demand rather than held as a second copy. Imported files keep only bytes: their texts are decoded on\n // demand, so the main thread holds no copy of a large source as a string.\n const bytes = args.originalBytes;\n const original = args.originalText;\n const engraving = args.engravingText;\n const inventory = args.inventory || sourceFeatureInventory(original !== undefined ? textOf(original) || textOf(engraving) : textOf(engraving), args.format);\n const document = {\n format: args.format, engravingFormat: args.engravingFormat, filename: args.filename, sha256: args.sha256,\n featureCounts: Object.freeze({ ...inventory.featureCounts }), diagnostics: Object.freeze([...inventory.diagnostics, ...(args.diagnostics || [])]),\n identity: args.identity || { staffIdToSource: {}, sourceIdToNoteId: {}, noteIdToSourceId: {} },\n engravingBytes: () => typeof engraving === 'string' ? encoder.encode(engraving) : engraving.bytes,\n readOriginalBytes: () => bytes ? bytes.slice() : encoder.encode(original === undefined ? '' : textOf(original)),\n };\n Object.defineProperty(document, 'originalText', { enumerable: true, get: () => original === undefined ? undefined : textOf(original) });\n Object.defineProperty(document, 'engravingText', { enumerable: true, get: () => textOf(engraving) });\n return Object.freeze(document) as SourceDocument;\n}\n\n/** Builds a SourceIdentity part by part (identityForScore in one go, or incrementally as a score arrives in chunks). */\nexport class IdentityBuilder {\n readonly identity: SourceIdentity = { staffIdToSource: {}, sourceIdToNoteId: {}, noteIdToSourceId: {} };\n part(part: Pick<Part, 'id'>): void {\n const match = /^(.*)-(\\d+)$/.exec(part.id);\n this.identity.staffIdToSource[part.id] = { partId: match?.[1] || part.id, staff: match ? Number(match[2]) : 1 };\n }\n notes(measures: Part['measures']): void {\n const identity = this.identity;\n for (const measure of measures) for (const note of measure.notes) {\n const sourceIds = [note.sourceId, ...note.pitches.map(p => p.sourceId)].filter((id): id is string => Boolean(id));\n if (!sourceIds.length) sourceIds.push(...(note.pitches.length > 1 ? note.pitches.map((_, index) => `${xmlId(note.id)}_p${index + 1}`) : [xmlId(note.id)]));\n identity.noteIdToSourceId[note.id] = sourceIds[0];\n for (const id of sourceIds) identity.sourceIdToNoteId[id] = note.id;\n }\n }\n}\n\ntype Segment = { note: ScoreNote; start: number; duration: number; continuation: number };\nfunction durationPieces(beats: number): { beats: number; dur: string; dots?: number }[] {\n const values = [4, 3, 2, 1.5, 1, .75, .5, .375, .25, .1875, .125, .0625];\n const result: { beats: number; dur: string; dots?: number }[] = [];\n let left = Math.round(beats * 64) / 64;\n while (left > 1e-6) {\n const value = values.find(v => v <= left + 1e-6) || .0625;\n const base = [4, 2, 1, .5, .25, .125, .0625].find(v => value === v || value === v * 1.5) || .0625;\n result.push({ beats: value, dur: String(4 / base), dots: value === base * 1.5 ? 1 : undefined });\n left -= value;\n }\n return result;\n}\n/**\n * Staff position and notehead of a percussion pitch: its written (display) position when the source had one (ABC,\n * unpitched MusicXML-style pitches), else the GM drum map for its MIDI note (MIDI channel 10).\n */\nfunction percussionPosition(pitch: ScoreNote['pitches'][number]): { loc: number; head?: string } {\n if (pitch.displayStep) return { loc: staffLoc(pitch.displayStep, pitch.displayOctave ?? 4) };\n const notation = drumNotation(pitch.midi);\n return { loc: staffLoc(notation.step, notation.octave), head: notation.head };\n}\nfunction meiPitch(note: ScoreNote, index: number, continuation: number, dur: string, dots?: number, pieceIndex = 0, percussion = false): string {\n const pitch = note.pitches[index];\n const source = xmlId(note.id) + (note.pitches.length > 1 ? `_p${index + 1}` : '') + (continuation ? `_c${continuation}` : '') + (pieceIndex ? `_s${pieceIndex}` : '');\n const accidental = pitch.alter === 2 ? 'ss' : pitch.alter === -2 ? 'ff' : pitch.alter === 1 ? 's' : pitch.alter === -1 ? 'f' : 'n';\n const tie = continuation ? 'm' : pitch.tieStart && pitch.tieStop ? 'm' : pitch.tieStart ? 'i' : pitch.tieStop ? 't' : undefined;\n // Percussion is unpitched: placed by staff position (@loc) with no pname/oct, so Verovio's transpose leaves it alone.\n const position = percussion ? percussionPosition(pitch) : undefined;\n const placement = position\n ? `loc=\"${position.loc}\"${position.head ? ` head.shape=\"${position.head}\"` : ''}`\n : `pname=\"${escape(pitch.step.toLowerCase())}\" oct=\"${pitch.octave}\" ${pitch.alter ? `accid.ges=\"${accidental}\"` : ''} ${pitch.accidental ? `accid=\"${accidental}\"` : ''}`;\n return `<note xml:id=\"${escape(source)}\" ${placement} ${tie ? `tie=\"${tie}\"` : ''} ${note.pitches.length === 1 ? `dur=\"${dur}\"${dots ? ` dots=\"${dots}\"` : ''}` : ''}/>`;\n}\nfunction meiEvent(note: ScoreNote, continuation: number, dur: string, dots?: number, pieceIndex = 0, percussion = false): string {\n if (!note.pitches.length) return `<rest dur=\"${dur}\"${dots ? ` dots=\"${dots}\"` : ''}/>`;\n const lyric = note.lyric && !continuation ? `<verse n=\"1\"><syl>${escape(note.lyric)}</syl></verse>` : '';\n if (note.pitches.length === 1) return meiPitch(note, 0, continuation, dur, dots, pieceIndex, percussion).replace('/>', `>${lyric}</note>`);\n return `<chord xml:id=\"${escape(xmlId(note.id) + (continuation ? `_c${continuation}` : '') + (pieceIndex ? `_s${pieceIndex}` : ''))}\" dur=\"${dur}\"${dots ? ` dots=\"${dots}\"` : ''}>${note.pitches.map((_, index) => meiPitch(note, index, continuation, dur, dots, pieceIndex, percussion)).join('')}${lyric}</chord>`;\n}\nfunction layerXml(segments: Segment[], beats: number, percussion = false): string {\n let cursor = 0;\n const tokens: string[] = [];\n // Open beam/tuplet wrappers, innermost last. MEI needs proper nesting, so a beam that\n // ends inside a tuplet is closed when that tuplet closes.\n const open: ('beam' | 'tuplet')[] = [];\n let tupletKey = '';\n let beamEndPending = false;\n const closeTop = () => { const top = open.pop(); if (top) tokens.push(`</${top}>`); if (top === 'tuplet') tupletKey = ''; };\n const closeTuplet = () => {\n if (!open.includes('tuplet')) return;\n while (open.length && open.at(-1) !== 'tuplet') closeTop();\n closeTop();\n if (beamEndPending && open.at(-1) === 'beam') { closeTop(); beamEndPending = false; }\n };\n const closeBeam = () => {\n if (!open.includes('beam')) return;\n if (open.at(-1) === 'beam') closeTop(); else beamEndPending = true;\n };\n const rests = (length: number) => durationPieces(length).map(piece => `<rest dur=\"${piece.dur}\"${piece.dots ? ` dots=\"${piece.dots}\"` : ''}/>`);\n for (const segment of segments.sort((a, b) => a.start - b.start || a.note.id.localeCompare(b.note.id))) {\n const gap = Math.max(0, segment.start - cursor);\n if (gap > 1e-6) { closeTuplet(); tokens.push(...rests(gap)); }\n const tuplet = segment.note.tuplet;\n // Tuplet notes carry sounding durations; engrave their written value inside a <tuplet> wrapper.\n const written = tuplet && tuplet.actual > 0 && tuplet.normal > 0 && !segment.continuation && Math.abs(segment.duration - segment.note.duration) < 1e-6\n ? durationPieces(segment.duration * tuplet.actual / tuplet.normal) : undefined;\n const inTuplet = !!written && written.length === 1;\n const key = inTuplet ? `${tuplet!.actual}/${tuplet!.normal}` : '';\n if (!inTuplet || (tuplet!.start && open.includes('tuplet')) || (tupletKey && tupletKey !== key)) closeTuplet();\n if (segment.note.beamStart && !open.includes('beam')) { tokens.push('<beam>'); open.push('beam'); beamEndPending = false; }\n if (inTuplet && !open.includes('tuplet')) { tokens.push(`<tuplet num=\"${tuplet!.actual}\" numbase=\"${tuplet!.normal}\">`); open.push('tuplet'); tupletKey = key; }\n const pieces = inTuplet ? written! : durationPieces(segment.duration);\n for (const [pieceIndex, piece] of pieces.entries()) tokens.push(meiEvent(segment.note, segment.continuation, piece.dur, piece.dots, pieceIndex, percussion));\n if (inTuplet && tuplet!.stop) closeTuplet();\n if (segment.note.beamEnd) closeBeam();\n cursor = Math.max(cursor, segment.start + segment.duration);\n }\n closeTuplet();\n while (open.length) closeTop();\n if (beats - cursor > 1e-6) tokens.push(...rests(beats - cursor));\n return tokens.join('');\n}\n\n/** A semantic MEI adapter for the reduced ABC/MIDI/demo model. Never use this for MusicXML or MEI originals. */\nexport function scoreToMei(score: Score): string {\n const count = Math.max(0, ...score.parts.map(part => part.measures.length));\n const meter = `meter.count=\"${score.beats}\" meter.unit=\"${score.beatType}\"`;\n const key = (score.key ? ` key.sig=\"${Math.abs(score.key)}${score.key > 0 ? 's' : 'f'}\"` : ' key.sig=\"0\"') + (score.keyMode === 'minor' ? ' key.mode=\"minor\"' : '');\n const staffDefs = score.parts.map((part, index) => `<staffDef xml:id=\"${escape(staffDefXmlId(part.id))}\" n=\"${index + 1}\" lines=\"5\" label=\"${escape(part.name)}\" clef.shape=\"${part.clef === 'bass' ? 'F' : part.clef === 'alto' ? 'C' : part.clef === 'percussion' ? 'perc' : 'G'}\" clef.line=\"${part.clef === 'bass' ? 4 : part.clef === 'alto' || part.clef === 'percussion' ? 3 : 2}\"/>`).join('');\n const navigation = Array.from({ length: count }, (_, index) => score.parts[0]?.measures[index]?.navigation);\n const jumpTarget = navigation.some(nav => nav?.toCoda) ? ' al Coda' : navigation.some(nav => nav?.fine) ? ' al Fine' : '';\n const measures = Array.from({ length: count }, (_, measureIndex) => {\n const staves = score.parts.map((part, staffIndex) => {\n const measure = part.measures[measureIndex];\n const beats = measure?.implicit ? measure.beats : measure?.nominalBeats || score.beats * 4 / score.beatType;\n const incoming: Segment[] = [];\n for (let sourceMeasure = 0; sourceMeasure <= measureIndex; sourceMeasure++) {\n const source = part.measures[sourceMeasure]; if (!source) continue;\n const nominal = source.nominalBeats || score.beats * 4 / score.beatType;\n for (const note of source.notes) {\n const absolute = sourceMeasure * nominal + note.start;\n const measureStart = measureIndex * nominal;\n const overlapStart = Math.max(absolute, measureStart);\n const overlapEnd = Math.min(absolute + note.duration, measureStart + beats);\n if (overlapEnd > overlapStart + 1e-6) incoming.push({ note, start: overlapStart - measureStart, duration: overlapEnd - overlapStart, continuation: sourceMeasure === measureIndex ? 0 : measureIndex - sourceMeasure });\n }\n }\n // Separate overlapping voices while retaining each ABC voice where present.\n const layers: Segment[][] = [];\n const ends: number[] = [];\n for (const segment of incoming.sort((a, b) => a.start - b.start || a.note.id.localeCompare(b.note.id))) {\n const preferred = segment.note.voice ? Number(segment.note.voice) - 1 : -1;\n let layer = preferred >= 0 && ends[preferred] <= segment.start + 1e-6 ? preferred : ends.findIndex(end => end <= segment.start + 1e-6);\n if (layer < 0) layer = ends.length;\n (layers[layer] ||= []).push(segment); ends[layer] = segment.start + segment.duration;\n }\n return `<staff n=\"${staffIndex + 1}\">${(layers.length ? layers : [[]]).map((layer, index) => `<layer n=\"${index + 1}\">${layerXml(layer, beats, part.clef === 'percussion')}</layer>`).join('')}</staff>`;\n }).join('');\n const harmonies = score.parts.flatMap((part, index) => part.measures[measureIndex]?.notes.filter(note => note.chordSymbol).map(note => `<harm staff=\"${index + 1}\" tstamp=\"${1 + note.start}\" >${escape(note.chordSymbol || '')}</harm>`) || []).join('');\n // A SMuFL quarter-note glyph (metNoteQuarterUp) followed by the beats per minute.\n const tempo = measureIndex === 0 ? `<tempo tstamp=\"1\" staff=\"1\" midi.bpm=\"${score.tempo}\" mm=\"${score.tempo}\" mm.unit=\"4\"><rend glyph.auth=\"smufl\"></rend> = ${score.tempo}</tempo>` : '';\n const nav = navigation[measureIndex] || {};\n const reference = score.parts[0]?.measures[measureIndex];\n const lastBeat = Math.max(1, Math.round(((reference?.beats || score.beats * 4 / score.beatType) * score.beatType / 4) * 1000) / 1000);\n const text = (words: string, tstamp: number) => `<dir tstamp=\"${tstamp}\" staff=\"1\" place=\"above\">${escape(words)}</dir>`;\n const marks = [\n nav.segno ? '<repeatMark func=\"segno\" tstamp=\"1\" staff=\"1\" place=\"above\"/>' : '',\n nav.coda ? '<repeatMark func=\"coda\" tstamp=\"1\" staff=\"1\" place=\"above\"/>' : '',\n nav.toCoda ? text('To Coda', lastBeat) : '',\n nav.fine ? text('Fine', lastBeat) : '',\n nav.daCapo ? text(`D.C.${jumpTarget}`, lastBeat) : '',\n nav.dalSegno ? text(`D.S.${jumpTarget}`, lastBeat) : '',\n ].join('');\n // Repeat barlines: a repeat end followed by a repeat start is one rptboth barline.\n const startsRepeat = nav.repeatStart && !navigation[measureIndex - 1]?.repeatEnd;\n const right = nav.repeatEnd ? (navigation[measureIndex + 1]?.repeatStart ? 'rptboth' : 'rptend') : '';\n const bars = `${startsRepeat ? ' left=\"rptstart\"' : ''}${right ? ` right=\"${right}\"` : ''}`;\n return `<measure n=\"${measureIndex + 1}\"${bars}>${staves}${harmonies}${tempo}${marks}</measure>`;\n });\n // Consecutive measures of one volta bracket are wrapped in an MEI <ending>.\n let sectionXml = '';\n for (let i = 0; i < measures.length;) {\n const endings = navigation[i]?.endings;\n if (!endings?.length) { sectionXml += measures[i++]; continue; }\n const key = endings.join(',');\n let j = i;\n while (j < measures.length && navigation[j]?.endings?.join(',') === key) j++;\n sectionXml += `<ending n=\"${key}\" label=\"${escape(endings.join(', '))}.\">${measures.slice(i, j).join('')}</ending>`;\n i = j;\n }\n return `<?xml version=\"1.0\" encoding=\"utf-8\"?><mei xmlns=\"http://www.music-encoding.org/ns/mei\" meiversion=\"5.0\"><meiHead><fileDesc><titleStmt><title>${escape(score.title)}</title>${score.composer ? `<respStmt><persName role=\"composer\">${escape(score.composer)}</persName></respStmt>` : ''}</titleStmt><pubStmt/></fileDesc></meiHead><music><body><mdiv><score><scoreDef ${meter}${key}><staffGrp>${staffDefs}</staffGrp></scoreDef><section>${sectionXml}</section></score></mdiv></body></music></mei>`;\n}\n\n/** Attach a semantic MEI engraving document to a model-only score (for example the built-in sample). */\nexport function withEngravingDocument<T extends Score>(score: T, format: SourceFormat = 'sample'): T {\n if (score.document) return score;\n const engravingText = scoreToMei(score);\n return { ...score, document: makeSourceDocument({ format, engravingFormat: 'mei', originalText: engravingText, engravingText, identity: identityForScore(score) }) };\n}\n\nexport function identityForScore(score: Score): SourceIdentity {\n const builder = new IdentityBuilder();\n for (const part of score.parts) { builder.part(part); builder.notes(part.measures); }\n return builder.identity;\n}\n","/**\n * Stave scale (zoom): rendered px per Verovio layout unit at Verovio `scale: 100`,\n * i.e. an absolute stave size. `1` is Verovio's natural size (a 72px five-line staff).\n * The layout width is `(viewport width - first-system gutter) / zoom`, so Verovio\n * reflows the score to fill the viewport at the chosen stave size.\n */\nexport type DeviceClass = 'desktop' | 'compact';\n\n/** Slider and pinch range; matches the score-state schema. The floor is low enough for many-staff height fits (Cielito, 12 staves, fits at about 0.22 on desktop). */\nexport const STAVE_SCALE_MIN = .2;\nexport const STAVE_SCALE_MAX = 4;\nexport const STAVE_SCALE_STEP = .05;\n/**\n * Round to the slider step within the range. `min` is the effective minimum: a many-staff height fit can sit below\n * STAVE_SCALE_MIN, and the slider then reaches down to it (the fit is never clamped up).\n */\nexport const clampStaveScale = (value: number, min = STAVE_SCALE_MIN) => Math.max(min, Math.min(STAVE_SCALE_MAX, Math.round(value / STAVE_SCALE_STEP) / Math.round(1 / STAVE_SCALE_STEP)));\n/** Smallest stave scale a saved record may hold (a user can keep a very small height fit). */\nexport const STAVE_SCALE_FLOOR = .02;\n\n/** Desktop: a fine pointer and a viewport wider than 850px. Everything else (phones, tablets) is compact. */\n// Known v1 limitation: this still queries the viewport, not the .pepperscore root (layout CSS sizes from the root).\nexport const DESKTOP_QUERY = '(pointer: fine) and (min-width: 851px)';\nexport const deviceClass = (): DeviceClass => typeof window !== 'undefined' && window.matchMedia?.(DESKTOP_QUERY).matches ? 'desktop' : 'compact';\n\n/**\n * Endless default stave scale (unchanged from the fixed device defaults): desktop is 75% of the sample's former\n * rendered scale of 1 (a 72px staff at 1280x800); phones and tablets keep 1. Vertical does not use it.\n */\nexport const ENDLESS_STAVE_SCALE: Record<DeviceClass, number> = { desktop: .75, compact: 1 };\n/**\n * Vertical default: the largest stave scale at which this many bars fit the first system beside the staff controls at\n * their minimum width, so Auto shows that many per line (`barFitZoom` in render.ts). It depends on the viewport, not the\n * score length: a shorter score is drawn at the same size on a shorter, centred system.\n */\nexport const DEFAULT_VERTICAL_BARS = 4;\n/**\n * Readable floor for the Vertical default on compact devices (phones, tablets): the rendered five-line staff is at least\n * this many px, so a phone shows fewer bars per line (2-3) rather than an unreadably small four-bar fit.\n * Only the default is floored; a user can still zoom below it.\n */\nexport const COMPACT_MIN_DEFAULT_STAVE_PX = 40;\n/** Smallest Vertical default stave scale for a device class (the staff is 72px at stave scale 1, render.ts STAFF_UNITS). */\nexport const minimumDefaultStaveScale = (device: DeviceClass) => device === 'compact' ? Math.ceil(COMPACT_MIN_DEFAULT_STAVE_PX / 72 * 1000) / 1000 : 0;\n/** Scores with more than this many staves default to the full-stack height fit, capped at the default above. */\nexport const HEIGHT_FIT_STAVES = 4;\n/*\n * Without a user-chosen zoom the reader requests 'fit', which render.ts resolves per layout: Vertical fits\n * DEFAULT_VERTICAL_BARS bars, Endless uses ENDLESS_STAVE_SCALE, and many staves take min(that, height fit); on compact\n * devices the Vertical result is then raised to minimumDefaultStaveScale (readability wins over fit). The default\n * is re-resolved on every layout (resize, rotation, mode), while a user-chosen zoom stays fixed and is the only one saved.\n */\n","import { isGmSoundfont, type InstrumentId, type Score } from './score';\nimport { STAVE_SCALE_FLOOR, STAVE_SCALE_MAX, type DeviceClass } from './stave-scale';\n\nexport type FileSource = { name: string; size: number; sha256: string; format: string };\nexport type FileSettings = {\n mode: 'portrait' | 'landscape'; notationFont: 'Bravura' | 'Petaluma'; barsPerLine: 'auto' | number;\n overlap: number; names: boolean; chordSymbols: boolean; inferChordSymbols: boolean;\n counts: boolean; subdivisions: boolean; annotationFont: 'Sans' | 'Serif' | 'Mono'; bpm: number; semitones: number; scorePitch: 'written' | 'concert';\n /** Spell the transposed view in the enharmonic key (F# major shown as Gb major); optional on read, default false. */\n keyFlip: boolean;\n};\n/** Saved view: an absolute stave scale and the device class it was chosen on (see stave-scale.ts). */\nexport type ScoreView = { zoom: number; zoomDevice: DeviceClass };\nexport type PartState = { visible: boolean; instrument: InstrumentId; gmSoundfont?: string; volume?: number };\n/** Per-score record (schema: file-state.schema.json). Only settings and hashes, never score content. */\nexport type FileState = {\n version: 2;\n source: FileSource;\n /** Epoch ms of the last time the score was opened; the store keeps the most recent records. */\n lastOpened: number;\n settings: FileSettings;\n parts: Record<string, PartState>;\n view?: ScoreView;\n};\n/** The localStorage v1 record: zoom was a multiplier of the width fit and lived in settings. */\nexport type FileStateV1 = { version: 1; source: FileSource; settings: FileSettings & { zoom: number }; parts: Record<string, PartState> };\n\nexport const MIN_BPM = 30, MAX_BPM = 240;\n/** The reader's BPM control range; saved and source tempos outside it are clamped. */\nexport const clampBpm = (bpm: number) => Math.max(MIN_BPM, Math.min(MAX_BPM, bpm));\n/** The localStorage key of a v1 record; `prefix` is the reader's persist namespace (score-db keyPrefix). */\nexport const legacyStorageKey = (hash: string, prefix = 'scoreflow') => `${prefix}-file-v1:${hash}`;\nconst instruments = new Set<InstrumentId>(['piano', 'guitar', 'bassguitar', 'double-bass', 'drum-kit', 'alto-saxophone', 'tenor-saxophone', 'bari-saxophone', 'flute', 'clarinet', 'trumpet', 'trombone', 'violin', 'viola', 'cello', 'microphone']);\nconst legacyInstruments: Record<string, InstrumentId> = { bass: 'double-bass', drums: 'drum-kit', saxophone: 'alto-saxophone' };\nconst roundConstants = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\nconst rotate = (value: number, shift: number) => (value >>> shift) | (value << (32 - shift));\n\n/**\n * Incremental SHA-256 in plain JavaScript: it works on plain HTTP LAN origins, where Web Crypto's subtle API is\n * absent. Bytes are hashed as they are given (no padded copy of the whole input).\n */\nexport class Sha256 {\n private readonly hash = new Uint32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]);\n private readonly words = new Uint32Array(64);\n private readonly block = new Uint8Array(64);\n private buffered = 0;\n private length = 0;\n update(bytes: Uint8Array): this {\n let offset = 0;\n this.length += bytes.length;\n if (this.buffered) {\n const take = Math.min(64 - this.buffered, bytes.length);\n this.block.set(bytes.subarray(0, take), this.buffered);\n this.buffered += take; offset = take;\n if (this.buffered < 64) return this;\n this.compress(this.block, 0);\n this.buffered = 0;\n }\n for (; offset + 64 <= bytes.length; offset += 64) this.compress(bytes, offset);\n if (offset < bytes.length) { this.block.set(bytes.subarray(offset)); this.buffered = bytes.length - offset; }\n return this;\n }\n hex(): string {\n const tail = new Uint8Array(this.buffered < 56 ? 64 : 128);\n tail.set(this.block.subarray(0, this.buffered));\n tail[this.buffered] = 0x80;\n new DataView(tail.buffer).setBigUint64(tail.length - 8, BigInt(this.length) * 8n);\n for (let offset = 0; offset < tail.length; offset += 64) this.compress(tail, offset);\n return Array.from(this.hash, value => value.toString(16).padStart(8, '0')).join('');\n }\n private compress(bytes: Uint8Array, offset: number): void {\n const { words, hash } = this;\n for (let i = 0; i < 16; i++) { const at = offset + i * 4; words[i] = ((bytes[at] << 24) | (bytes[at + 1] << 16) | (bytes[at + 2] << 8) | bytes[at + 3]) >>> 0; }\n for (let i = 16; i < 64; i++) {\n const x = words[i - 15], y = words[i - 2];\n const sigma0 = rotate(x, 7) ^ rotate(x, 18) ^ (x >>> 3);\n const sigma1 = rotate(y, 17) ^ rotate(y, 19) ^ (y >>> 10);\n words[i] = (words[i - 16] + sigma0 + words[i - 7] + sigma1) >>> 0;\n }\n let [a, b, c, d, e, f, g, h] = hash;\n for (let i = 0; i < 64; i++) {\n const sum1 = rotate(e, 6) ^ rotate(e, 11) ^ rotate(e, 25);\n const choose = (e & f) ^ (~e & g);\n const t1 = (h + sum1 + choose + roundConstants[i] + words[i]) >>> 0;\n const sum0 = rotate(a, 2) ^ rotate(a, 13) ^ rotate(a, 22);\n const majority = (a & b) ^ (a & c) ^ (b & c);\n const t2 = (sum0 + majority) >>> 0;\n h = g; g = f; f = e; e = (d + t1) >>> 0; d = c; c = b; b = a; a = (t1 + t2) >>> 0;\n }\n hash[0] = (hash[0] + a) >>> 0; hash[1] = (hash[1] + b) >>> 0;\n hash[2] = (hash[2] + c) >>> 0; hash[3] = (hash[3] + d) >>> 0;\n hash[4] = (hash[4] + e) >>> 0; hash[5] = (hash[5] + f) >>> 0;\n hash[6] = (hash[6] + g) >>> 0; hash[7] = (hash[7] + h) >>> 0;\n }\n}\n\nexport function sha256Hex(bytes: Uint8Array): string {\n return new Sha256().update(bytes).hex();\n}\n\n/** SHA-256 of `bytes`: Web Crypto when the context has it (secure origins; it runs off the calling thread), else JavaScript. */\nexport async function sha256Digest(bytes: Uint8Array): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (subtle) {\n try {\n const digest = await subtle.digest('SHA-256', bytes as Uint8Array<ArrayBuffer>);\n return Array.from(new Uint8Array(digest), value => value.toString(16).padStart(2, '0')).join('');\n } catch { /* fall back to JavaScript */ }\n }\n return sha256Hex(bytes);\n}\n\n/** Source identity of a file's bytes (the import worker hashes files once, in the worker). */\nexport async function fileSource(file: Pick<File, 'name' | 'size'>, bytes: Uint8Array): Promise<FileSource> {\n return fileSourceFor(file.name, file.size, await sha256Digest(bytes));\n}\nexport const fileSourceFor = (name: string, size: number, sha256: string): FileSource => ({ name, size, sha256, format: name.split('.').pop()?.toLowerCase() || '' });\n/** Source identity for text without a file (the sample, pasted ABC, the musicXml prop): a hash of the text with a format prefix. */\nexport function textSource(format: string, text: string, name: string): FileSource {\n const bytes = new TextEncoder().encode(`${format}:${text}`);\n return { name, size: bytes.length - format.length - 1, sha256: sha256Hex(bytes), format };\n}\n\nconst validZoom = (zoom: unknown): zoom is number => typeof zoom === 'number' && Number.isFinite(zoom) && zoom >= STAVE_SCALE_FLOOR && zoom <= STAVE_SCALE_MAX;\n/** Validate and normalise shared v1/v2 fields in place; false when the record is unusable. */\nfunction validSettingsAndParts(state: { settings: FileSettings; parts: Record<string, PartState> }): boolean {\n const settings = state.settings;\n if (!settings || !state.parts || typeof state.parts !== 'object') return false;\n if (!['portrait', 'landscape'].includes(settings.mode) || !['Bravura', 'Petaluma'].includes(settings.notationFont)) return false;\n if (settings.barsPerLine !== 'auto' && (!Number.isInteger(settings.barsPerLine) || settings.barsPerLine < 1 || settings.barsPerLine > 4)) return false;\n if (!Number.isInteger(settings.overlap) || settings.overlap < 0 || settings.overlap > 3) return false;\n // Out-of-range tempos (e.g. cut-time 160 → 320 quarter BPM) are clamped, not a reason to drop the state.\n if (!Number.isFinite(settings.bpm)) return false;\n settings.bpm = clampBpm(settings.bpm);\n if (settings.semitones !== undefined && (!Number.isInteger(settings.semitones) || Math.abs(settings.semitones) > 12)) return false;\n if (settings.scorePitch !== undefined && !['written', 'concert'].includes(settings.scorePitch)) return false;\n if (settings.keyFlip !== undefined && typeof settings.keyFlip !== 'boolean') return false;\n if (settings.annotationFont !== undefined && !['Sans', 'Serif', 'Mono'].includes(settings.annotationFont)) return false;\n if (['names', 'chordSymbols', 'inferChordSymbols', 'counts', 'subdivisions'].some(key => typeof settings[key as keyof FileSettings] !== 'boolean')) return false;\n Object.values(state.parts).forEach(part => { part.instrument = legacyInstruments[part.instrument] || part.instrument; });\n if (Object.values(state.parts).some(part => typeof part.visible !== 'boolean' || !instruments.has(part.instrument) || (part.gmSoundfont !== undefined && !isGmSoundfont(part.gmSoundfont)) || (part.volume !== undefined && (!Number.isInteger(part.volume) || part.volume < 0 || part.volume > 100)))) return false;\n state.settings = { ...settings, annotationFont: settings.annotationFont ?? 'Sans', semitones: settings.semitones ?? 0, scorePitch: settings.scorePitch ?? 'written', keyFlip: settings.keyFlip ?? false };\n return true;\n}\n\n/** Validate a stored v1 (legacy localStorage) record for `sha256`. */\nexport function parseLegacyFileState(raw: unknown, sha256: string): FileStateV1 | null {\n try {\n const state = (typeof raw === 'string' ? JSON.parse(raw) : raw) as FileStateV1;\n if (!state || state.version !== 1 || state.source?.sha256 !== sha256) return null;\n if (!validZoom(state.settings?.zoom)) return null;\n const zoom = state.settings.zoom;\n if (!validSettingsAndParts(state)) return null;\n state.settings.zoom = zoom;\n return state;\n } catch { return null; }\n}\n\n/**\n * v1 → v2. A v1 zoom multiplied the width fit; for the default single-stave layouts\n * that fit was the baseline scale 1, so a changed v1 zoom carries over as an absolute\n * scale for the current device. The v1 default (1) becomes \"no saved view\".\n */\nexport function migrateFileState(legacy: FileStateV1, device: DeviceClass, lastOpened = Date.now()): FileState {\n const { zoom, ...settings } = legacy.settings;\n return { version: 2, source: legacy.source, lastOpened, settings, parts: legacy.parts, ...(zoom !== 1 ? { view: { zoom, zoomDevice: device } } : {}) };\n}\n\n/** Validate a stored v2 record for `sha256`. */\nexport function parseFileState(raw: unknown, sha256: string): FileState | null {\n try {\n const state = (typeof raw === 'string' ? JSON.parse(raw) : structuredClone(raw)) as FileState;\n if (!state || state.version !== 2 || state.source?.sha256 !== sha256 || !Number.isFinite(state.lastOpened)) return null;\n // An unusable view only loses the saved zoom, not the score's other settings.\n if (state.view !== undefined && (!validZoom(state.view?.zoom) || !['desktop', 'compact'].includes(state.view.zoomDevice))) delete state.view;\n if ('zoom' in (state.settings || {})) delete (state.settings as Partial<FileSettings> & { zoom?: number }).zoom;\n return validSettingsAndParts(state) ? state : null;\n } catch { return null; }\n}\n\n/** Read the legacy localStorage v1 record for a source. */\nexport function readFileState(source: FileSource): FileStateV1 | null {\n try { return parseLegacyFileState(localStorage.getItem(legacyStorageKey(source.sha256)), source.sha256); }\n catch { return null; }\n}\n\nexport function buildFileState(source: FileSource, settings: FileSettings, score: Score, hiddenIds: string[], volumes: Record<string, number> = {}, view?: ScoreView, lastOpened = Date.now()): FileState {\n const hidden = new Set(hiddenIds);\n const parts: FileState['parts'] = {};\n for (const part of score.parts) parts[part.id] = { visible: !hidden.has(part.id), instrument: part.instrument, ...(part.gmSoundfont ? { gmSoundfont: part.gmSoundfont } : {}), volume: volumes[part.id] ?? 100 };\n const { mode, notationFont, barsPerLine, overlap, names, chordSymbols, inferChordSymbols, counts, subdivisions, annotationFont, bpm, semitones, scorePitch, keyFlip } = settings;\n return { version: 2, source, lastOpened, settings: { mode, notationFont, barsPerLine, overlap, names, chordSymbols, inferChordSymbols, counts, subdivisions, annotationFont, bpm: clampBpm(bpm), semitones, scorePitch, keyFlip: !!keyFlip }, parts, ...(view ? { view } : {}) };\n}\n","import { strFromU8, unzipSync } from 'fflate';\nimport { parseXmlTree } from './notation/xml-stream';\n\nconst MB = 1024 * 1024;\n/** Largest score file accepted (MusicXML, MXL, MEI, ABC or MIDI). Orchestral MusicXML routinely runs to tens of MB. */\nexport const MAX_SCORE_FILE_BYTES = 64 * MB;\n/** Uncompressed size limit for an MXL score member; bounds decompression so a small archive cannot inflate without limit. */\nexport const MXL_MAX_SCORE_BYTES = 128 * MB;\nexport const formatMb = (bytes: number) => `${Math.round(bytes / MB * 10) / 10} MB`;\n\n/**\n * Reads the MusicXML member of an MXL archive without inflating anything else:\n * only META-INF/container.xml and the chosen score are decompressed, each with a\n * declared-size bound (fflate never writes past the declared size). DOM-free, so it runs in the import worker.\n */\nexport function extractMxlScore(bytes: Uint8Array): string {\n const entries: { name: string; originalSize: number }[] = [];\n let listing: Record<string, Uint8Array>;\n try {\n listing = unzipSync(bytes, { filter: file => { entries.push({ name: file.name, originalSize: file.originalSize }); return file.name === 'META-INF/container.xml' && file.originalSize <= 1_000_000; } });\n } catch { throw new Error('This MXL archive could not be opened.'); }\n const container = listing['META-INF/container.xml'];\n let path: string | undefined;\n if (container) {\n let declared: string | null | undefined;\n try {\n const root = parseXmlTree(strFromU8(container));\n declared = (root.localName === 'rootfile' ? root : root.descendants().find(el => el.localName === 'rootfile'))?.getAttribute('full-path');\n }\n catch { throw new Error('This MXL archive has an unreadable META-INF/container.xml.'); }\n if (declared) {\n try { path = decodeURIComponent(declared.trim()); } catch { path = declared.trim(); }\n path = path.replace(/^\\.\\//, '');\n if (path.startsWith('/') || path.split(/[\\\\/]/).includes('..')) throw new Error('This MXL archive declares an unsafe score path.');\n // Some writers percent-encode the path, others store it raw; accept either spelling.\n if (!entries.some(entry => entry.name === path) && entries.some(entry => entry.name === declared!.trim())) path = declared.trim();\n }\n }\n const target = path ? entries.find(entry => entry.name === path) : entries.find(entry => /\\.(xml|musicxml)$/i.test(entry.name) && !entry.name.startsWith('META-INF/'));\n if (!target) throw new Error(path ? `This MXL archive does not contain its declared score \"${path}\".` : 'This MXL archive has no MusicXML score.');\n if (!(target.originalSize <= MXL_MAX_SCORE_BYTES)) throw new Error(`The score inside this MXL archive is ${formatMb(target.originalSize)} uncompressed; the limit is ${formatMb(MXL_MAX_SCORE_BYTES)}.`);\n let files: Record<string, Uint8Array>;\n try { files = unzipSync(bytes, { filter: file => file.name === target.name && file.originalSize <= MXL_MAX_SCORE_BYTES }); }\n catch { throw new Error('The score inside this MXL archive could not be decompressed.'); }\n const entry = files[target.name];\n if (!entry || !entry.length) throw new Error('The score inside this MXL archive is empty.');\n return strFromU8(entry);\n}\n","/**\n * Enharmonic spelling policy (docs/specs/transpose-and-spelling.md): key choice by pitch class, the enharmonic key\n * flip, Verovio transposition intervals with quality, and key-relative spelling of notes and chord symbols.\n *\n * Pure: no DOM, no Verovio, type-only imports, so it runs in the worker, the main thread and Node tests alike.\n *\n * Notes in the key signature always keep the signature's spelling (E# in F# major, Cb in Gb major). The note rules\n * (flats-only/sharps-only, E#/B#/Fb/Cb, double accidentals) apply to notes outside the signature.\n */\nimport type { GmFamily, InstrumentId } from './score';\n\nexport type KeyMode = 'major' | 'minor';\nexport type Spelled = { step: string; alter: number };\nexport type SpelledPitch = Spelled & { octave: number };\nexport type SpellingKey = {\n /** Tonic name of this mode, e.g. 'F#' (F# major) or 'D#' (D# minor). */\n tonic: string;\n mode: KeyMode;\n /** Key signature: sharps > 0, flats < 0. */\n fifths: number;\n /** The signature's spelling of each letter, C to B. */\n scale: Spelled[];\n};\n/** 'sharp' parts spell pitch class 1 as C# instead of Db; everything else follows the default table. */\nexport type SpellingProfile = 'neutral' | 'sharp';\nexport type KeyOptions = { family?: SpellingProfile; flip?: boolean };\nexport type SpellContext = {\n /** The spelling the source (or Verovio's interval transposition of it) gives this note. */\n source?: Spelled;\n /** MIDI pitch of the previous and next notes in the same voice, for passing notes and upward resolution. */\n prev?: number;\n next?: number;\n /** True when a transposition or key flip was applied; untransposed source double accidentals are kept. */\n transposed?: boolean;\n};\n\nconst LETTERS = ['C', 'D', 'E', 'F', 'G', 'A', 'B'];\nconst NATURAL_PC: Record<string, number> = { C: 0, D: 2, E: 4, F: 5, G: 7, A: 9, B: 11 };\nconst SHARP_ORDER = 'FCGDAEB';\nconst FLAT_ORDER = 'BEADGCF';\nconst MAJOR_BY_FIFTHS = ['Cb', 'Gb', 'Db', 'Ab', 'Eb', 'Bb', 'F', 'C', 'G', 'D', 'A', 'E', 'B', 'F#', 'C#'];\nconst MINOR_BY_FIFTHS = ['Ab', 'Eb', 'Bb', 'F', 'C', 'G', 'D', 'A', 'E', 'B', 'F#', 'C#', 'G#', 'D#', 'A#'];\n/** Major key signature for each pitch class: the default table, and the sharp-leaning profile's one difference. */\nconst DEFAULT_MAJOR_FIFTHS = [0, -5, 2, -3, 4, -1, 6, 1, -4, 3, -2, 5];\nconst SHARP_MAJOR_FIFTHS = [0, 7, 2, -3, 4, -1, 6, 1, -4, 3, -2, 5];\n\nconst mod = (value: number, base: number) => ((value % base) + base) % base;\nconst accidentalText = (alter: number) => alter > 0 ? '#'.repeat(alter) : 'b'.repeat(-alter);\n\n/** Pitch class of a note name ('F#', 'Bb', 'Cb', 'E♯'). */\nexport function pitchClassOf(name: string): number {\n const match = /^([A-Ga-g])([#♯x𝄪b♭𝄫]*)$/.exec(name.trim());\n if (!match) throw new Error(`Not a note name: ${name}`);\n return mod(NATURAL_PC[match[1].toUpperCase()] + alterOf(match[2]), 12);\n}\nfunction alterOf(accidentals: string): number {\n let alter = 0;\n for (const char of accidentals) alter += char === '#' || char === '♯' ? 1 : char === 'x' || char === '𝄪' ? 2 : char === '𝄫' ? -2 : -1;\n return alter;\n}\n\nfunction signatureAlter(step: string, fifths: number): number {\n const order = fifths > 0 ? SHARP_ORDER : FLAT_ORDER;\n const index = order.indexOf(step);\n const count = index < Math.abs(fifths) ? Math.floor((Math.abs(fifths) - 1 - index) / 7) + 1 : 0;\n return fifths > 0 ? count : -count;\n}\n\n/** The key with this signature and mode (fifths within -7..7 for named tonics). */\nexport function keyFromFifths(fifths: number, mode: KeyMode = 'major'): SpellingKey {\n const names = mode === 'minor' ? MINOR_BY_FIFTHS : MAJOR_BY_FIFTHS;\n const tonic = names[fifths + 7];\n if (!tonic) throw new Error(`No key with ${fifths} fifths`);\n return { tonic, mode, fifths, scale: LETTERS.map(step => ({ step, alter: signatureAlter(step, fifths) })) };\n}\n\n/** The key with this tonic name and mode ('Gb' major, 'D#' minor). */\nexport function keyFromTonic(tonic: string, mode: KeyMode = 'major'): SpellingKey {\n const normalized = tonic.replace('♯', '#').replace('♭', 'b');\n const index = (mode === 'minor' ? MINOR_BY_FIFTHS : MAJOR_BY_FIFTHS).indexOf(normalized.charAt(0).toUpperCase() + normalized.slice(1));\n if (index < 0) throw new Error(`No ${mode} key on ${tonic}`);\n return keyFromFifths(index - 7, mode);\n}\n\n/** Pitch class of the key's relative major tonic. */\nconst majorPitchClass = (key: SpellingKey) => mod(pitchClassOf(key.tonic) + (key.mode === 'minor' ? 3 : 0), 12);\n\n/**\n * The enharmonic equivalent of a key (Db <-> C#, F# <-> Gb, B <-> Cb, and their relative minors), or null when the\n * other spelling would need more than 7 accidentals. Never offers the table's parenthesized keys.\n */\nexport function enharmonicFlip(key: SpellingKey): SpellingKey | null {\n const other = key.fifths > 0 ? key.fifths - 12 : key.fifths < 0 ? key.fifths + 12 : null;\n return other === null || Math.abs(other) > 7 ? null : keyFromFifths(other, key.mode);\n}\n\n/**\n * The key for a tonic pitch class (0 = C). A minor key takes its relative major's choice from the table, so ties\n * (Eb minor vs D# minor) follow the major-key preference. `flip` swaps to the enharmonic equivalent when one exists.\n */\nexport function chooseKey(pitchClass: number, mode: KeyMode = 'major', options: KeyOptions = {}): SpellingKey {\n const majorPc = mod(pitchClass + (mode === 'minor' ? 3 : 0), 12);\n const key = keyFromFifths((options.family === 'sharp' ? SHARP_MAJOR_FIFTHS : DEFAULT_MAJOR_FIFTHS)[majorPc], mode);\n return options.flip ? enharmonicFlip(key) ?? key : key;\n}\n\n/**\n * The interval Verovio's `transpose` option takes to move `from` to `to` by `semitones` (signed, any size): a\n * direction, a quality (P, M, m, A, d, AA, dd) and a number, e.g. C->F# up '+A4', C->Gb up '+d5', C->F# down '-d5',\n * +12 '+P8', Db->C# '-d2'. Empty when nothing moves.\n */\nexport function transposeInterval(from: string, to: string, semitones: number): string {\n const delta = mod(LETTERS.indexOf(to.charAt(0).toUpperCase()) - LETTERS.indexOf(from.charAt(0).toUpperCase()), 7);\n // Letter steps in the direction of travel, the octave count chosen to match the semitone size.\n const up = mod(-delta, 7);\n const steps = semitones > 0 ? delta + 7 * Math.max(0, Math.round((semitones * 7 / 12 - delta) / 7))\n : semitones < 0 ? -(up + 7 * Math.max(0, Math.round((-semitones * 7 / 12 - up) / 7)))\n : delta <= 3 ? delta : delta - 7;\n if (!semitones && !steps) return '';\n const size = Math.abs(semitones);\n const number = Math.abs(steps) + 1;\n const simple = Math.abs(steps) % 7;\n const reference = [0, 2, 4, 5, 7, 9, 11][simple] + 12 * Math.floor(Math.abs(steps) / 7);\n const perfect = simple === 0 || simple === 3 || simple === 4;\n const difference = size - reference;\n const quality = perfect\n ? ({ '-2': 'dd', '-1': 'd', 0: 'P', 1: 'A', 2: 'AA' } as Record<string, string>)[difference]\n : ({ '-3': 'dd', '-2': 'd', '-1': 'm', 0: 'M', 1: 'A', 2: 'AA' } as Record<string, string>)[difference];\n if (!quality) throw new Error(`No interval from ${from} to ${to} in ${semitones} semitones`);\n return `${semitones < 0 || (!semitones && steps < 0) ? '-' : '+'}${quality}${number}`;\n}\n\n/**\n * The target key and Verovio interval for transposing a source key by `semitones`, with the key flip and the part's\n * spelling profile. With no transposition and no flip the source key is kept as written (and the interval is empty).\n */\nexport function planTranspose(source: SpellingKey, semitones: number, options: KeyOptions = {}): { key: SpellingKey; interval: string } {\n const base = semitones ? chooseKey(mod(pitchClassOf(source.tonic) + semitones, 12), source.mode, { family: options.family }) : source;\n const key = options.flip ? enharmonicFlip(base) ?? base : base;\n return { key, interval: transposeInterval(source.tonic, key.tonic, semitones) };\n}\n\nfunction withOctave(midi: number, spelled: Spelled): SpelledPitch {\n return { ...spelled, octave: Math.round((midi - NATURAL_PC[spelled.step] - spelled.alter) / 12) - 1 };\n}\nconst spells = (midi: number, spelled: Spelled) => mod(NATURAL_PC[spelled.step] + spelled.alter, 12) === mod(midi, 12);\nconst letterIndex = (step: string) => LETTERS.indexOf(step);\n\n/** The note one letter above (+1) or below (-1) `step`, in diatonic distance from `neighbour`'s spelling. */\nfunction letterStep(from: string, neighbour: Spelled): number {\n const distance = mod(letterIndex(neighbour.step) - letterIndex(from), 7);\n return distance === 1 ? 1 : distance === 6 ? -1 : 0;\n}\n\n/**\n * Key-relative spelling of a MIDI pitch.\n * 1. A double accidental the source wrote is kept when nothing was transposed; otherwise doubles are respelled.\n * 2. Notes in the key signature keep its spelling.\n * 3. A minor key's raised 6th and 7th take the signature's letter raised (B# in C# minor, E# in F# minor), unless\n * that would be a double sharp (F## in G# minor is G). Chromatic notes resolving upward a step keep the source\n * spelling, except E#/B# (F and C) and Fb/Cb (rule 4).\n * 4. Otherwise flat keys use flats and naturals, sharp keys sharps and naturals, and C major / A minor the key table\n * (Db Eb F# Ab Bb). E and B are never Fb/Cb, except a stepwise passing note in a key with 6 or more flats.\n */\nexport function spellPitch(midi: number, key: SpellingKey, context: SpellContext = {}): SpelledPitch {\n const pc = mod(midi, 12);\n const source = context.source && spells(pc, context.source) ? context.source : undefined;\n if (source && Math.abs(source.alter) === 2 && !context.transposed) return withOctave(midi, source);\n const diatonic = key.scale.find(note => spells(pc, note));\n if (diatonic) return withOctave(midi, diatonic);\n // A source spelling kept for an upward resolution is never a double accidental, E#/B# or Fb/Cb (those follow rule 4).\n const allowed = (spelled: Spelled) => Math.abs(spelled.alter) <= 1 && !['E1', 'B1', 'F-1', 'C-1'].includes(spelled.step + spelled.alter);\n // Minor raised 6th and 7th: the signature's letter, one semitone higher.\n if (key.mode === 'minor') {\n const tonic = letterIndex(key.tonic.charAt(0));\n for (const degree of [5, 6]) {\n const letter = key.scale[(tonic + degree) % 7];\n const raised = { step: letter.step, alter: letter.alter + 1 };\n // Exempt from E#->F and B#->C (B# in C# minor), but never a double sharp (F## in G# minor falls through to G).\n if (spells(pc, raised) && Math.abs(raised.alter) <= 1) return withOctave(midi, raised);\n }\n }\n if (source && allowed(source) && context.next !== undefined && context.next - midi >= 1 && context.next - midi <= 2) return withOctave(midi, source);\n const white = Object.entries(NATURAL_PC).find(([, value]) => value === pc)?.[0];\n if (white) {\n // Fb (pc 4) and Cb (pc 11) as a passing note between letters on either side, in keys with 6+ flats.\n const flatSpelling = { step: LETTERS[(letterIndex(white) + 1) % 7], alter: -1 };\n if ((white === 'E' || white === 'B') && key.fifths <= -6 && context.prev !== undefined && context.next !== undefined) {\n const prev = spellPitch(context.prev, key), next = spellPitch(context.next, key);\n const sides = [letterStep(flatSpelling.step, prev), letterStep(flatSpelling.step, next)];\n if (sides.includes(1) && sides.includes(-1)) return withOctave(midi, flatSpelling);\n }\n return withOctave(midi, { step: white, alter: 0 });\n }\n const sharp = { step: LETTERS.find(step => NATURAL_PC[step] === pc - 1)!, alter: 1 };\n const flat = { step: LETTERS.find(step => NATURAL_PC[step] === pc + 1)!, alter: -1 };\n if (key.fifths > 0) return withOctave(midi, sharp);\n if (key.fifths < 0) return withOctave(midi, flat);\n return withOctave(midi, pc === 6 ? sharp : flat);\n}\n\n/** Respell a chord symbol's root and slash bass for a key ('A#m7' in F -> 'Bbm7'); suffix text is unchanged. */\nexport function spellChordSymbol(symbol: string, key: SpellingKey): string {\n const root = /^([A-G])([#♯b♭x𝄪𝄫]*)(.*)$/s.exec(symbol);\n if (!root) return symbol;\n const unicode = /[♯♭]/.test(symbol);\n const name = (step: string, accidentals: string) => {\n const spelled = spellPitch(60 + NATURAL_PC[step] + alterOf(accidentals), key);\n const text = accidentalText(spelled.alter);\n return spelled.step + (unicode ? text.replace(/#/g, '♯').replace(/b/g, '♭') : text);\n };\n const suffix = root[3].replace(/\\/([A-G])([#♯b♭x𝄪𝄫]*)/g, (_, step: string, accidentals: string) => `/${name(step, accidentals)}`);\n return name(root[1], root[2]) + suffix;\n}\n\n/** Spelling profile per GM family (gm-soundfont-manifest.json `family`). Strings and guitars lean sharp. */\nexport const INSTRUMENT_SPELLING: Record<GmFamily, SpellingProfile> = {\n Keyboard: 'neutral', Guitar: 'sharp', Voice: 'neutral', Percussion: 'neutral', Drums: 'neutral',\n Woodwinds: 'neutral', Brass: 'neutral', Strings: 'sharp', 'FX / Other': 'neutral',\n};\n/** GM family of each instrument id, for parts without a GM program (the manifest files basses under Strings). */\nexport const INSTRUMENT_FAMILY: Record<InstrumentId, GmFamily> = {\n piano: 'Keyboard', guitar: 'Guitar', bassguitar: 'Strings', 'double-bass': 'Strings', 'drum-kit': 'Drums',\n 'alto-saxophone': 'Woodwinds', 'tenor-saxophone': 'Woodwinds', 'bari-saxophone': 'Woodwinds', flute: 'Woodwinds', clarinet: 'Woodwinds',\n trumpet: 'Brass', trombone: 'Brass', violin: 'Strings', viola: 'Strings', cello: 'Strings', microphone: 'Voice',\n};\n/**\n * A part's spelling profile. Pass `family` when the part has a GM program (`GM_SOUNDS.find(s => s.program ===\n * part.gmProgram)?.family`); otherwise the instrument id decides.\n */\nexport function spellingProfileFor(part: { instrument: InstrumentId; family?: GmFamily }): SpellingProfile {\n return INSTRUMENT_SPELLING[part.family ?? INSTRUMENT_FAMILY[part.instrument]] ?? 'neutral';\n}\n","/**\n * Key choice and note respelling for a transposed or key-flipped view (docs/specs/transpose-and-spelling.md), shared\n * by the Verovio worker's view MEI pass (`mei-spelling.ts`) and the Score view (`transpose.ts` `scoreForView`), so\n * note-name labels spell exactly like the engraved noteheads.\n *\n * Pure: no DOM, no Verovio.\n */\nimport { chooseKey, enharmonicFlip, keyFromFifths, spellPitch, type KeyMode, type Spelled, type SpelledPitch, type SpellingKey, type SpellingProfile } from '../spelling';\n\nexport type Interval = { diatonic: number; chromatic: number };\n\nconst LETTERS = ['C', 'D', 'E', 'F', 'G', 'A', 'B'];\nconst NATURAL_PC = [0, 2, 4, 5, 7, 9, 11];\nconst mod = (value: number, base: number) => ((value % base) + base) % base;\n\n/** A Verovio interval string ('+A4', '-d5', '+P8', '') as letter steps and semitones. */\nexport function parseInterval(text: string): Interval {\n const match = /^([+-]?)(dd|d|m|M|P|A|AA)(\\d+)$/.exec(text.trim());\n if (!match) return { diatonic: 0, chromatic: 0 };\n const steps = Number(match[3]) - 1;\n const simple = steps % 7;\n const reference = NATURAL_PC[simple] + 12 * Math.floor(steps / 7);\n const perfect = simple === 0 || simple === 3 || simple === 4;\n const offset = (perfect ? { dd: -2, d: -1, P: 0, A: 1, AA: 2 } : { dd: -3, d: -2, m: -1, M: 0, A: 1, AA: 2 } as Record<string, number>)[match[2] as 'd'] ?? 0;\n const sign = match[1] === '-' ? -1 : 1;\n return { diatonic: sign * steps, chromatic: sign * (reference + offset) };\n}\n\n/** How many fifths an interval moves a key signature (M2 = +2, A4 = +6, d5 = -6, P8 = 0). */\nexport const intervalFifths = ({ diatonic, chromatic }: Interval) => 7 * chromatic - 12 * diatonic;\n\n/** A spelled pitch moved by an interval, keeping its letter relationship (Verovio's interval transposition). */\nexport function transposeSpelled(pitch: SpelledPitch, interval: Interval): SpelledPitch {\n if (!interval.diatonic && !interval.chromatic) return pitch;\n const index = LETTERS.indexOf(pitch.step) + interval.diatonic;\n const step = LETTERS[mod(index, 7)];\n const octave = pitch.octave + Math.floor(index / 7);\n const midi = midiOf(pitch) + interval.chromatic;\n return { step, octave, alter: midi - midiOf({ step, octave, alter: 0 }) };\n}\n\nexport const midiOf = (pitch: SpelledPitch) => (pitch.octave + 1) * 12 + NATURAL_PC[LETTERS.indexOf(pitch.step)] + pitch.alter;\n\n/** MEI key signature value ('3s', '2f', '0') as fifths; null when absent or not a plain count. */\nexport function fifthsOf(sig: string | null | undefined): number | null {\n if (sig === null || sig === undefined) return null;\n const match = /^\\s*(\\d+)\\s*([sf]?)\\s*$/.exec(sig);\n if (!match) return null;\n const count = Number(match[1]);\n return match[2] === 'f' ? -count : count;\n}\nexport const sigOf = (fifths: number) => fifths > 0 ? `${fifths}s` : fifths < 0 ? `${-fifths}f` : '0';\n\n/** Fifths folded into -7..7 (a key past 7 accidentals has an enharmonic within it). */\nexport const foldFifths = (fifths: number) => {\n let value = fifths;\n while (value > 7) value -= 12;\n while (value < -7) value += 12;\n return value;\n};\n\nexport type StaffSpelling = {\n /** Spelling profile of the staff's part ('neutral' in the concert view, where one global key applies). */\n profile: SpellingProfile;\n /** The staff's pitch moves in this view (a transposition, or a transposing part shown at concert pitch). */\n moved: boolean;\n};\n\n/**\n * The key a staff shows. `fifths` is the staff's key in this view before the global transposition and flip (the\n * source key, or its sounding key for a transposing part in the concert view). Transposed, a staff takes the key\n * table's choice for its pitch class (with the part's profile and the flip). Untransposed, it keeps that key (a\n * sounding key past 7 accidentals folded to its enharmonic, Fb -> E), or its enharmonic equivalent when flipped, so\n * a concert view shows a B♭ trumpet in the same key as the concert-pitch parts beside it.\n */\nexport function viewKey(fifths: number, semitones: number, mode: KeyMode, staff: StaffSpelling, flip: boolean): SpellingKey {\n if (semitones === 0) {\n const source = keyFromFifths(foldFifths(fifths), mode);\n return flip ? enharmonicFlip(source) ?? source : source;\n }\n const majorPc = mod(7 * (fifths + 7 * semitones), 12);\n return chooseKey(mod(majorPc - (mode === 'minor' ? 3 : 0), 12), mode, { family: staff.profile, flip });\n}\n\nexport type LineNote = {\n /** Sounding (view) MIDI pitch. */\n midi: number;\n /** The spelling the source gives it after the view's interval transposition. */\n source: SpelledPitch;\n key: SpellingKey;\n /** Part of a chord: chord tones are neither passing notes nor resolutions, so they get no neighbours. */\n chord: boolean;\n /** Index (into the same line) of the note this one is tied from; it takes that note's spelling. */\n tiedFrom?: number;\n};\n\n/** Key-relative spelling of one voice's notes in order, with neighbours for passing notes and upward resolutions. */\nexport function respellLine(notes: LineNote[]): SpelledPitch[] {\n const out: SpelledPitch[] = [];\n notes.forEach((note, index) => {\n if (note.tiedFrom !== undefined && out[note.tiedFrom] && midiOf(out[note.tiedFrom]) === note.midi) { out.push(out[note.tiedFrom]); return; }\n const single = (other?: LineNote) => other && !other.chord && !note.chord ? other.midi : undefined;\n out.push(spellPitch(note.midi, note.key, { source: note.source, prev: single(notes[index - 1]), next: single(notes[index + 1]), transposed: true }));\n });\n return out;\n}\n\n/** The key signature's alteration of a letter. */\nexport const signatureAlter = (key: SpellingKey, step: string) => key.scale[LETTERS.indexOf(step)]?.alter ?? 0;\n\nexport type DisplayNote = { pitch: SpelledPitch; onset: number; key: SpellingKey;\n /** Continuation of a tie: never shows an accidental and does not change the measure's accidentals. */\n tieEnd?: boolean;\n /** A cautionary or editorial accidental the source asked for: always shown. */\n cautionary?: boolean };\n\n/**\n * Which notes of one staff-measure show their accidental: a note shows one when its alteration differs from the\n * accidental in force on its line and octave (the key signature, or an earlier accidental in the measure). Notes\n * at the same onset are judged against what was in force before that onset.\n */\nexport function accidentalDisplay(notes: DisplayNote[]): boolean[] {\n const shown: boolean[] = new Array(notes.length).fill(false);\n const order = notes.map((_, index) => index).sort((a, b) => notes[a].onset - notes[b].onset || a - b);\n const state = new Map<string, number>();\n for (let start = 0; start < order.length;) {\n let end = start;\n while (end < order.length && Math.abs(notes[order[end]].onset - notes[order[start]].onset) < 1e-6) end++;\n const updates: [string, number][] = [];\n for (const index of order.slice(start, end)) {\n const { pitch, key, tieEnd, cautionary } = notes[index];\n const line = `${pitch.step}${pitch.octave}`;\n const inForce = state.get(line) ?? signatureAlter(key, pitch.step);\n if (tieEnd) continue;\n if (pitch.alter !== inForce || cautionary) { shown[index] = true; updates.push([line, pitch.alter]); }\n }\n for (const [line, alter] of updates) state.set(line, alter);\n start = end;\n }\n return shown;\n}\n\nconst NAME = /^([A-G])([#♯b♭x𝄪𝄫]*)/;\nconst alterOfText = (text: string) => [...text].reduce((sum, char) => sum + (char === '#' || char === '♯' ? 1 : char === 'x' || char === '𝄪' ? 2 : char === '𝄫' ? -2 : -1), 0);\n/** A chord symbol's root and slash bass moved by intervals (their spelling is then set by `spellChordSymbol`). */\nexport function moveChordSymbol(symbol: string, intervals: Interval[]): string {\n const move = (step: string, accidentals: string) => {\n const moved = intervals.reduce((current, interval) => transposeSpelled(current, interval), { step, alter: alterOfText(accidentals), octave: 4 });\n return moved.step + (moved.alter > 0 ? '#'.repeat(moved.alter) : 'b'.repeat(-moved.alter));\n };\n const root = NAME.exec(symbol);\n if (!root) return symbol;\n const rest = symbol.slice(root[0].length).replace(/\\/([A-G])([#♯b♭x𝄪𝄫]*)/g, (_, step: string, accidentals: string) => `/${move(step, accidentals)}`);\n return move(root[1], root[2]) + rest;\n}\n\nexport type { Spelled, SpelledPitch, SpellingKey };\n","import { GM_SOUNDS, pitch, type KeyMode, type Measure, type Part, type Pitch, type Score, type Transposition } from './score';\nimport { enharmonicFlip, keyFromFifths, spellChordSymbol, transposeInterval, spellingProfileFor, type SpellingKey, type SpellingProfile } from './spelling';\nimport type { SpellingSpec } from './notation/mei-spelling';\nimport { foldFifths, intervalFifths, moveChordSymbol, parseInterval, respellLine, transposeSpelled, viewKey, type Interval, type LineNote } from './notation/respell';\n\nexport type ScorePitchView = 'written' | 'concert';\n\n/**\n * How a Score view was transposed and spelled (set by `scoreForView`); the renderer hands the same plan to the Verovio\n * worker (`spellingSpecFor`), so the engraving and the Score's note names agree.\n */\nexport type PitchView = {\n view: ScorePitchView;\n semitones: number;\n flip: boolean;\n /** The Verovio interval with quality for the transposition (spelling.ts `planTranspose`). */\n interval: string;\n /** Part ids whose pitch the view itself moves (transposing parts at concert pitch). */\n viewMoved: string[];\n /** The Score this view was made from. */\n source: Score;\n};\n\nexport function transposeKey(fifths: number, semitones: number): number {\n if (!semitones) return fifths;\n const next = fifths + semitones * 7;\n return ((next + 6) % 12 + 12) % 12 - 6;\n}\n\nfunction sourceTransposition(part: Part, measure: Measure | undefined): Transposition {\n return measure?.transposition || part.transposition || { semitones: 0 };\n}\n\nexport function soundingMidi(part: Part, measure: Measure, note: Pitch, semitones: number): number {\n if (part.clef === 'percussion') return note.midi;\n return note.midi + semitones + (part.pitchBasis === 'concert' ? 0 : sourceTransposition(part, measure).semitones);\n}\n\n/** The interval a view moves a measure of a part by: written to sounding pitch in the concert view, else none. */\nfunction viewInterval(part: Part, measure: Measure | undefined, view: ScorePitchView): Interval {\n const transposition = sourceTransposition(part, measure);\n if (!transposition.semitones || part.pitchBasis === 'concert' || view !== 'concert') return { diatonic: 0, chromatic: 0 };\n return { diatonic: transposition.diatonic ?? Math.round(transposition.semitones * 7 / 12), chromatic: transposition.semitones };\n}\nconst movedByView = (part: Part, view: ScorePitchView) => part.clef !== 'percussion' && (part.measures.length ? part.measures : [undefined]).some(measure => viewInterval(part, measure, view).chromatic !== 0);\n\n/** A part's spelling profile in a view: its instrument's in the written view; one global (neutral) key at concert pitch. */\nexport function viewProfile(part: Part, view: ScorePitchView): SpellingProfile {\n if (view === 'concert') return 'neutral';\n return spellingProfileFor({ instrument: part.instrument, family: GM_SOUNDS.find(sound => sound.program !== null && sound.program === part.gmProgram)?.family });\n}\n\nconst sameMidi = (a: Pitch, midi: number) => a.midi === midi;\n/**\n * A Score as a view shows it: written or concert pitch, transposed by `semitones` and optionally spelled in the\n * enharmonic key. Spelling follows docs/specs/transpose-and-spelling.md through the same plan the Verovio worker uses\n * (notation/respell.ts), so note names match the engraved noteheads. Percussion is never moved.\n */\nexport function scoreForView(score: Score, view: ScorePitchView, semitones: number, flip = false): Score {\n const viewMoved = score.parts.filter(part => movedByView(part, view)).map(part => part.id);\n if (!semitones && !flip && !viewMoved.length) return score;\n // A flip only applies while the reference key has an enharmonic equivalent (or the score is transposed).\n if (flip && !semitones && !enharmonicFlip(referencePlan(score, view, 0, false).source)) flip = false;\n if (!semitones && !flip && !viewMoved.length) return score;\n const { source, key: target } = referencePlan(score, view, semitones, flip);\n const interval = transposeInterval(source.tonic, target.tonic, semitones);\n const global = parseInterval(interval);\n const pitchView: PitchView = { view, semitones, flip, interval, viewMoved, source: score };\n return { ...score, pitchView, parts: score.parts.map(part => {\n const moved = viewMoved.includes(part.id);\n if (part.clef === 'percussion' || (!moved && !semitones && !flip && !interval)) return part;\n const staff = { profile: viewProfile(part, view), moved };\n // Keys per measure, then every voice respelled as one line across measures.\n const measureKeys = part.measures.map(measure => {\n const shift = viewInterval(part, measure, view);\n return viewKey((measure.key ?? part.key ?? score.key) + intervalFifths(shift), semitones, measure.keyMode ?? part.keyMode ?? score.keyMode ?? 'major', staff, flip);\n });\n const lines = new Map<string, { measure: number; note: number; pitch: number; input: LineNote }[]>();\n part.measures.forEach((measure, measureIndex) => {\n const shift = viewInterval(part, measure, view);\n const order = measure.notes.map((note, index) => ({ note, index })).sort((a, b) => a.note.start - b.note.start);\n for (const { note, index } of order) {\n if (note.rest || !note.pitches.length) continue;\n const line = lines.get(note.voice || '1') ?? lines.set(note.voice || '1', []).get(note.voice || '1')!;\n note.pitches.forEach((source, pitchIndex) => {\n if (source.unpitched) return;\n const spelled = transposeSpelled(transposeSpelled({ step: source.step, alter: source.alter, octave: source.octave }, shift), global);\n const midi = source.midi + shift.chromatic + semitones;\n let tiedFrom: number | undefined;\n if (source.tieStop || note.tieStop) for (let back = line.length - 1; back >= 0 && back >= line.length - 8; back--) {\n const previous = part.measures[line[back].measure].notes[line[back].note].pitches[line[back].pitch];\n if (sameMidi({ ...previous, midi: line[back].input.midi }, midi) && (previous.tieStart || part.measures[line[back].measure].notes[line[back].note].tieStart)) { tiedFrom = back; break; }\n }\n line.push({ measure: measureIndex, note: index, pitch: pitchIndex, input: { midi, source: spelled, key: measureKeys[measureIndex], chord: note.pitches.length > 1, tiedFrom } });\n });\n }\n });\n const spelled = new Map<string, Pitch>();\n for (const line of lines.values()) {\n respellLine(line.map(entry => entry.input)).forEach((result, index) => {\n const entry = line[index];\n spelled.set(`${entry.measure}|${entry.note}|${entry.pitch}`, pitch(result.step, result.octave, result.alter));\n });\n }\n const measures = part.measures.map((measure, measureIndex) => {\n const key = measureKeys[measureIndex];\n const intervals = [viewInterval(part, measure, view), global];\n return { ...measure, key: key.fifths, keyMode: key.mode, notes: measure.notes.map((note, noteIndex) => ({\n ...note,\n pitches: note.pitches.map((source, pitchIndex) => {\n const result = spelled.get(`${measureIndex}|${noteIndex}|${pitchIndex}`);\n return result ? { ...source, ...result, accidental: undefined, cautionary: undefined } : source;\n }),\n chordSymbol: note.chordSymbol ? spellChordSymbol(moveChordSymbol(note.chordSymbol, intervals), key) : undefined,\n })) };\n });\n return { ...part, key: measures[0]?.key ?? part.key, keyMode: measures[0]?.keyMode ?? part.keyMode, measures };\n }) };\n}\n\n/**\n * The worker's spelling plan for a Score view (`scoreForView`'s result) with its staff numbers: the same interval,\n * flip, per-staff profiles and moved staves, and which staves are percussion (never given a key signature).\n */\nexport function spellingSpecFor(score: Score, staffOf: Map<string, string>): SpellingSpec {\n const pitchView = score.pitchView;\n const view = pitchView?.view ?? 'written';\n const staves: SpellingSpec['staves'] = {};\n for (const part of score.parts) {\n const n = staffOf.get(part.id);\n if (!n) continue;\n if (part.clef === 'percussion') { staves[n] = { profile: 'neutral', moved: false, percussion: true }; continue; }\n // The part's keys in this view before the transposition (its written keys, or sounding keys at concert pitch).\n const source = pitchView?.source.parts.find(item => item.id === part.id) ?? part;\n const keys: [number, number, KeyMode][] = [];\n source.measures.forEach((measure, index) => {\n const fifths = (measure.key ?? source.key ?? score.key) + intervalFifths(viewInterval(source, measure, view));\n const mode = measure.keyMode ?? source.keyMode ?? score.keyMode ?? 'major';\n const last = keys.at(-1);\n if (!last || last[1] !== fifths || last[2] !== mode) keys.push([index, fifths, mode]);\n });\n const moved = !!pitchView?.viewMoved.includes(part.id);\n const shift = moved ? viewInterval(source, source.measures[0], view) : undefined;\n staves[n] = { profile: viewProfile(part, view), moved, ...(keys.length ? { keys } : {}), ...(shift?.chromatic ? { shift: [shift.diatonic, shift.chromatic] as [number, number] } : {}) };\n }\n return { interval: pitchView?.interval ?? '', semitones: pitchView?.semitones ?? 0, concert: !!pitchView?.viewMoved.length, flip: !!pitchView?.flip, staves };\n}\n\n/** The key of a measure in a (view) Score, for app-side pitch text such as inferred chord symbols. */\nexport function measureKey(part: Part, measure: Measure, score: Score): SpellingKey {\n return keyFromFifths(foldFifths(measure.key ?? part.key ?? score.key), measure.keyMode ?? part.keyMode ?? score.keyMode ?? 'major');\n}\n\nexport type TransposeReadout = {\n /** The reference key shown (the first pitched part's key in this view after transposition and flip). */\n key: SpellingKey;\n /** The enharmonic key the flip button would switch to, or null when the key has none (button disabled). */\n flipTo: SpellingKey | null;\n /** Header readout, e.g. \"+2 · D\", \"0 · C\", \"-3 · Am\". */\n text: string;\n};\n\n/**\n * The reference key of a score view: the first pitched part's opening key in the view before transposition (`source`,\n * folded into -7..7) and the key it is shown in after the transposition and flip (`key`, as that staff is engraved).\n */\nexport function referencePlan(score: Score, view: ScorePitchView, semitones: number, flip: boolean): { source: SpellingKey; key: SpellingKey } {\n const part = score.parts.find(item => item.clef !== 'percussion');\n const first = part?.measures[0];\n const fifths = (first?.key ?? part?.key ?? score.key) + (part ? intervalFifths(viewInterval(part, first, view)) : 0);\n const mode = first?.keyMode ?? part?.keyMode ?? score.keyMode ?? 'major';\n const staff = { profile: part ? viewProfile(part, view) : 'neutral' as SpellingProfile, moved: !!part && movedByView(part, view) };\n return { source: keyFromFifths(foldFifths(fifths), mode), key: viewKey(fifths, semitones, mode, staff, flip) };\n}\n\n/** Header/drawer readout for a transposition and key flip (\"+2 · D\") and the key the flip offers. */\nexport function transposeReadout(score: Score, view: ScorePitchView, semitones: number, flip: boolean): TransposeReadout {\n const { key } = referencePlan(score, view, semitones, flip);\n const name = (item: SpellingKey) => `${item.tonic}${item.mode === 'minor' ? 'm' : ''}`;\n return { key, flipTo: enharmonicFlip(key), text: `${semitones > 0 ? '+' : ''}${semitones} · ${name(key)}` };\n}\n\n/** Spoken key name for labels: 'G flat major', 'D sharp minor'. */\nexport function spokenKey(key: SpellingKey): string {\n const accidental = key.tonic.slice(1) === '#' ? ' sharp' : key.tonic.slice(1) === 'b' ? ' flat' : '';\n return `${key.tonic.charAt(0)}${accidental} ${key.mode}`;\n}\n","import { readPlaybackMarks } from '../notation/musicxml-source';\n\n/**\n * Playback marks read from MusicXML source text: per-note articulation/fermata/cue marks and damper pedal changes.\n * The timeline consumes only this DOM-free shape, so it can be built in a worker. The import worker reads them in its\n * single pass over the source; other callers read them here with the same streaming reader.\n */\nexport type NoteMark = { durationScale: number; velocityDelta: number; fermata: boolean; silent: boolean };\nexport type PedalChange = { measureIndex: number; beat: number; kind: 'down' | 'up' | 'change' };\nexport type PlaybackMarks = { marks: Map<string, NoteMark>; markDiagnostics: string[]; pedals: Map<string, PedalChange[]>; pedalDiagnostics: string[] };\n\nexport const emptyPlaybackMarks = (): PlaybackMarks => ({ marks: new Map(), markDiagnostics: [], pedals: new Map(), pedalDiagnostics: [] });\n\n/** Marks of a MusicXML text (partwise or timewise); empty when there is none or it is not well-formed XML. */\nexport function musicXmlPlaybackMarks(xml: string | undefined): PlaybackMarks {\n return readPlaybackMarks(xml);\n}\n","import type { MeasureNavigation, Score } from '../score';\nimport { addFraction, compareFraction, formatFraction, fractionValue, fromNumber, parseFraction, ZERO, type Fraction } from './fraction';\n\n/**\n * A position in the written score: a measure index (not its printed number)\n * and an exact rational quarter-note offset from that measure's start.\n */\nexport type RoadmapPos = { bar: number; beat: string };\n/** One linear stretch of the written score, played from `from` up to (not including) `to`. */\nexport type RoadmapSegment = { from: RoadmapPos; to: RoadmapPos; ending?: number; pass?: number };\n/** The performed order of the written score. JSON-serializable, so a user or saved override can replace it. */\nexport type Roadmap = { version: 1; segments: RoadmapSegment[] };\n\n/** Caps for user-supplied roadmaps, so a malformed override cannot run away. */\nexport const ROADMAP_MAX_SEGMENTS = 2048;\nconst ROADMAP_MAX_REPLAY = 64;\n\n/** A span of one measure between navigation points; repeat barlines inside a bar split it. */\ntype Unit = {\n bar: number; from: Fraction; to: Fraction;\n repeatStart?: boolean; repeatEnd?: number; repeatInferred?: boolean; endings?: number[];\n segno?: boolean; coda?: boolean; toCoda?: boolean; daCapo?: boolean; dalSegno?: boolean; fine?: boolean;\n};\n\nexport function measureLengths(score: Score): Fraction[] {\n return (score.parts[0]?.measures || []).map(measure => {\n const beats = Number.isFinite(measure.beats) && measure.beats > 0 ? measure.beats : measure.notes.reduce((max, note) => Math.max(max, note.start + note.duration), 0);\n return fromNumber(Math.max(0, beats));\n });\n}\n\ntype Cut = { at: Fraction; start?: boolean; end?: number; inferred?: boolean };\n\n/**\n * Barline repeats recorded at a measure edge belong to the neighbouring\n * barline: a repeat end at beat 0 closes the previous measure, and a repeat\n * start at the bar end opens the next one. Returns, per measure, the repeat\n * start/end carried onto its own edges.\n */\nfunction edgeRepeats(navigation: (MeasureNavigation | undefined)[], lengths: Fraction[], diagnostics: string[]): { start?: boolean; end?: number; inferred?: boolean }[] {\n const edges = lengths.map(() => ({} as { start?: boolean; end?: number; inferred?: boolean }));\n lengths.forEach((length, bar) => {\n for (const barline of navigation[bar]?.barlines || []) {\n const at = parseFraction(barline.beat);\n if (!at || compareFraction(length, ZERO) <= 0) continue;\n if (barline.repeatEnd && compareFraction(at, ZERO) === 0) {\n if (bar > 0) { edges[bar - 1].end = barline.repeatTimes || 2; edges[bar - 1].inferred = !barline.repeatTimes; }\n else diagnostics.push('A repeat end at the score start has nothing to repeat; it was ignored.');\n }\n if (barline.repeatStart && compareFraction(at, length) === 0) {\n if (bar + 1 < lengths.length) edges[bar + 1].start = true;\n else diagnostics.push('A repeat start at the score end has nothing to repeat; it was ignored.');\n }\n }\n });\n return edges;\n}\n\nfunction units(navigation: (MeasureNavigation | undefined)[], lengths: Fraction[], diagnostics: string[]): Unit[] {\n const result: Unit[] = [];\n const edges = edgeRepeats(navigation, lengths, diagnostics);\n lengths.forEach((length, bar) => {\n const nav = navigation[bar] || {};\n const cuts = new Map<string, Cut>();\n for (const barline of nav.barlines || []) {\n const at = parseFraction(barline.beat);\n if (!at || compareFraction(at, ZERO) < 0 || compareFraction(at, length) > 0) { diagnostics.push(`A repeat barline at beat ${barline.beat} lies outside measure ${bar + 1}; it was ignored.`); continue; }\n const key = formatFraction(at);\n const cut = cuts.get(key) || { at };\n if (barline.repeatStart) cut.start = true;\n if (barline.repeatEnd) { cut.end = barline.repeatTimes || 2; cut.inferred = !barline.repeatTimes; }\n cuts.set(key, cut);\n }\n const edge = edges[bar];\n const inner = [...cuts.values()].filter(cut => compareFraction(cut.at, ZERO) > 0 && compareFraction(cut.at, length) < 0).sort((a, b) => compareFraction(a.at, b.at));\n const atStart = cuts.get('0'), atEnd = cuts.get(formatFraction(length));\n const points = [ZERO, ...inner.map(cut => cut.at), length];\n const first = result.length;\n for (let i = 0; i < points.length - 1; i++) {\n const unit: Unit = { bar, from: points[i], to: points[i + 1] };\n if (nav.endings?.length) unit.endings = [...nav.endings];\n if (i > 0 && inner[i - 1].start) unit.repeatStart = true;\n if (i < inner.length && inner[i].end) { unit.repeatEnd = inner[i].end; unit.repeatInferred = inner[i].inferred; }\n result.push(unit);\n }\n const head = result[first], tail = result[result.length - 1];\n if (nav.repeatStart || atStart?.start || edge.start) head.repeatStart = true;\n if (nav.repeatEnd) { tail.repeatEnd = Math.max(2, Math.min(16, nav.repeatTimes || 2)); tail.repeatInferred = !nav.repeatTimes; }\n else if (atEnd?.end) { tail.repeatEnd = atEnd.end; tail.repeatInferred = atEnd.inferred; }\n else if (edge.end) { tail.repeatEnd = edge.end; tail.repeatInferred = edge.inferred; }\n if (nav.segno) head.segno = true;\n if (nav.coda) head.coda = true;\n for (const key of ['toCoda', 'daCapo', 'dalSegno', 'fine'] as const) if (nav[key]) tail[key] = true;\n });\n return result;\n}\n\n/** The highest ending number of each consecutive group of volta brackets. */\nfunction lastEndings(list: Unit[]): number[] {\n const result = list.map(() => 0);\n for (let i = 0; i < list.length;) {\n if (!list[i].endings) { i++; continue; }\n let j = i, max = 0;\n while (j < list.length && list[j].endings && (j === i || list[j].bar === list[j - 1].bar || !(list[j].endings!.includes(1) && !list[j - 1].endings!.includes(1)))) { max = Math.max(max, ...list[j].endings!); j++; }\n for (let k = i; k < j; k++) result[k] = max;\n i = j;\n }\n return result;\n}\n\ntype Visit = { unit: number; pass: number; ending?: number };\n/**\n * Expands written navigation into the performed order: repeats (with times),\n * 1st/2nd/nth endings, segno, coda, To Coda, D.C., D.S. and Fine. After a\n * D.C./D.S. repeats are not taken and only the last ending of each group plays.\n */\nfunction traverse(list: Unit[], diagnostics: string[]): Visit[] {\n const visits: Visit[] = [];\n const count = list.length;\n let index = 0, trailingPass = 1, jumped = false, codaJumped = false;\n const repeatStack: { start: number; pass: number; implicit?: boolean }[] = [];\n /** The unit of the last completed repeat end: a backward repeat with no forward repeat goes back to just after it. */\n let lastRepeatEnd = -1;\n /** Backward repeats with no forward repeat that already played out; they are never taken again. */\n const spentImplicit = new Set<number>();\n let steps = 0;\n const limit = Math.max(64, count * 16);\n const segno = list.findIndex(unit => unit.segno);\n const finalEnding = lastEndings(list);\n while (index >= 0 && index < count && steps++ < limit) {\n const unit = list[index];\n if (!unit.endings && index > 0 && list[index - 1].endings) trailingPass = 1;\n if (!jumped && unit.repeatStart && !repeatStack.some(repeat => repeat.start === index)) repeatStack.push({ start: index, pass: 1 });\n const pass = repeatStack.at(-1)?.pass || trailingPass;\n const taken = jumped ? finalEnding[index] : pass;\n const endingSkipped = Boolean(unit.endings?.length && !unit.endings.includes(taken));\n if (!endingSkipped) visits.push({ unit: index, pass: jumped ? 1 : pass, ending: unit.endings?.length ? taken : undefined });\n if (!jumped && unit.repeatEnd && !(spentImplicit.has(index) && !repeatStack.length)) {\n if (!repeatStack.length) repeatStack.push({ start: lastRepeatEnd < index ? lastRepeatEnd + 1 : 0, pass: 1, implicit: true });\n const repeat = repeatStack.at(-1)!;\n // An unnumbered repeat that closes an ending repeats until the group's last ending.\n const times = unit.repeatInferred && unit.endings?.length ? Math.max(unit.repeatEnd, Math.min(16, finalEnding[index])) : unit.repeatEnd;\n if (!endingSkipped && repeat.pass < times) { repeat.pass++; index = repeat.start; continue; }\n trailingPass = repeat.pass;\n repeatStack.pop();\n if (repeat.implicit) spentImplicit.add(index);\n lastRepeatEnd = index;\n }\n if (!endingSkipped && !jumped && (unit.daCapo || unit.dalSegno)) {\n jumped = true; trailingPass = 1; repeatStack.length = 0;\n if (unit.dalSegno && segno < 0) diagnostics.push('D.S. has no segno; restarted from the beginning.');\n index = unit.dalSegno && segno >= 0 ? segno : 0;\n continue;\n }\n if (!endingSkipped && jumped && unit.toCoda && !codaJumped) {\n const after = list.findIndex((item, i) => item.coda && i > index);\n const target = after >= 0 ? after : list.findIndex(item => item.coda);\n if (target >= 0) { codaJumped = true; index = target; continue; }\n diagnostics.push('To Coda has no coda; playback continued.');\n }\n if (!endingSkipped && jumped && unit.fine) break;\n index++;\n }\n if (steps >= limit) diagnostics.push('Playback navigation exceeded its safety limit; the score was truncated.');\n return visits;\n}\n\nconst pos = (bar: number, beat: Fraction): RoadmapPos => ({ bar, beat: formatFraction(beat) });\n\n/** Builds the roadmap from per-measure navigation and exact measure lengths. */\nexport function roadmapFromNavigation(navigation: (MeasureNavigation | undefined)[], lengths: Fraction[], diagnostics: string[] = []): Roadmap {\n const list = units(navigation, lengths, diagnostics);\n const segments: RoadmapSegment[] = [];\n let previous = -2;\n for (const visit of traverse(list, diagnostics)) {\n const unit = list[visit.unit];\n // A zero-length stretch plays nothing: it never starts a segment, and a jump into one breaks continuity.\n if (compareFraction(unit.from, unit.to) >= 0) { previous = visit.unit === previous + 1 ? visit.unit : -2; continue; }\n const last = segments.at(-1);\n if (last && visit.unit === previous + 1) {\n last.to = pos(unit.bar, unit.to);\n if (visit.ending !== undefined && last.ending === undefined) last.ending = visit.ending;\n } else {\n const segment: RoadmapSegment = { from: pos(unit.bar, unit.from), to: pos(unit.bar, unit.to) };\n if (visit.ending !== undefined) segment.ending = visit.ending;\n if (visit.pass > 1) segment.pass = visit.pass;\n segments.push(segment);\n }\n previous = visit.unit;\n }\n return { version: 1, segments };\n}\n\n/** The performed roadmap of a score, from the first part's format-neutral navigation. */\nexport function buildRoadmap(score: Score, diagnostics: string[] = []): Roadmap {\n return roadmapFromNavigation((score.parts[0]?.measures || []).map(measure => measure.navigation), measureLengths(score), diagnostics);\n}\n\nexport type ResolvedSegment = { from: { bar: number; beat: Fraction }; to: { bar: number; beat: Fraction } };\n\n/** The segments of a generated roadmap (built by roadmapFromNavigation, so already valid), without validation. */\nexport function generatedSegments(roadmap: Roadmap): ResolvedSegment[] {\n const at = (position: RoadmapPos) => ({ bar: position.bar, beat: parseFraction(position.beat) || ZERO });\n return roadmap.segments.map(segment => ({ from: at(segment.from), to: at(segment.to) }));\n}\n/**\n * Checks a (possibly user-supplied) roadmap against the score: positions must\n * lie inside their measures, each segment must run forwards, and the total\n * length is capped. Returns undefined, with a diagnostic, when it is unusable.\n */\nexport function resolveRoadmap(roadmap: unknown, lengths: Fraction[], diagnostics: string[]): ResolvedSegment[] | undefined {\n const fail = (message: string) => { diagnostics.push(`Roadmap override ignored: ${message}`); return undefined; };\n if (!roadmap || typeof roadmap !== 'object') return fail('not an object.');\n const { version, segments } = roadmap as Partial<Roadmap>;\n if (version !== 1) return fail('unsupported version.');\n if (!Array.isArray(segments)) return fail('segments must be an array.');\n if (segments.length > ROADMAP_MAX_SEGMENTS) return fail(`more than ${ROADMAP_MAX_SEGMENTS} segments.`);\n const starts: Fraction[] = [];\n let total = ZERO;\n lengths.forEach(length => { starts.push(total); total = addFraction(total, length); });\n const absolute = (value: unknown, label: string): { bar: number; beat: Fraction; at: Fraction } | string => {\n if (!value || typeof value !== 'object') return `${label} is not a position.`;\n const { bar, beat } = value as Partial<RoadmapPos>;\n if (!Number.isInteger(bar) || bar! < 0 || bar! >= lengths.length) return `${label} bar ${String(bar)} is out of range.`;\n const offset = parseFraction(beat);\n if (!offset) return `${label} beat ${String(beat)} is not a rational number.`;\n if (compareFraction(offset, ZERO) < 0 || compareFraction(offset, lengths[bar!]) > 0) return `${label} beat ${beat} lies outside measure ${bar! + 1}.`;\n return { bar: bar!, beat: offset, at: addFraction(starts[bar!], offset) };\n };\n const resolved: ResolvedSegment[] = [];\n let performed = 0;\n for (const [i, segment] of segments.entries()) {\n const from = absolute((segment as RoadmapSegment)?.from, `segment ${i + 1} start`);\n const to = absolute((segment as RoadmapSegment)?.to, `segment ${i + 1} end`);\n if (typeof from === 'string') return fail(from);\n if (typeof to === 'string') return fail(to);\n if (compareFraction(from.at, to.at) >= 0) return fail(`segment ${i + 1} does not run forwards.`);\n performed += fractionValue(to.at) - fractionValue(from.at);\n if (performed > ROADMAP_MAX_REPLAY * Math.max(1, fractionValue(total))) return fail('the performed length exceeds the safety limit.');\n resolved.push({ from: { bar: from.bar, beat: from.beat }, to: { bar: to.bar, beat: to.beat } });\n }\n return resolved;\n}\n\n","import type { Part, Pitch, Score, ScoreDirection } from '../score';\nimport { soundingMidi } from '../transpose';\nimport { musicXmlTextNavigation } from '../notation/navigation';\nimport { musicXmlPlaybackMarks, type NoteMark, type PedalChange, type PlaybackMarks } from './source-marks';\nimport { fractionValue } from './fraction';\nimport { buildRoadmap, generatedSegments, measureLengths, resolveRoadmap, roadmapFromNavigation, type ResolvedSegment, type Roadmap } from './roadmap';\n\n/** A sounding pitch. Repeated visits to a written note have separate occurrences. */\nexport type PerformanceEvent = {\n id: string; noteId: string; pitchId: string; pitchIndex: number;\n partId: string; voice: string; measureIndex: number; occurrence: number;\n scoreBeat: number; endScoreBeat: number; startSeconds: number;\n /** Written (articulated) release: drives highlighting and the visual segments. */\n endSeconds: number;\n /**\n * Audible release. Equals endSeconds unless the sustain pedal holds the note\n * past its written release (or a same-pitch re-attack cuts that tail short).\n * Schedule audio with this; never highlight with it.\n */\n soundEndSeconds: number;\n midi: number; velocity: number; visualNoteIds: string[];\n visualSegments: { noteId: string; startSeconds: number; endSeconds: number }[];\n};\nexport type PlaybackPosition = {\n seconds: number; scoreBeat: number; measureIndex: number; occurrence: number;\n measureBeat: number; noteId: string | null; activeNoteIds: string[];\n};\nexport type PerformanceTimeline = {\n events: PerformanceEvent[]; positions: PlaybackPosition[]; durationSeconds: number;\n initialBpm: number; diagnostics: string[];\n /** The roadmap that was performed: the override when it was valid, else the one built from the score. */\n roadmap: Roadmap;\n};\nexport type TimelineOptions = {\n bpm: number; semitones?: number; musicXml?: string; verovioTimemap?: unknown;\n /**\n * The complete, unfiltered score when `score` is a view with hidden parts.\n * Tempo changes, fermata holds and sibling-staff dynamics are read from it so\n * hiding a part never changes the performance of the parts that remain.\n */\n fullScore?: Score;\n /**\n * A user or saved performance order that replaces the one built from the\n * score's navigation. It is validated; an unusable one is diagnosed and the\n * built roadmap is used instead.\n */\n roadmap?: Roadmap;\n};\n\nconst EPS = 1e-7;\n/** Extra hold added by a fermata, as a fraction of the held note's length. */\nconst FERMATA_HOLD = .5;\n/** Grace notes steal at most this many beats from the beat they ornament. */\nconst GRACE_BEATS = .125, GRACE_TOTAL = .25;\nconst dynamics: Record<string, number> = { pppp: 20, ppp: 28, pp: 39, p: 52, mp: 66, mf: 82, f: 96, ff: 108, fff: 118, ffff: 124, sf: 112, sfz: 112, fz: 112, fp: 96, sforzando: 112 };\n\nfunction scoreOffsets(lengths: number[]): number[] {\n let offset = 0;\n return lengths.map(length => { const here = offset; offset += length; return here; });\n}\n\n/** One measure's share of a roadmap segment, with its performed occurrence of that measure. */\ntype Slice = { measureIndex: number; from: number; to: number; occurrence: number; linearIn: boolean; linearOut: boolean };\n/**\n * Splits roadmap segments into per-measure slices. A slice that continues the\n * previous one exactly (next measure start, or the same offset in the same\n * measure) is linear: ties and sounding notes carry across it. Any other\n * entry into a measure is a new occurrence of that measure.\n */\nfunction slices(segments: ResolvedSegment[], lengths: number[]): Slice[] {\n const result: Slice[] = [];\n const occurrences = new Map<number, number>();\n for (const segment of segments) {\n for (let bar = segment.from.bar; bar <= segment.to.bar; bar++) {\n const from = bar === segment.from.bar ? fractionValue(segment.from.beat) : 0;\n const to = bar === segment.to.bar ? fractionValue(segment.to.beat) : lengths[bar];\n if (to <= from + EPS) continue;\n const previous = result.at(-1);\n const sameBar = Boolean(previous && previous.measureIndex === bar && Math.abs(previous.to - from) < EPS);\n const nextBar = Boolean(previous && previous.measureIndex + 1 === bar && from < EPS && Math.abs(previous.to - lengths[previous.measureIndex]) < EPS);\n let occurrence: number;\n if (sameBar) occurrence = previous!.occurrence;\n else { occurrence = occurrences.get(bar) || 0; occurrences.set(bar, occurrence + 1); }\n if (previous) previous.linearOut = sameBar || nextBar;\n result.push({ measureIndex: bar, from, to, occurrence, linearIn: sameBar || nextBar, linearOut: false });\n }\n }\n return result;\n}\n\ntype TempoPoint = { beat: number; bpm: number };\nfunction tempoPoints(score: Score, offsets: number[], diagnostics: string[]): TempoPoint[] {\n const byBeat = new Map<number, number>();\n for (const part of score.parts) for (const measure of part.measures) for (const direction of measure.directions || []) {\n if (direction.tempo && direction.tempo > 0 && offsets[measure.index] !== undefined) {\n const beat = offsets[measure.index] + direction.start;\n const old = byBeat.get(beat);\n if (old && Math.abs(old - direction.tempo) > EPS) diagnostics.push(`Conflicting tempos at score beat ${beat}; first part wins.`);\n else if (!old) byBeat.set(beat, direction.tempo);\n }\n }\n const points = [...byBeat].map(([beat, bpm]) => ({ beat, bpm })).sort((a, b) => a.beat - b.beat);\n if (!points.length || points[0].beat > EPS) points.unshift({ beat: 0, bpm: score.tempo > 0 ? score.tempo : 120 });\n return points;\n}\nfunction tempoAt(points: TempoPoint[], beat: number): number {\n let bpm = points[0].bpm;\n for (const point of points) { if (point.beat > beat + EPS) break; bpm = point.bpm; }\n return bpm;\n}\n\n/** MusicXML <sound dynamics> is a percentage of forte, which is MIDI velocity 90. */\nfunction directionVelocity(direction: ScoreDirection): number | undefined {\n if (direction.soundDynamics !== undefined && Number.isFinite(direction.soundDynamics)) return Math.max(1, Math.min(127, Math.round(direction.soundDynamics * .9)));\n for (const symbol of direction.symbols || []) if (dynamics[symbol] !== undefined) return dynamics[symbol];\n return undefined;\n}\n\ntype DynamicPoint = { beat: number; staffId: string; voice?: string; velocity?: number; wedge?: { type: string; number: string } };\n/** The source part (not staff) a Score part came from; piano staves share dynamics. */\nfunction sourcePartId(score: Score, part: Part): string {\n return score.document?.identity?.staffIdToSource?.[part.id]?.partId || part.id;\n}\nfunction dynamicPoints(score: Score, offsets: number[]): Map<string, DynamicPoint[]> {\n const groups = new Map<string, DynamicPoint[]>();\n for (const part of score.parts) {\n const list = groups.get(sourcePartId(score, part)) || [];\n groups.set(sourcePartId(score, part), list);\n for (const measure of part.measures) {\n const offset = offsets[measure.index];\n if (offset === undefined) continue;\n const directions = measure.directions || [];\n const explicit = directions.some(direction => direction.symbols?.length || direction.soundDynamics !== undefined);\n for (const direction of directions) {\n const velocity = directionVelocity(direction);\n if (velocity !== undefined || direction.wedge) list.push({ beat: offset + direction.start, staffId: part.id, voice: direction.voice, velocity, wedge: direction.wedge });\n }\n // Older imports only filled measure.dynamics; directions win when present.\n if (!explicit) for (const mark of measure.dynamics || []) {\n if (dynamics[mark.symbol] !== undefined) list.push({ beat: offset + mark.start, staffId: part.id, velocity: dynamics[mark.symbol] });\n }\n }\n }\n for (const list of groups.values()) list.sort((a, b) => a.beat - b.beat);\n return groups;\n}\nfunction velocityFor(points: DynamicPoint[], staffId: string, targetBeat: number, voice: string): number {\n let value = 82, valueBeat = -Infinity, valueOwn = false;\n const openWedges = new Map<string, { start: number; velocity: number; type: string }>();\n const completed: { start: number; end: number; velocity: number; type: string }[] = [];\n for (const point of points) {\n if (point.beat > targetBeat + EPS) break;\n const own = point.staffId === staffId;\n // Voice-specific marks only filter notes on their own staff.\n if (own && point.voice && point.voice !== voice) continue;\n if (point.wedge) {\n const key = `${point.staffId}:${point.wedge.number}`;\n const type = point.wedge.type;\n if (type === 'crescendo' || type === 'diminuendo') openWedges.set(key, { start: point.beat, velocity: value, type });\n else if (type === 'stop') {\n const open = openWedges.get(key);\n if (open) { completed.push({ ...open, end: point.beat }); openWedges.delete(key); }\n }\n }\n if (point.velocity === undefined) continue;\n // At the same instant, a mark on the note's own staff beats a sibling staff's.\n if (Math.abs(point.beat - valueBeat) < EPS && valueOwn && !own) continue;\n value = point.velocity; valueBeat = point.beat; valueOwn = own;\n }\n const wedge = [...completed, ...[...openWedges.values()].map(open => ({ ...open, end: targetBeat + 4 }))].find(span => span.start <= targetBeat && span.end > targetBeat);\n if (wedge) {\n const progress = Math.max(0, Math.min(1, (targetBeat - wedge.start) / Math.max(.01, wedge.end - wedge.start)));\n value = Math.round(wedge.velocity + (wedge.type === 'crescendo' ? 22 : -22) * progress);\n }\n return Math.max(1, Math.min(127, value));\n}\n\n\n/** Prefer the identified partwise engraving text: it carries generated note IDs and normalized timewise layout. */\nfunction documentXml(score: Score): string | undefined {\n const document = score.document;\n for (const xml of [document?.engravingText, document?.originalText]) {\n if (xml && /<\\s*(?:\\w+:)?score-(?:partwise|timewise)\\b/.test(xml)) return xml;\n }\n return undefined;\n}\n\n/** Grace notes sound for at least this long, in seconds at the score's opening tempo. */\nconst GRACE_FLOOR_SECONDS = .03;\ntype PerformedPedal = { seconds: number; kind: PedalChange['kind'] };\n\n/**\n * The performance built once per score, independent of BPM, transposition and hidden parts.\n *\n * Every `...Seconds` field (events, visual segments, positions, `durationSeconds`, pedal times) is in performed\n * beats at the score's opening tempo: where the tempo doubles, a written beat counts 1/2. Playback seconds are\n * those values times 60 / bpm (playbackScale), so a BPM change never rebuilds the timeline. MIDI numbers are at\n * 0 semitones; playback adds the transposition to every event of a non-percussion part.\n *\n * Plain data (arrays and Maps of plain values), so a worker can build it and post it.\n */\nexport type BaseTimeline = PerformanceTimeline & {\n /** Source part (pedal scope) of each event, parallel to `events`. */\n eventSources: string[];\n /** Pedal changes in performed time per source part, in performed order. */\n performedPedals: Map<string, PerformedPedal[]>;\n /** End of the performed roadmap, before the last notes' tails. */\n pieceEnd: number;\n /** Parts whose events are never transposed (percussion). */\n percussionPartIds: string[];\n /** Diagnostics not tied to one part, in the order they were found. */\n headDiagnostics: string[];\n /** Per-part diagnostics (unmatched ties), in the order they were found. */\n partDiagnostics: { partId: string; message: string }[];\n};\n\nexport type BaseTimelineOptions = {\n /** A caller's own MusicXML: navigation, marks and pedals are read from it instead of the score. */\n musicXml?: string;\n roadmap?: Roadmap;\n /** Note marks and pedals already read from the source (for example by the import worker). */\n marks?: PlaybackMarks;\n /** Parts to perform; all parts of the score by default. Tempo, fermatas and dynamics always come from the whole score. */\n parts?: Part[];\n};\n\n/** Build the BPM-independent performance of `full` (see BaseTimeline). */\nexport function buildBaseTimeline(full: Score, options: BaseTimelineOptions = {}): BaseTimeline {\n const diagnostics: string[] = [];\n const partDiagnostics: { partId: string; message: string }[] = [];\n const parts = options.parts || full.parts;\n // Measure lengths, navigation and the roadmap come from the full score, so hiding a part never changes them.\n const exactLengths = measureLengths(full);\n const lengths = exactLengths.map(fractionValue);\n const offsets = scoreOffsets(lengths);\n const points = tempoPoints(full, offsets, diagnostics);\n const initialBpm = tempoAt(points, 0);\n /** Timeline units (opening-tempo beats) per written beat at a score beat. */\n const unitsPerBeat = (beat: number) => initialBpm / tempoAt(points, beat);\n const source = options.marks || musicXmlPlaybackMarks(options.musicXml || documentXml(full));\n const marks = source.marks;\n diagnostics.push(...source.markDiagnostics);\n const markFor = (note: { sourceId?: string; pitches: (Pitch & { sourceId?: string })[] }) => [note.sourceId, ...note.pitches.map(p => p.sourceId)].map(id => id ? marks.get(id) : undefined).find((item): item is NoteMark => Boolean(item));\n const dynamicGroups = dynamicPoints(full, offsets);\n // Navigation lives on the Score; an explicit musicXml option (a caller's own source) is read instead.\n const built = options.musicXml\n ? roadmapFromNavigation(musicXmlTextNavigation(options.musicXml, lengths.length, diagnostics), exactLengths, diagnostics)\n : buildRoadmap(full, diagnostics);\n const override = options.roadmap ? resolveRoadmap(options.roadmap, exactLengths, diagnostics) : undefined;\n const roadmap = override ? options.roadmap! : built;\n // Only a user override is validated; a rejected one falls back to the generated roadmap, which always plays.\n const performedSlices = slices(override || generatedSegments(built), lengths);\n const pedals = source.pedals;\n diagnostics.push(...source.pedalDiagnostics);\n const performedPedals = new Map<string, PerformedPedal[]>();\n const eventSource = new Map<PerformanceEvent, string>();\n const events: PerformanceEvent[] = [];\n const positions: PlaybackPosition[] = [];\n const openTies = new Map<string, PerformanceEvent>();\n // The floor is in timeline units, so it scales with BPM like every other duration: 30 ms at the opening tempo.\n const graceFloor = GRACE_FLOOR_SECONDS * initialBpm / 60;\n let elapsed = 0;\n for (const slice of performedSlices) {\n const { measureIndex, from, to } = slice;\n const length = lengths[measureIndex];\n const offset = offsets[measureIndex];\n // A slice continued within the same measure lets its notes sound on past `to`, so time is mapped up to the bar end.\n const horizon = slice.linearOut ? Math.max(to, length) : to;\n const localTempos = points.filter(point => point.beat > offset + from + EPS && point.beat < offset + horizon - EPS);\n const boundaries = [from, ...localTempos.map(point => point.beat - offset), horizon];\n const times = [0];\n for (let i = 1; i < boundaries.length; i++) times.push(times[i - 1] + (boundaries[i] - boundaries[i - 1]) * unitsPerBeat(offset + boundaries[i - 1] + EPS));\n const baseAt = (beat: number) => {\n const limited = Math.max(from, Math.min(horizon, beat));\n let segment = boundaries.length - 2;\n for (let i = 0; i < boundaries.length - 1; i++) if (limited < boundaries[i + 1] - EPS) { segment = i; break; }\n return elapsed + times[segment] + (limited - boundaries[segment]) * unitsPerBeat(offset + boundaries[segment] + EPS);\n };\n const secondsPerBeat = (beat: number) => unitsPerBeat(offset + beat + EPS);\n const inSlice = (beat: number) => beat >= from - EPS && beat < to - EPS;\n // Fermatas hold the music: time is inserted where the shortest held note of\n // each fermata onset ends, so later notes wait instead of overlapping.\n const fermataStarts = new Map<string, { start: number; duration: number }>();\n for (const part of full.parts) for (const note of part.measures[measureIndex]?.notes || []) {\n if (note.grace || note.duration <= 0 || !inSlice(note.start) || !markFor(note)?.fermata) continue;\n const key = note.start.toFixed(6);\n const old = fermataStarts.get(key);\n if (!old || note.duration < old.duration) fermataStarts.set(key, { start: note.start, duration: note.duration });\n }\n const holdMap = new Map<string, { beat: number; seconds: number }>();\n for (const { start, duration } of fermataStarts.values()) {\n const beat = Math.min(to, start + duration);\n const seconds = (baseAt(beat) - baseAt(start)) * FERMATA_HOLD;\n const key = beat.toFixed(6);\n holdMap.set(key, { beat, seconds: Math.max(seconds, holdMap.get(key)?.seconds || 0) });\n }\n const holds = [...holdMap.values()].sort((a, b) => a.beat - b.beat);\n const heldBefore = (beat: number, inclusive: boolean) => holds.reduce((sum, hold) => sum + (hold.beat < beat - EPS || (inclusive && hold.beat <= beat + EPS) ? hold.seconds : 0), 0);\n const secondsAt = (beat: number) => baseAt(beat) + heldBefore(beat, true);\n // A note is cut where a segment ends in a jump; a linear continuation lets it sound on.\n const release = (beat: number) => slice.linearOut ? beat : Math.min(to, beat);\n\n // Ties survive a repeat/D.S. jump only if the target note stops the tie.\n const carried = slice.linearIn ? undefined : new Map(openTies);\n const positionBeats = [...new Set([...boundaries.filter(beat => beat < to - EPS), to, ...holds.map(hold => hold.beat)].map(beat => beat.toFixed(9)))].map(Number).sort((a, b) => a - b);\n for (const beat of positionBeats) {\n const base = { scoreBeat: offset + beat, measureIndex, occurrence: slice.occurrence, measureBeat: beat, noteId: null, activeNoteIds: [] };\n if (holds.some(hold => Math.abs(hold.beat - beat) < 1e-6)) positions.push({ ...base, seconds: baseAt(beat) + heldBefore(beat, false) });\n positions.push({ ...base, seconds: secondsAt(beat) });\n }\n // Pedal marks are placed per performed occurrence, so repeats and jumps re-pedal.\n // A mark exactly at a slice end belongs to the slice that continues from there, if any.\n for (const [sourceId, changes] of pedals) for (const change of changes) {\n if (change.measureIndex !== measureIndex) continue;\n const atEnd = change.beat >= to - EPS && (to >= length - EPS || (!slice.linearOut && change.beat <= to + EPS));\n if (!inSlice(change.beat) && !atEnd) continue;\n const list = performedPedals.get(sourceId) || [];\n list.push({ seconds: secondsAt(Math.min(to, change.beat)), kind: change.kind });\n performedPedals.set(sourceId, list);\n }\n for (const part of parts) {\n const measure = part.measures[measureIndex];\n if (!measure) continue;\n const graceGroups = new Map<string, string[]>();\n for (const note of measure.notes) if (note.grace) {\n const key = `${note.voice || '1'}:${note.start.toFixed(6)}`;\n graceGroups.set(key, [...(graceGroups.get(key) || []), note.id]);\n }\n const graceBeat = (n: number) => Math.min(GRACE_BEATS, GRACE_TOTAL / Math.max(1, n));\n const dynamicList = dynamicGroups.get(sourcePartId(full, part)) || dynamicGroups.get(part.id) || [];\n const pedalSource = sourcePartId(full, part);\n for (const note of measure.notes) {\n if (note.rest || !note.pitches.length) continue;\n if (note.duration <= 0 && !note.grace) continue;\n // Only notes that start inside the slice sound in it; a note begun before a jump target is not re-attacked.\n if (!inSlice(note.start)) continue;\n const voice = note.voice || '1';\n let start: number, end: number;\n if (note.grace) {\n const group = graceGroups.get(`${voice}:${note.start.toFixed(6)}`) || [note.id];\n const n = group.length, i = Math.max(0, group.indexOf(note.id));\n const step = graceBeat(n) * secondsPerBeat(note.start);\n const principal = secondsAt(note.start);\n // Graces on the downbeat delay their principal; others steal from the previous beat.\n if (note.start <= EPS) { start = principal + i * step; end = principal + (i + 1) * step; }\n else { start = Math.max(baseAt(from), principal - (n - i) * step); end = principal - (n - i - 1) * step; }\n end = Math.max(start + graceFloor, end);\n } else {\n const opening = note.start <= EPS ? (graceGroups.get(`${voice}:${note.start.toFixed(6)}`)?.length || 0) : 0;\n start = secondsAt(note.start) + (opening ? opening * graceBeat(opening) * secondsPerBeat(0) : 0);\n end = secondsAt(release(note.start + note.duration));\n }\n const mark = markFor(note);\n if (mark?.silent) continue;\n note.pitches.forEach((pitch: Pitch & { sourceId?: string }, pitchIndex) => {\n const midi = soundingMidi(part, measure, pitch, 0);\n const pitchMark = (pitch.sourceId ? marks.get(pitch.sourceId) : undefined) || mark;\n const soundingEnd = start + (end - start) * (pitchMark?.durationScale ?? 1);\n const tieKey = `${part.id}:${voice}:${midi}`;\n const old = openTies.get(tieKey);\n if (pitch.tieStop && old) {\n old.endSeconds = Math.max(old.endSeconds, soundingEnd);\n old.endScoreBeat = offset + note.start + note.duration;\n if (!old.visualNoteIds.includes(note.id)) old.visualNoteIds.push(note.id);\n old.visualSegments.push({ noteId: note.id, startSeconds: start, endSeconds: soundingEnd });\n if (!pitch.tieStart) openTies.delete(tieKey);\n return;\n }\n if (pitch.tieStop && !old) partDiagnostics.push({ partId: part.id, message: `Unmatched tie stop at ${note.id}, pitch ${pitchIndex}.` });\n const event: PerformanceEvent = {\n id: `${note.id}:${pitchIndex}:${slice.occurrence}`, noteId: note.id,\n pitchId: pitch.sourceId || `${note.id}:${pitchIndex}`, pitchIndex, partId: part.id, voice,\n measureIndex, occurrence: slice.occurrence, scoreBeat: offset + note.start,\n endScoreBeat: offset + note.start + note.duration, startSeconds: start, endSeconds: soundingEnd, soundEndSeconds: soundingEnd,\n midi, velocity: Math.max(1, Math.min(127, velocityFor(dynamicList, part.id, offset + note.start, voice) + (pitchMark?.velocityDelta || 0))), visualNoteIds: [note.id],\n visualSegments: [{ noteId: note.id, startSeconds: start, endSeconds: soundingEnd }],\n };\n events.push(event);\n eventSource.set(event, pedalSource);\n if (pitch.tieStart) openTies.set(tieKey, event);\n });\n }\n }\n if (carried) for (const [key, event] of carried) if (openTies.get(key) === event) openTies.delete(key);\n elapsed = secondsAt(to);\n }\n events.sort((a, b) => a.startSeconds - b.startSeconds || a.partId.localeCompare(b.partId) || a.pitchIndex - b.pitchIndex);\n const eventSources = events.map(event => eventSource.get(event)!);\n applySustainPedal(events, eventSources, performedPedals, elapsed);\n return {\n events, positions, durationSeconds: timelineEnd(events, elapsed), initialBpm,\n diagnostics: [...new Set([...diagnostics, ...partDiagnostics.map(item => item.message)])], roadmap,\n eventSources, performedPedals, pieceEnd: elapsed, percussionPartIds: parts.filter(part => part.clef === 'percussion').map(part => part.id),\n headDiagnostics: diagnostics, partDiagnostics,\n };\n}\n\nfunction timelineEnd(events: PerformanceEvent[], pieceEnd: number): number {\n let end = pieceEnd;\n for (const event of events) end = Math.max(end, event.endSeconds, event.soundEndSeconds);\n return end;\n}\n\n/**\n * The base timeline restricted to `visiblePartIds` (hidden parts muted). Events of each part do not depend on the\n * others, so this filters them and re-applies the sustain pedal, whose re-attack damping is scoped to what sounds.\n * Tempo, fermatas, dynamics and navigation stay those of the whole score. Returns `base` when nothing is hidden.\n */\nexport function deriveTimeline(base: BaseTimeline, options: { visiblePartIds?: readonly string[] } = {}): BaseTimeline {\n if (!options.visiblePartIds) return base;\n const visible = new Set(options.visiblePartIds);\n if (base.events.every(event => visible.has(event.partId)) && base.partDiagnostics.every(item => visible.has(item.partId))) return base;\n const events: PerformanceEvent[] = [];\n const eventSources: string[] = [];\n base.events.forEach((event, index) => {\n if (!visible.has(event.partId)) return;\n events.push({ ...event });\n eventSources.push(base.eventSources[index]);\n });\n applySustainPedal(events, eventSources, base.performedPedals, base.pieceEnd);\n const partDiagnostics = base.partDiagnostics.filter(item => visible.has(item.partId));\n return {\n ...base, events, eventSources, partDiagnostics, durationSeconds: timelineEnd(events, base.pieceEnd),\n percussionPartIds: base.percussionPartIds.filter(id => visible.has(id)),\n diagnostics: [...new Set([...base.headDiagnostics, ...partDiagnostics.map(item => item.message)])],\n };\n}\n\n/** Playback seconds per timeline unit at `bpm` (an invalid BPM plays at the score's opening tempo). */\nexport function playbackScale(timeline: Pick<PerformanceTimeline, 'initialBpm'>, bpm: number): number {\n return 60 / (Number.isFinite(bpm) && bpm > 0 ? bpm : timeline.initialBpm);\n}\nconst transposable = (timeline: BaseTimeline) => {\n const percussion = new Set(timeline.percussionPartIds);\n return (event: PerformanceEvent) => !percussion.has(event.partId);\n};\nfunction scaledEvent(event: PerformanceEvent, scale: number, semitones: number): PerformanceEvent {\n return {\n ...event, startSeconds: event.startSeconds * scale, endSeconds: event.endSeconds * scale, soundEndSeconds: event.soundEndSeconds * scale,\n midi: event.midi + semitones, visualNoteIds: [...event.visualNoteIds],\n visualSegments: event.visualSegments.map(segment => ({ ...segment, startSeconds: segment.startSeconds * scale, endSeconds: segment.endSeconds * scale })),\n };\n}\n\n/** Playback length in seconds at `bpm`. */\nexport function playbackDuration(timeline: BaseTimeline, bpm: number): number {\n return timeline.durationSeconds * playbackScale(timeline, bpm);\n}\n/** The position at playback `seconds` when the timeline plays at `bpm`. */\nexport function playbackPositionAt(timeline: BaseTimeline, seconds: number, bpm: number): PlaybackPosition {\n const scale = playbackScale(timeline, bpm);\n const position = positionAtSeconds(timeline, seconds / scale);\n return { ...position, seconds: position.seconds * scale };\n}\n/**\n * Events still sounding from playback `seconds` on (as eventsFromSeconds: tails of events begun earlier are clipped\n * to start there), in playback seconds at `bpm` and transposed by `semitones`. Only these events are copied.\n */\nexport function playbackEventsFrom(timeline: BaseTimeline, seconds: number, bpm: number, semitones = 0): PerformanceEvent[] {\n const scale = playbackScale(timeline, bpm);\n const units = seconds / scale;\n const shifts = transposable(timeline);\n const result: PerformanceEvent[] = [];\n for (const event of timeline.events) {\n if (event.soundEndSeconds <= units + EPS) continue;\n const scaled = scaledEvent(event, scale, shifts(event) ? semitones : 0);\n if (event.startSeconds < units) { scaled.startSeconds = seconds; scaled.endSeconds = Math.max(seconds, scaled.endSeconds); }\n result.push(scaled);\n }\n return result;\n}\n/** Sounding MIDI numbers of the given parts' events, transposed by `semitones`. */\nexport function playbackMidis(timeline: BaseTimeline, partIds: ReadonlySet<string>, semitones = 0): number[] {\n const shifts = transposable(timeline);\n return timeline.events.filter(event => partIds.has(event.partId)).map(event => event.midi + (shifts(event) ? semitones : 0));\n}\n\n/** The timeline in playback seconds at `bpm`, transposed by `semitones` (the shape buildPerformanceTimeline returns). */\nexport function materializeTimeline(timeline: BaseTimeline, bpm: number, semitones = 0): PerformanceTimeline {\n const scale = playbackScale(timeline, bpm);\n const shifts = transposable(timeline);\n return {\n events: timeline.events.map(event => scaledEvent(event, scale, shifts(event) ? semitones : 0)),\n positions: timeline.positions.map(position => ({ ...position, seconds: position.seconds * scale, activeNoteIds: [...position.activeNoteIds] })),\n durationSeconds: timeline.durationSeconds * scale, initialBpm: timeline.initialBpm, diagnostics: [...timeline.diagnostics], roadmap: timeline.roadmap,\n };\n}\n\n/** Base timelines registered for a score's source document (for example built by the import worker). */\nconst registered = new WeakMap<object, Promise<BaseTimeline>>();\nexport function registerBaseTimeline(document: object, timeline: Promise<BaseTimeline>): void {\n registered.set(document, timeline);\n}\nexport function registeredBaseTimeline(document: object): Promise<BaseTimeline> | undefined {\n return registered.get(document);\n}\n/**\n * The base timeline of a full score: the one registered for its document (falling back to building here if that\n * fails), else one built here on first use. It is kept per document, so instrument changes, BPM and transposition\n * never rebuild it.\n */\nexport function baseTimelineFor(score: Score): Promise<BaseTimeline> {\n const key: object = score.document || score;\n const known = registered.get(key);\n if (known) return known.catch(() => buildBaseTimeline(score));\n const timeline = new Promise<BaseTimeline>(resolve => resolve(buildBaseTimeline(score)));\n registered.set(key, timeline);\n return timeline;\n}\n\n/** Build one ordered performed timeline, with source tempo scaled by the displayed BPM. */\nexport function buildPerformanceTimeline(score: Score, options: TimelineOptions): PerformanceTimeline {\n const full = options.fullScore && options.fullScore.parts.length ? options.fullScore : score;\n const xml = options.musicXml || documentXml(score) || documentXml(full);\n const base = buildBaseTimeline(full, { musicXml: options.musicXml, roadmap: options.roadmap, marks: musicXmlPlaybackMarks(xml), parts: score.parts });\n const timeline = materializeTimeline(base, options.bpm, options.semitones || 0);\n if (options.verovioTimemap !== undefined) {\n const diagnostics = [...timeline.diagnostics];\n if (!Array.isArray(options.verovioTimemap)) diagnostics.push('Verovio timemap shape is unrecognized; source timing was used.');\n else {\n // Verovio 6.3.0 exposes {on,off,qstamp,tstamp}. qstamp is a useful\n // source-index check, while source tempo/navigation remain authoritative.\n const firstOnset = new Map<string, number>();\n for (const item of options.verovioTimemap as unknown[]) {\n if (!item || typeof item !== 'object') continue;\n const row = item as { on?: unknown; qstamp?: unknown };\n if (!Array.isArray(row.on) || typeof row.qstamp !== 'number') continue;\n for (const id of row.on) if (typeof id === 'string' && !firstOnset.has(id)) firstOnset.set(id, row.qstamp);\n }\n const checked = new Set<string>();\n for (const event of timeline.events) {\n if (checked.has(event.pitchId)) continue;\n checked.add(event.pitchId);\n const qstamp = firstOnset.get(event.pitchId);\n if (qstamp !== undefined && Math.abs(qstamp - event.scoreBeat) > .01) diagnostics.push(`Verovio/source onset differs for ${event.pitchId}.`);\n }\n }\n timeline.diagnostics = [...new Set(diagnostics)];\n }\n return timeline;\n}\n\n/**\n * The damper pedal scopes a whole source part (every staff). A note released\n * while the pedal is down keeps sounding until the next lift; a change is a lift\n * and re-depress at the same instant, so notes released before it end there.\n * Only soundEndSeconds moves; written ends and highlighting are untouched.\n */\nfunction applySustainPedal(events: PerformanceEvent[], eventSources: string[], performed: Map<string, PerformedPedal[]>, pieceEnd: number) {\n // Tie chains extend endSeconds after creation; the audible end starts from the final written end.\n for (const event of events) event.soundEndSeconds = event.endSeconds;\n const spans = new Map<string, { down: number; up: number }[]>();\n for (const [sourceId, changes] of performed) {\n const list: { down: number; up: number }[] = [];\n let downAt: number | undefined;\n // Stable sort keeps performed order for changes at the same instant.\n for (const change of [...changes].sort((a, b) => a.seconds - b.seconds)) {\n if (change.kind === 'down') { downAt ??= change.seconds; continue; }\n if (downAt !== undefined) list.push({ down: downAt, up: change.seconds });\n downAt = change.kind === 'change' ? change.seconds : undefined;\n }\n if (downAt !== undefined) list.push({ down: downAt, up: pieceEnd });\n spans.set(sourceId, list.filter(span => span.up > span.down + EPS));\n }\n if (!spans.size) return;\n const byKey = new Map<string, PerformanceEvent[]>();\n events.forEach((event, index) => {\n const sourceId = eventSources[index];\n if (sourceId === undefined) return;\n const key = `${sourceId}:${event.midi}`;\n const group = byKey.get(key);\n if (group) group.push(event); else byKey.set(key, [event]);\n const span = spans.get(sourceId)?.find(item => item.down < event.endSeconds - EPS && event.endSeconds < item.up - EPS);\n if (span) event.soundEndSeconds = span.up;\n });\n // Re-striking a sustained pitch damps the previous string at the new attack.\n for (const group of byKey.values()) for (const event of group) {\n if (event.soundEndSeconds <= event.endSeconds + EPS) continue;\n const next = group.find(other => other.startSeconds > event.startSeconds + EPS && other.startSeconds < event.soundEndSeconds - EPS);\n if (next) event.soundEndSeconds = Math.max(event.endSeconds, next.startSeconds);\n }\n}\n\n/** Includes sustained notes; useful for cursor, highlights, seek and resume. */\nexport function positionAtSeconds(timeline: PerformanceTimeline, seconds: number): PlaybackPosition {\n const clamped = Math.max(0, Math.min(timeline.durationSeconds, seconds));\n const positions = timeline.positions;\n let index = positions.length ? 0 : -1;\n for (let i = 0; i < positions.length; i++) { if (positions[i].seconds > clamped + EPS) break; index = i; }\n const current = positions[index] || { seconds: 0, scoreBeat: 0, measureIndex: 0, occurrence: 0, measureBeat: 0, noteId: null, activeNoteIds: [] };\n const next = index >= 0 ? positions[index + 1] : undefined;\n const ratio = next && next.seconds > current.seconds && next.measureIndex === current.measureIndex && next.occurrence === current.occurrence ? (clamped - current.seconds) / (next.seconds - current.seconds) : 0;\n const scoreBeat = current.scoreBeat + ratio * (next ? next.scoreBeat - current.scoreBeat : 0);\n const active = new Set<string>();\n for (const event of timeline.events) {\n if (event.startSeconds > clamped + EPS || event.endSeconds <= clamped + EPS) continue;\n for (const segment of event.visualSegments) if (segment.startSeconds <= clamped + EPS && segment.endSeconds > clamped + EPS) active.add(segment.noteId);\n }\n let latest: PerformanceEvent | undefined;\n for (let i = timeline.events.length - 1; i >= 0; i--) {\n const event = timeline.events[i];\n if (event.startSeconds <= clamped + EPS && event.measureIndex === current.measureIndex && event.occurrence === current.occurrence) { latest = event; break; }\n }\n const activeNoteIds = [...active];\n return { ...current, seconds: clamped, scoreBeat, measureBeat: current.measureBeat + scoreBeat - current.scoreBeat, noteId: activeNoteIds[0] || latest?.noteId || null, activeNoteIds };\n}\n\n/** Active event tails are clipped to the seek time so pause/resume sustains correctly. */\nexport function eventsFromSeconds(timeline: PerformanceTimeline, seconds: number): PerformanceEvent[] {\n return timeline.events.filter(event => event.soundEndSeconds > seconds + EPS).map(event => event.startSeconds < seconds ? { ...event, startSeconds: seconds, endSeconds: Math.max(seconds, event.endSeconds) } : event);\n}\n","import { instrumentForName, instrumentForProgram, midiPitch, pitch, type BarlineNavigation, type KeyMode, type Measure, type MeasureNavigation, type Part, type Score, type ScoreNote, type Transposition } from './score';\nimport { IdentityBuilder, identityForScore, makeSourceDocument, scoreToMei, type SourceDocument } from './notation/document';\nimport { abcDecorationWord, attachNavigation, endingNumbers, meiNavigation, navigationWord, resolveCodaSigns, type NavigationWord } from './notation/navigation';\nimport { durationBeats, normalizedScore as normalized, readMusicXml } from './notation/musicxml-source';\nimport { formatFraction, fromNumber } from './playback/fraction';\nimport { fileSourceFor, type FileSource } from './file-state';\nimport { extractMxlScore, formatMb, MAX_SCORE_FILE_BYTES } from './mxl';\nimport type { ImportReply, ImportRequest } from './import-protocol';\nimport { registerBaseTimeline, type BaseTimeline } from './playback/timeline';\n\nexport { extractMxlScore, MAX_SCORE_FILE_BYTES, MXL_MAX_SCORE_BYTES } from './mxl';\n\n// DOM helpers for MEI, which is read on the main thread (MusicXML is read by the streaming reader, see below).\nconst children = (node: Element, tag: string) => Array.from(node.children).filter(el => el.localName === tag);\nconst parseXml = (text: string) => {\n const doc = new DOMParser().parseFromString(text, 'application/xml');\n if (doc.querySelector('parsererror')) throw new Error('This file is not valid XML.');\n return doc;\n};\nconst empty = (index: number, beats: number): Measure => ({ index, beats, notes: [] });\n\n/**\n * Read MusicXML text on the calling thread (small sources: tests, the musicXml prop fallback). Files are read by the\n * import worker instead (importScoreFile). Both use the same single-pass streaming reader.\n */\nexport function parseMusicXml(text: string): Score {\n const read = readMusicXml(text);\n const score = read.score;\n score.document = makeSourceDocument({ format: 'musicxml', engravingFormat: 'musicxml', originalText: text, engravingText: read.engravingText, identity: identityForScore(score), inventory: read.inventory, diagnostics: read.diagnostics });\n return score;\n}\n\nexport function parseMei(text: string): Score {\n const doc = parseXml(text);\n if (doc.documentElement.localName !== 'mei') throw new Error('This file is not an MEI document.');\n const everything = Array.from(doc.getElementsByTagName('*'));\n const all = (tag: string) => everything.filter(e => e.localName === tag);\n // One part per staff number; later staffDefs (score changes) only update state.\n const defs = [...new Map(all('staffDef').map((def, i) => [def.getAttribute('n') || String(i + 1), def])).values()];\n const measures = all('measure');\n // Walk the document in order so later <scoreDef>/<staffDef> key and meter\n // changes (attributes or <keySig>/<meterSig> children) apply from that point.\n const parseKey = (sig: string | null | undefined) => {\n const match = /^(\\d+)([sf])$/.exec((sig || '').trim());\n return sig?.trim() === '0' ? 0 : match ? Number(match[1]) * (match[2] === 'f' ? -1 : 1) : undefined;\n };\n const defKey = (def: Element) => parseKey(def.getAttribute('key.sig')) ?? parseKey(def.getAttribute('keysig')) ?? parseKey(children(def, 'keySig')[0]?.getAttribute('sig'));\n // Each key area's mode: a key without one is major (so a change back from minor is major again).\n const defMode = (def: Element): KeyMode => (def.getAttribute('key.mode') || children(def, 'keySig')[0]?.getAttribute('mode')) === 'minor' ? 'minor' : 'major';\n const defMeter = (def: Element) => {\n const sig = children(def, 'meterSig')[0];\n const count = Number(def.getAttribute('meter.count') || sig?.getAttribute('count'));\n const unit = Number(def.getAttribute('meter.unit') || sig?.getAttribute('unit'));\n return count > 0 && unit > 0 ? { count, unit } : undefined;\n };\n let meterNow: { count: number; unit: number } | undefined;\n let defaultKey: number | undefined;\n const staffKeys = new Map<string, number>();\n let defaultMode: KeyMode = 'major';\n const staffModes = new Map<string, KeyMode>();\n const measureState: { count: number; unit: number; keys: Map<string, number>; defaultKey: number; modes: Map<string, KeyMode>; defaultMode: KeyMode }[] = [];\n let openingMeter: { count: number; unit: number } | undefined;\n let openingKey: number | undefined;\n for (const el of everything) {\n if (el.localName === 'scoreDef') {\n const k = defKey(el);\n if (k !== undefined) { defaultKey = k; staffKeys.clear(); defaultMode = defMode(el); staffModes.clear(); }\n meterNow = defMeter(el) || meterNow;\n } else if (el.localName === 'staffDef') {\n const k = defKey(el);\n if (k !== undefined) { staffKeys.set(el.getAttribute('n') || '1', k); staffModes.set(el.getAttribute('n') || '1', defMode(el)); }\n meterNow = defMeter(el) || meterNow;\n } else if (el.localName === 'measure') {\n openingMeter ||= meterNow;\n if (openingKey === undefined) openingKey = staffKeys.values().next().value ?? defaultKey;\n measureState.push({ count: meterNow?.count || 4, unit: meterNow?.unit || 4, keys: new Map(staffKeys), defaultKey: defaultKey || 0, modes: new Map(staffModes), defaultMode });\n }\n }\n const beats = openingMeter?.count || meterNow?.count || 4;\n const beatType = openingMeter?.unit || meterNow?.unit || 4;\n const key = openingKey ?? defaultKey ?? 0;\n const alteredByKey = (fifths: number, step: string) => fifths > 0 ? ('FCGDAEB'.slice(0, fifths).includes(step) ? 1 : 0) : ('BEADGCF'.slice(0, -fifths).includes(step) ? -1 : 0);\n const accidValues: Record<string, number> = { s: 1, f: -1, ss: 2, x: 2, ff: -2, xs: 3, sx: 3, ts: 3, tf: -3, n: 0, nf: -1, ns: 1 };\n /** Repeat <barLine>s inside the first layer of the first staff, by measure index. */\n const innerBarlines = new Map<number, BarlineNavigation[]>();\n const parts: Part[] = defs.map((def, i) => {\n const n = def.getAttribute('n') || String(i + 1);\n const name = def.getAttribute('label') || `Staff ${n}`;\n const sign = def.getAttribute('clef.shape');\n const clef = sign === 'F' ? 'bass' : sign === 'C' ? 'alto' : sign === 'perc' ? 'percussion' : 'treble';\n const transposition: Transposition = { semitones: Number(def.getAttribute('trans.semi')) || 0, diatonic: def.hasAttribute('trans.diat') ? Number(def.getAttribute('trans.diat')) : undefined };\n return { id: n, name, clef, key: measureState[0]?.keys.get(n) ?? measureState[0]?.defaultKey ?? key, instrument: instrumentForName(name), pitchBasis: 'written', transposition, measures: measures.map((measure, index) => {\n const state = measureState[index] || { count: beats, unit: beatType, keys: new Map<string, number>(), defaultKey: key, modes: new Map<string, KeyMode>(), defaultMode: 'major' as KeyMode };\n const staffKey = state.keys.get(n) ?? state.defaultKey;\n const out: Measure = { ...empty(index, state.count * 4 / state.unit), nominalBeats: state.count * 4 / state.unit, number: measure.getAttribute('n') || String(index + 1), key: staffKey, keyMode: state.modes.get(n) ?? state.defaultMode, beatsPerBar: state.count, beatType: state.unit };\n const staff = Array.from(measure.getElementsByTagName('*')).find(e => e.localName === 'staff' && e.getAttribute('n') === n);\n if (!staff) return out;\n // Written accidentals persist for the same step and octave until the barline.\n const written = new Map<string, { time: number; alter: number }[]>();\n const bySourceId = new Map<string, ScoreNote>();\n const sourceId = (el: Element) => el.getAttribute('xml:id') || el.getAttributeNS('http://www.w3.org/XML/1998/namespace', 'id') || undefined;\n const layers = Array.from(staff.children).filter(e => e.localName === 'layer');\n for (const [layerIndex, layer] of (layers.length ? layers : [staff]).entries()) {\n let cursor = 0;\n const walk = (parent: Element, ratio = 1, beam = false, tuplet?: ScoreNote['tuplet']) => {\n const events = Array.from(parent.children).filter(e => ['note', 'chord', 'rest', 'mRest', 'space', 'beam', 'tuplet', 'barLine'].includes(e.localName));\n for (const [eventIndex, el] of events.entries()) {\n const kind = el.localName;\n if (kind === 'barLine') {\n const form = el.getAttribute('form') || '';\n if (i === 0 && layerIndex === 0 && /^rpt(start|end|both)$/.test(form)) {\n const list = innerBarlines.get(index) || [];\n list.push({ beat: formatFraction(fromNumber(cursor)), ...(form !== 'rptend' ? { repeatStart: true } : {}), ...(form !== 'rptstart' ? { repeatEnd: true } : {}) });\n innerBarlines.set(index, list);\n }\n continue;\n }\n if (kind === 'beam') { walk(el, ratio, true, tuplet); continue; }\n if (kind === 'tuplet') {\n const actual = Number(el.getAttribute('num')) || 3, normal = Number(el.getAttribute('numbase')) || 2;\n walk(el, ratio * normal / actual, beam, { actual, normal, number: el.getAttribute('n') || '1', start: true, stop: true });\n continue;\n }\n const grace = el.getAttribute('grace') !== null;\n const duration = grace ? 0 : kind === 'mRest' ? out.beats : durationBeats(el.getAttribute('dur') || '4', Number(el.getAttribute('dots') || 0)) * ratio;\n const noteEls = kind === 'chord' ? Array.from(el.children).filter(e => e.localName === 'note') : kind === 'note' ? [el] : [];\n const pitches = noteEls.map(e => {\n const step = (e.getAttribute('pname') || 'c').toUpperCase();\n const octave = Number(e.getAttribute('oct') || 4);\n const accidChild = children(e, 'accid')[0];\n // MEI precedence: accid.ges > written accid (attribute or <accid>) > measure state > key.\n const gestural = accidValues[e.getAttribute('accid.ges') || accidChild?.getAttribute('accid.ges') || ''];\n const shown = accidValues[e.getAttribute('accid') || accidChild?.getAttribute('accid') || ''];\n const pitchKey = `${step}${octave}`;\n if (shown !== undefined) written.set(pitchKey, [...(written.get(pitchKey) || []), { time: cursor, alter: shown }]);\n const prior = (written.get(pitchKey) || []).filter(entry => entry.time <= cursor + 1e-6).at(-1)?.alter;\n const tie = e.getAttribute('tie') || el.getAttribute('tie') || '';\n return { ...pitch(step, octave, gestural ?? shown ?? prior ?? alteredByKey(staffKey, step)), sourceId: sourceId(e), tieStart: /[im]/.test(tie), tieStop: /[tm]/.test(tie) };\n });\n const lyric = Array.from(el.getElementsByTagName('*')).filter(e => e.localName === 'syl').map(e => e.textContent?.trim() || '').filter(Boolean).join(' ');\n const parsed: ScoreNote = { id: `${n}-${index}-${out.notes.length}`, sourceId: sourceId(el), start: cursor, duration, pitches, rest: !pitches.length, voice: layer.getAttribute('n') || String(layerIndex + 1), beamStart: beam && eventIndex === 0, beamEnd: beam && eventIndex === events.length - 1, grace, tuplet, lyric: lyric || undefined };\n out.notes.push(parsed);\n for (const source of [el, ...noteEls]) { const id = sourceId(source); if (id) bySourceId.set(id, parsed); }\n cursor += duration;\n }\n };\n walk(layer);\n }\n for (const harmony of Array.from(measure.getElementsByTagName('*')).filter(e => e.localName === 'harm')) {\n const targetStaff = harmony.getAttribute('staff');\n if (targetStaff ? !targetStaff.split(/\\s+/).includes(n) : i !== 0) continue;\n const symbol = harmony.textContent?.trim();\n if (!symbol) continue;\n const sourceId = harmony.getAttribute('startid')?.replace(/^#/, '');\n const stamp = Number(harmony.getAttribute('tstamp'));\n const targetStart = Number.isFinite(stamp) && stamp >= 1 ? (stamp - 1) * 4 / beatType : 0;\n const target = sourceId && bySourceId.get(sourceId) || out.notes.find(note => note.start >= targetStart - .001);\n if (target) target.chordSymbol = symbol;\n }\n return out;\n }) };\n });\n const titles = all('title');\n const title = (titles.find(e => ['main', 'uniform'].includes(e.getAttribute('type') || '')) || titles[0])?.textContent?.trim() || '';\n const subtitle = titles.find(e => ['subordinate', 'subtitle'].includes(e.getAttribute('type') || ''))?.textContent?.trim() || '';\n const composer = all('composer')[0]?.textContent?.trim() || all('persName').find(e => e.getAttribute('role') === 'composer')?.textContent?.trim() || '';\n // Key mode of the opening key (absent means major), for spelling minor keys' raised degrees.\n const openingDef = all('scoreDef')[0];\n const openingMode = openingDef?.getAttribute('key.mode') || openingDef?.getElementsByTagName('keySig')[0]?.getAttribute('mode');\n const score = normalized({ title, subtitle, composer, source: 'MEI', tempo: 100, beats, beatType, key, ...(openingMode === 'minor' ? { keyMode: 'minor' as const } : {}), parts });\n attachNavigation(score, meiNavigation(measures, innerBarlines));\n score.document = makeSourceDocument({ format: 'mei', engravingFormat: 'mei', originalText: text, engravingText: text, identity: identityForScore(score) });\n return score;\n}\n\nexport async function parseAbc(text: string): Promise<Score> {\n const { default: abcjs } = await import('abcjs');\n const tune = (abcjs as any).parseOnly(text)[0];\n if (!tune?.lines?.length) throw new Error('No readable ABC tune was found.');\n const meter = tune.getMeterFraction?.() || { num: 4, den: 4 };\n const beats = Number(meter.num) || 4, beatType = Number(meter.den) || 4;\n const keyAccidentals = tune.getKeySignature?.()?.accidentals || [];\n const key = keyAccidentals.length * (keyAccidentals[0]?.acc === 'flat' ? -1 : 1);\n const firstStaff = tune.lines.find((line: any) => line.staff?.length)?.staff || [];\n const parts: Part[] = [];\n const map = new Map<string, Part>();\n for (const [staffIndex, staff] of firstStaff.entries()) for (const [voiceIndex] of (staff as any).voices.entries()) {\n const name = staff.title?.[voiceIndex] || staff.title?.[0] || (voiceIndex ? `Voice ${voiceIndex + 1}` : 'Melody');\n const percussion = staff.clef?.type === 'perc';\n const clef = percussion ? 'percussion' : /bass|cello|trombone/i.test(name) ? 'bass' : staff.voices.length === 1 && staff.clef?.type === 'bass' ? 'bass' : 'treble';\n const part: Part = { id: `abc-${staffIndex}-${voiceIndex}`, name, clef, instrument: percussion ? 'drum-kit' : instrumentForName(name), measures: [] };\n parts.push(part); map.set(`${staffIndex}-${voiceIndex}`, part);\n }\n // Navigation is read from the first voice: abcjs puts repeat/ending marks on bars\n // (a bar ends one measure and may start the next) and D.C./Fine/segno on notes or bars.\n const nav = (measure: Measure) => (measure.navigation ||= {});\n let pendingStart: MeasureNavigation = {};\n let openEnding: number[] | undefined;\n let lastFilled: Measure | undefined;\n /** Coda signs written on a barline: the measure the barline ends and the one it starts. */\n const barlineCodas: { before: Measure; after?: Measure }[] = [];\n let pendingBarlineCoda: { before: Measure; after?: Measure } | undefined;\n const navigationWords = (item: any): NavigationWord[] => [\n ...(item.decoration || []).map((name: string) => abcDecorationWord(name)),\n ...(item.chord || []).map((chord: { name?: string }) => navigationWord(chord.name || '')),\n ].filter(Boolean);\n const applyWord = (word: NavigationWord, start: MeasureNavigation, end: MeasureNavigation | undefined) => {\n if (word === 'segno' || word === 'coda') start[word] = true;\n else if (end) end[word] = true;\n };\n for (const line of tune.lines) for (const [staffIndex, staff] of (line.staff || []).entries()) for (const [voiceIndex, voice] of (staff.voices || []).entries()) {\n const part = map.get(`${staffIndex}-${voiceIndex}`);\n if (!part) continue;\n const leading = part === parts[0];\n let current = part.measures.at(-1);\n if (!current || (current as any).closed) { current = empty(part.measures.length, beats * 4 / beatType); part.measures.push(current); }\n let cursor = current.notes.reduce((max, n) => Math.max(max, n.start + n.duration), 0);\n const accidentalMap = new Map<string, number>();\n // abcjs marks only the first note of a tuplet with its multiplier.\n let triplet: { multiplier: number; remaining: number; actual: number; first: boolean } | undefined;\n for (const item of voice) {\n if (item.el_type === 'bar') {\n if (leading) {\n const end = lastFilled && nav(lastFilled);\n if (end && ['bar_right_repeat', 'bar_dbl_repeat'].includes(item.type)) end.repeatEnd = true;\n // A mark on a bar ends the measure before it, except segno/coda, which start the next one.\n for (const word of navigationWords(item)) applyWord(word, pendingStart, end);\n if (lastFilled && navigationWords(item).includes('coda')) barlineCodas.push(pendingBarlineCoda = { before: lastFilled });\n if (item.endEnding) openEnding = undefined;\n if (['bar_left_repeat', 'bar_dbl_repeat'].includes(item.type)) pendingStart.repeatStart = true;\n if (item.startEnding) openEnding = endingNumbers(String(item.startEnding));\n }\n if (current.notes.length) (current as any).closed = true;\n current = empty(part.measures.length, beats * 4 / beatType); part.measures.push(current);\n cursor = 0; accidentalMap.clear(); continue;\n }\n if (item.el_type !== 'note') continue;\n if (item.startTriplet && Number(item.tripletMultiplier) > 0) triplet = { multiplier: Number(item.tripletMultiplier), remaining: Number(item.tripletR || item.startTriplet) || 3, actual: Number(item.startTriplet) || 3, first: true };\n const tupletInfo = triplet ? { actual: triplet.actual, normal: Math.max(1, Math.round(triplet.actual * triplet.multiplier)), number: '1', start: triplet.first, stop: Boolean(item.endTriplet) || triplet.remaining <= 1 } : undefined;\n const duration = Number(item.duration || .25) * 4 * (triplet?.multiplier ?? 1);\n if (triplet) { triplet.first = false; triplet.remaining--; if (item.endTriplet || triplet.remaining <= 0) triplet = undefined; }\n const pitches = (item.pitches || []).map((p: any) => {\n const degree = Number(p.pitch || 0);\n const steps = ['C', 'D', 'E', 'F', 'G', 'A', 'B'];\n const step = steps[((degree % 7) + 7) % 7];\n const octave = 4 + Math.floor(degree / 7);\n const explicit = ({ sharp: 1, flat: -1, natural: 0, dblsharp: 2, dblflat: -2 } as Record<string, number>)[p.accidental];\n if (explicit !== undefined) accidentalMap.set(`${step}${octave}`, explicit);\n const fromKey = keyAccidentals.find((a: any) => a.note.toUpperCase() === step);\n const alter = accidentalMap.get(`${step}${octave}`) ?? (fromKey?.acc === 'sharp' ? 1 : fromKey?.acc === 'flat' ? -1 : 0);\n // Percussion (clef=perc) is written by staff position: it keeps its written pitch for playback and is engraved\n // unpitched at that position.\n const position = part.clef === 'percussion' ? { unpitched: true, displayStep: step, displayOctave: octave } : {};\n return { ...pitch(step, octave, alter), ...position, tieStart: Boolean(p.startTie), tieStop: Boolean(p.endTie) };\n });\n if (leading) {\n if (!current.notes.length) {\n Object.assign(nav(current), pendingStart);\n pendingStart = {};\n if (pendingBarlineCoda) { pendingBarlineCoda.after = current; pendingBarlineCoda = undefined; }\n if (openEnding?.length) nav(current).endings = [...openEnding];\n }\n for (const word of navigationWords(item)) applyWord(word, nav(current), nav(current));\n lastFilled = current;\n }\n // Navigation text (\"^D.C. al Fine\") is a jump instruction, never a chord symbol.\n const chordSymbol = item.chord?.find((chord: { name?: string; position?: string }) => chord.position !== 'below' && !navigationWord(chord.name || ''))?.name;\n const lyric = item.lyric?.map((syllable: { syllable?: string; divider?: string }) => `${syllable.syllable || ''}${syllable.divider === '-' ? '-' : ''}`).filter(Boolean).join(' ');\n current.notes.push({ id: `abc-${staffIndex}-${voiceIndex}-${current.index}-${current.notes.length}`, start: cursor, duration, pitches, chordSymbol, lyric, beamStart: Boolean(item.startBeam), beamEnd: Boolean(item.endBeam), rest: !pitches.length, dotted: Boolean(item.dots), tuplet: tupletInfo, tieStart: pitches.some((p: { tieStart?: boolean }) => p.tieStart) || undefined, tieStop: pitches.some((p: { tieStop?: boolean }) => p.tieStop) || undefined });\n cursor += duration;\n }\n }\n const nominal = beats * 4 / beatType;\n parts.forEach(part => {\n part.measures = part.measures.filter(m => m.notes.length);\n part.measures.forEach((m, i) => {\n m.index = i;\n m.nominalBeats = nominal;\n // ABC is literal: a pickup, or a bar split by a mid-measure repeat, is only as long as its notes.\n const content = m.notes.reduce((max, note) => Math.max(max, note.start + note.duration), 0);\n if (content > 1e-6 && content < nominal - 1e-6) { m.implicit = true; m.beats = content; }\n });\n });\n const navigation = parts[0]?.measures.map(m => m.navigation || {}) || [];\n const measureIndex = (measure?: Measure) => measure ? parts[0]?.measures.indexOf(measure) ?? -1 : -1;\n const wasToCoda = barlineCodas.map(pair => Boolean(navigation[measureIndex(pair.after)]?.toCoda));\n resolveCodaSigns(navigation);\n // A barline coda sign that became To Coda is the jump at that barline: it ends the measure before it.\n barlineCodas.forEach((pair, i) => {\n const before = measureIndex(pair.before), after = measureIndex(pair.after);\n if (before < 0 || after < 0 || wasToCoda[i] || !navigation[after].toCoda) return;\n delete navigation[after].toCoda;\n navigation[before].toCoda = true;\n });\n const minor = /^m(?:in)?$/i.test(String(tune.getKeySignature?.()?.mode || ''));\n const score = normalized({ ...(minor ? { keyMode: 'minor' as const } : {}), title: tune.metaText?.title || '', subtitle: tune.lines.find((line: any) => line.subtitle)?.subtitle?.text || '', composer: tune.metaText?.composer || '', source: 'ABC', tempo: Number(tune.metaText?.tempo?.bpm) || 100, beats, beatType, key, parts });\n attachNavigation(score, navigation);\n score.document = makeSourceDocument({ format: 'abc', engravingFormat: 'mei', originalText: text, engravingText: scoreToMei(score), identity: identityForScore(score) });\n return score;\n}\n\nexport async function parseMidi(buffer: ArrayBuffer): Promise<Score> {\n const { default: toneMidi } = await import('@tonejs/midi');\n const { Midi } = toneMidi;\n const midi = new Midi(buffer);\n const beats = midi.header.timeSignatures[0]?.timeSignature[0] || 4;\n const beatType = midi.header.timeSignatures[0]?.timeSignature[1] || 4;\n const tempo = Math.round(midi.header.tempos[0]?.bpm || 120);\n const measureSize = beats * 4 / beatType;\n const ppq = midi.header.ppq;\n const parts: Part[] = midi.tracks.filter(t => t.notes.length).map((track, ti) => {\n const name = track.name || track.instrument.name || `Track ${ti + 1}`;\n const measures: Measure[] = [];\n for (const note of track.notes) {\n const absolute = Math.round(note.ticks / ppq * 4) / 4;\n const duration = Math.max(.25, Math.round(note.durationTicks / ppq * 4) / 4);\n // Notes crossing a barline become tied pieces so measures keep their nominal length.\n let position = absolute, remaining = duration, piece = 0;\n while (remaining > 1e-6) {\n const index = Math.floor(position / measureSize + 1e-9);\n const start = position - index * measureSize;\n const length = Math.min(remaining, measureSize - start);\n while (measures.length <= index) measures.push(empty(measures.length, measureSize));\n const m = measures[index];\n const tieStop = piece > 0, tieStart = remaining - length > 1e-6;\n const sounding = { ...midiPitch(note.midi), ...(tieStart ? { tieStart } : {}), ...(tieStop ? { tieStop } : {}) };\n const chord = m.notes.find(n => Math.abs(n.start - start) < .001 && Math.abs(n.duration - length) < .001);\n if (chord) { chord.pitches.push(sounding); chord.tieStart ||= tieStart || undefined; chord.tieStop ||= tieStop || undefined; }\n else m.notes.push({ id: `midi-${ti}-${index}-${m.notes.length}`, start, duration: length, pitches: [sounding], ...(tieStart ? { tieStart } : {}), ...(tieStop ? { tieStop } : {}) });\n position += length; remaining -= length; piece++;\n }\n }\n return { id: `midi-${ti}`, name, clef: track.instrument.percussion ? 'percussion' : /bass/i.test(name) ? 'bass' : 'treble', instrument: track.instrument.percussion ? 'drum-kit' : instrumentForProgram(track.instrument.number), pitchBasis: 'concert' as const, measures };\n });\n const score = normalized({ title: midi.name || '', source: 'MIDI · quantized', tempo, beats, beatType, key: 0, parts });\n // MIDI has no written accidentals: show one wherever a pitch differs from the one in force on its line (C major, or\n // an earlier accidental in the measure), so a sharp is drawn and not just played.\n for (const part of score.parts) if (part.clef !== 'percussion') for (const measure of part.measures) {\n const inForce = new Map<string, number>();\n for (const note of measure.notes) for (const pitch of note.pitches) {\n const line = `${pitch.step}${pitch.octave}`;\n if (pitch.tieStop || pitch.alter === (inForce.get(line) ?? 0)) continue;\n pitch.accidental = pitch.alter > 0 ? 'sharp' : pitch.alter < 0 ? 'flat' : 'natural';\n inForce.set(line, pitch.alter);\n }\n }\n score.document = makeSourceDocument({ format: 'midi', engravingFormat: 'mei', originalBytes: new Uint8Array(buffer), engravingText: scoreToMei(score), identity: identityForScore(score) });\n return score;\n}\n\n/** What the import worker hands back: a parsed score, or the bytes of a format the main thread reads. */\ntype WorkerResult = { kind: 'score'; score: Score } | { kind: 'bytes'; bytes: Uint8Array };\ntype ImportJob = { sha256: Promise<string>; size: Promise<number | undefined>; result: Promise<WorkerResult> };\n/**\n * Per channel (reader instance), the import whose score is still arriving; a newer import on the same channel stops\n * it. A job past its score finishes its timeline.\n */\nconst parsing = new Map<number, { worker: Worker; fail: (error: Error) => void }>();\n\n/** A reader unmounted: stop its import still parsing (its score would never be shown). */\nexport function cancelImports(channel: number): void {\n parsing.get(channel)?.fail(new Error('Import cancelled.'));\n}\n\n/**\n * Run one import in a fresh worker (docs/specs/large-score-performance.md, Phase 2). The main thread only assembles\n * the Score from bounded chunks (each message is its own short task) and wraps the transferred bytes; it never\n * parses or hashes the file. The playback timeline arrives after the score and is registered for its document.\n */\nfunction runImport(request: ImportRequest, file: File | undefined, channel: number): ImportJob {\n parsing.get(channel)?.fail(new Error('Superseded import.'));\n const worker = new Worker(new URL('./import.worker.ts', import.meta.url), { type: 'module' });\n let resolveHash!: (sha256: string) => void, resolveResult!: (result: WorkerResult) => void;\n let rejectHash!: (error: Error) => void, rejectResult!: (error: Error) => void;\n const sha256 = new Promise<string>((resolve, reject) => { resolveHash = resolve; rejectHash = reject; });\n const result = new Promise<WorkerResult>((resolve, reject) => { resolveResult = resolve; rejectResult = reject; });\n let timeline: { resolve: (timeline: BaseTimeline) => void; reject: (error: Error) => void; value?: BaseTimeline } | undefined;\n let score: Score | undefined;\n let hash: string | undefined, size: number | undefined;\n const identity = new IdentityBuilder();\n const stop = () => { worker.terminate(); if (parsing.get(channel)?.worker === worker) parsing.delete(channel); };\n const fail = (error: Error) => { stop(); rejectHash(error); rejectResult(error); timeline?.reject(error); };\n parsing.set(channel, { worker, fail });\n worker.onerror = event => { event.preventDefault(); fail(new Error(event.message || 'The score could not be read.')); };\n worker.onmessage = ({ data }: MessageEvent<ImportReply>) => {\n switch (data.kind) {\n case 'source': hash = data.sha256; size = data.size; resolveHash(data.sha256); break;\n case 'bytes': stop(); resolveResult({ kind: 'bytes', bytes: new Uint8Array(data.bytes) }); break;\n case 'head': score = data.score; score.parts.forEach(part => identity.part(part)); break;\n case 'measures': {\n const measures = score!.parts[data.part].measures;\n for (const measure of data.measures) measures.push(measure);\n identity.notes(data.measures);\n break;\n }\n case 'done': {\n if (parsing.get(channel)?.worker === worker) parsing.delete(channel);\n const original = data.original ? new Uint8Array(data.original) : undefined;\n const engraving = data.engraving ? new Uint8Array(data.engraving) : undefined;\n const text = request.kind === 'text' ? request.text : undefined;\n const document: SourceDocument = makeSourceDocument({\n format: data.format, engravingFormat: 'musicxml', originalBytes: original,\n // Files keep bytes only; their texts are decoded on demand (the MXL member is extracted again).\n originalText: text ?? (data.format === 'mxl' ? { bytes: original!, decode: () => extractMxlScore(original!) } : { bytes: original! }),\n engravingText: engraving ? { bytes: engraving } : text ?? { bytes: original! },\n filename: file?.name, sha256: hash, identity: identity.identity, inventory: data.inventory, diagnostics: data.diagnostics,\n });\n score!.document = document;\n const built = new Promise<BaseTimeline>((resolve, reject) => { timeline = { resolve, reject }; });\n // A timeline that never arrives is built on demand instead (baseTimelineFor).\n built.catch(() => {});\n registerBaseTimeline(document, built);\n resolveResult({ kind: 'score', score: score! });\n break;\n }\n case 'timeline': timeline!.value = data.timeline; break;\n case 'timeline-events': {\n const value = timeline!.value!;\n for (const event of data.events) value.events.push(event);\n for (const source of data.eventSources) value.eventSources.push(source);\n break;\n }\n case 'timeline-end': stop(); timeline!.resolve(timeline!.value!); break;\n case 'error': fail(new Error(data.message)); break;\n }\n };\n worker.postMessage(request);\n // Callers may use only one of the two promises.\n sha256.catch(() => {}); result.catch(() => {});\n const sizeKnown = sha256.then(() => size);\n sizeKnown.catch(() => {});\n return { sha256, size: sizeKnown, result };\n}\n\n/** An import of a score file: its source identity (available once hashed) and the score. */\nexport type ScoreImport = { source: Promise<FileSource>; score: Promise<Score> };\n\n/**\n * Open a score file. The import worker reads and hashes it once and reads MusicXML/MXL off the main thread; MEI,\n * ABC and MIDI are small and are read here from the bytes the worker hands back. `channel` is the reader's (see\n * verovio-runtime openVerovioChannel): a newer import only supersedes imports on the same channel.\n */\nexport function importScoreFile(file: File, channel = 0): ScoreImport {\n if (file.size > MAX_SCORE_FILE_BYTES) {\n const error = Promise.reject(new Error(`This file is ${formatMb(file.size)}; scores up to ${formatMb(MAX_SCORE_FILE_BYTES)} can be opened.`));\n error.catch(() => {});\n return { source: error as Promise<never>, score: error as Promise<never> };\n }\n const job = runImport({ kind: 'file', file }, file, channel);\n const score = job.result.then(async result => {\n if (result.kind === 'score') return result.score;\n return readOnMainThread(file, result.bytes, await job.sha256);\n });\n return handled({ source: job.sha256.then(sha256 => fileSourceFor(file.name, file.size, sha256)), score });\n}\n\n/**\n * Callers may stop at either promise (the Reader stops at the source when the import fails or is superseded), so\n * neither may surface as an unhandled rejection; awaiting one still rejects as usual.\n */\nfunction handled(job: ScoreImport): ScoreImport {\n job.source.catch(() => {});\n job.score.catch(() => {});\n return job;\n}\n\n/** Open a score file (see importScoreFile). */\nexport function importFile(file: File): Promise<Score> {\n return importScoreFile(file).score;\n}\n\n/**\n * Read MusicXML text the page already holds (the Reader's musicXml prop) in the import worker, which also takes its\n * source identity (the same as file-state.ts textSource, without hashing on the main thread). Superseded only by a\n * newer import on the same `channel`.\n */\nexport function importMusicXmlText(text: string, name = 'MusicXML', channel = 0): ScoreImport {\n const job = runImport({ kind: 'text', text }, undefined, channel);\n return handled({\n source: job.sha256.then(async sha256 => ({ name, size: (await job.size) ?? 0, sha256, format: 'musicxml' })),\n score: job.result.then(result => { if (result.kind !== 'score') throw new Error('This file is not a MusicXML score.'); return result.score; }),\n });\n}\n\nasync function readOnMainThread(file: File, bytes: Uint8Array, hash: string): Promise<Score> {\n const name = file.name.toLowerCase();\n // The document is re-wrapped with the file's identity; its inventory and identity carry over (no second parse).\n const rewrap = (score: Score, binary?: Uint8Array) => {\n const document = score.document!;\n score.document = makeSourceDocument({ format: document.format, engravingFormat: document.engravingFormat, originalBytes: binary, originalText: document.originalText, engravingText: document.engravingText, filename: file.name, sha256: hash, identity: document.identity, inventory: { featureCounts: document.featureCounts, diagnostics: document.diagnostics } });\n return score;\n };\n if (/\\.(mid|midi)$/.test(name)) return rewrap(await parseMidi(bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer), bytes);\n const text = new TextDecoder().decode(bytes);\n if (/\\.(abc|txt)$/.test(name)) return rewrap(await parseAbc(text));\n if (/\\.mei$/.test(name)) return rewrap(parseMei(text));\n throw new Error('Choose a MusicXML, MIDI, MEI, or ABC file.');\n}\n","import type { Pitch } from './score';\n\nconst qualities: [number[], string][] = [\n [[0, 4, 7, 11], 'maj7'],\n [[0, 4, 7, 10], '7'],\n [[0, 3, 7, 10], 'm7'],\n [[0, 3, 6, 10], 'm7♭5'],\n [[0, 3, 6, 9], 'dim7'],\n [[0, 4, 7, 9], '6'],\n [[0, 3, 7, 9], 'm6'],\n [[0, 4, 7], ''],\n [[0, 3, 7], 'm'],\n [[0, 3, 6], 'dim'],\n [[0, 4, 8], 'aug'],\n [[0, 5, 7], 'sus4'],\n [[0, 2, 7], 'sus2'],\n];\n\nexport function pitchName(pitch: Pitch): string {\n return pitch.step + (pitch.alter > 0 ? '♯'.repeat(pitch.alter) : '♭'.repeat(-pitch.alter));\n}\n\nexport function inferChordSymbol(pitches: Pitch[]): string | undefined {\n const classes = [...new Set(pitches.map(pitch => pitch.midi % 12))];\n if (classes.length < 3 || classes.length > 4) return;\n const bass = pitches.reduce((lowest, pitch) => pitch.midi < lowest.midi ? pitch : lowest);\n for (const root of [bass.midi % 12, ...classes.filter(pc => pc !== bass.midi % 12)]) {\n const intervals = classes.map(pc => (pc - root + 12) % 12).sort((a, b) => a - b);\n const quality = qualities.find(([pattern]) => pattern.length === intervals.length && pattern.every((interval, index) => interval === intervals[index]));\n if (!quality) continue;\n const rootPitch = pitches.find(pitch => pitch.midi % 12 === root);\n if (!rootPitch) continue;\n return `${pitchName(rootPitch)}${quality[1]}${root === bass.midi % 12 ? '' : `/${pitchName(bass)}`}`;\n }\n}\n","import type { SourceDocument } from './notation/document';\nimport type { BaselineInfo, PagesResult, ProbeResult, VerovioReply, VerovioRequest, ViewSpec } from './verovio-protocol';\n\n/** A worker failure; `code` says why (see VerovioReply). */\nexport class VerovioError extends Error {\n constructor(message: string, readonly code?: VerovioReply['code']) { super(message); }\n}\nexport const isSuperseded = (error: unknown) => error instanceof VerovioError && error.code === 'superseded';\n/** Verovio ran out of WASM memory (its heap is capped at 2 GiB); `reduceChunkSize` then a retry may succeed. */\nexport const isOutOfMemory = (error: unknown) => error instanceof VerovioError && error.code === 'oom';\n/** The worker was recycled under a request (another reader's out-of-memory failure, a heap recycle); retried once. */\nexport const isRestarted = (error: unknown) => error instanceof VerovioError && error.code === 'restarted';\nconst restarted = () => new VerovioError('Verovio restarted.', 'restarted');\n\n/**\n * Engraving chunk budget, in staff-measures per chunk (see docs/specs/large-score-performance.md, Phase 3). Long\n * scores are engraved chunk by chunk; an out-of-memory retry halves the budget and engraves every score in chunks.\n */\nexport const DEFAULT_CHUNK_STAFF_MEASURES = 640;\nconst MIN_CHUNK_STAFF_MEASURES = 40;\nlet chunkBudget = DEFAULT_CHUNK_STAFF_MEASURES;\nlet forceChunks = false;\n/** A heap above this (the cap is 2 GiB) is returned when the worker is idle and the score re-imports cheaply. */\nlet recycleHeapBytes = 1024 * 2 ** 20;\n// Diagnostics and tests: localStorage `scoreflow-chunking` = {\"force\": true, \"budget\": 16} engraves every MusicXML\n// score in chunks of that size (validation/chunks.mjs compares chunked and whole engravings); `recycleHeapBytes`\n// lowers the idle-recycle threshold. A diagnostic hook: un-namespaced and exempt from `persist` (storage.ts).\n// Browser only: Node 25 has a global localStorage whose access prints a warning on an SSR server.\nif (typeof window !== 'undefined') try {\n const setting = JSON.parse(window.localStorage?.getItem('scoreflow-chunking') || 'null') as { force?: boolean; budget?: number; recycleHeapBytes?: number } | null;\n if (setting?.force) forceChunks = true;\n if (Number(setting?.budget) > 0) chunkBudget = Number(setting!.budget);\n if (Number(setting?.recycleHeapBytes) > 0) recycleHeapBytes = Number(setting!.recycleHeapBytes);\n} catch { /* no storage */ }\nexport const chunkSettings = () => ({ budget: chunkBudget, force: forceChunks });\n/**\n * After an out-of-memory failure: engrave in chunks half the size (every score, even one below the chunking\n * threshold) on a fresh worker. The caller then opens or draws the score again. Returns the new budget.\n */\nexport function reduceChunkSize(): number {\n chunkBudget = Math.max(MIN_CHUNK_STAFF_MEASURES, Math.floor(chunkBudget / 2));\n forceChunks = true;\n stopWorker(restarted());\n return chunkBudget;\n}\n/**\n * Test hook: `localStorage['scoreflow-simulate-oom']` = N (a positive integer; any other value counts as 1) makes the\n * next probe or render fail as out of memory, and the next N - 1 probes or renders of the same channel too, the way a\n * score too large for the device keeps failing in its own reader (other readers are unaffected). A diagnostic hook:\n * un-namespaced and exempt from `persist` (storage.ts).\n */\nlet simulatedOom: { channel: number; left: number } | undefined;\nfunction takeSimulatedOom(channel: number): boolean {\n try {\n const armed = globalThis.localStorage?.getItem('scoreflow-simulate-oom');\n if (armed) {\n globalThis.localStorage.removeItem('scoreflow-simulate-oom');\n const count = Number(armed);\n simulatedOom = { channel, left: Number.isInteger(count) && count > 0 ? count : 1 };\n }\n } catch { /* no storage */ }\n if (!simulatedOom || simulatedOom.channel !== channel || simulatedOom.left <= 0) return false;\n simulatedOom.left--;\n return true;\n}\n\n/** `channel`: the reader a probe or render belongs to (imports are shared by every reader showing the score). */\ntype Pending = { kind: VerovioRequest['kind']; channel?: number; resolve: (value: any) => void; reject: (reason: Error) => void };\nlet worker: Worker | undefined;\nlet nextId = 0;\nconst pending = new Map<number, Pending>();\n\nfunction getWorker(): Worker {\n if (worker) return worker;\n worker = new Worker(new URL('./verovio.worker.ts', import.meta.url), { type: 'module' });\n worker.onmessage = ({ data }: MessageEvent<VerovioReply>) => {\n const item = pending.get(data.id);\n if (!item) return;\n pending.delete(data.id);\n if (data.heap !== undefined) {\n heap = data.heap;\n // Exposed for diagnostics and the large-score validation (the WASM heap is not visible to the page otherwise).\n (globalThis as { __scoreflowVerovioHeapPeak?: number }).__scoreflowVerovioHeapPeak = Math.max(heap, (globalThis as { __scoreflowVerovioHeapPeak?: number }).__scoreflowVerovioHeapPeak || 0);\n }\n if (data.error !== undefined) item.reject(new VerovioError(data.error, data.code));\n else item.resolve(data.value);\n // Out of memory leaves a heap near the 2 GiB cap that the worker cannot give back: start a fresh worker. A large\n // heap is returned once the worker is idle, but only for a chunked score, which re-imports in one index pass, and\n // never right after an import (the render that needs it follows): a whole-document score would be imported again\n // and recycled again, over and over. Its heap is returned before the next score's import instead.\n // Other readers' requests still in flight fail as `restarted` and are sent again to the fresh worker; the failing\n // reader's own requests fail as out of memory (the same layout would only run out of memory again).\n const idle = !pending.size && item.kind !== 'import' && importsInFlight === 0 && currentChunked;\n if (data.code === 'oom') stopWorker(restarted(), item.channel);\n else if (heap > recycleHeapBytes && idle) stopWorker(restarted());\n };\n worker.onerror = event => {\n event.preventDefault();\n stopWorker(new VerovioError(event.message || 'Verovio worker failed.'));\n };\n return worker;\n}\n\n/**\n * Terminate the worker (it holds the WASM heap, which never shrinks) and fail whatever it still owed with `reason`,\n * except the probes and renders of `outOfMemory` (the channel that ran out of memory), which fail as out of memory.\n */\nfunction stopWorker(reason: Error, outOfMemory?: number): void {\n worker?.terminate();\n worker = undefined;\n heap = 0;\n baselines.clear();\n for (const item of pending.values()) {\n item.reject(outOfMemory !== undefined && item.channel === outOfMemory ? new VerovioError('This score is too large for the notation renderer on this device (it ran out of memory).', 'oom') : reason);\n }\n pending.clear();\n}\n\ntype Body = VerovioRequest extends infer R ? R extends unknown ? Omit<R, 'id'> : never : never;\nfunction request<T>(body: Body, transfer: Transferable[] = []): Promise<T> {\n const id = ++nextId;\n return new Promise<T>((resolve, reject) => {\n pending.set(id, { kind: body.kind, channel: 'channel' in body ? body.channel : undefined, resolve, reject });\n getWorker().postMessage({ ...body, id }, transfer);\n });\n}\n\n/** Revisions identify a source document (the engraving text), shared by every Score copy made from it. */\nconst revisions = new WeakMap<object, number>();\nlet nextRevision = 0;\nexport function verovioRevision(document: SourceDocument): number {\n let revision = revisions.get(document);\n if (!revision) { revision = ++nextRevision; revisions.set(document, revision); }\n return revision;\n}\n\n/** Baselines the worker holds (the runtime releases those no channel uses, see releaseUnused). */\nconst baselines = new Map<number, Promise<BaselineInfo>>();\n/** Baselines kept even when no channel uses them (a reader switching back to its previous score reuses one). */\nconst BASELINE_LIMIT = 2;\n/** Whether the most recent import is engraved in chunks (cheap to re-import after the worker is recycled). */\nlet currentChunked = false;\n/** The worker's WASM heap after its latest reply (bytes). */\nlet heap = 0;\n/** A heap above this is not reused well by a different score: the worker is recycled before the next import. */\nconst RECYCLE_BEFORE_IMPORT_BYTES = 384 * 2 ** 20;\n/** Imports in flight on any channel (a worker is never recycled as idle while one runs). */\nlet importsInFlight = 0;\n\n/** One channel per reader instance: its own render tickets, current/previous revisions and import in flight. */\ntype Channel = { current: number; previous: number; importing?: number };\nconst channels = new Map<number, Channel>();\nlet nextChannel = 0;\n/**\n * Opened channels only exist from openVerovioChannel until closeVerovioChannel; a closed (or never opened) channel is\n * never brought back by a late request: its requests fail as `superseded`. Channel 0 always exists.\n */\nconst channelState = (id: number): Channel | undefined => {\n let state = channels.get(id);\n if (!state && id === 0) { state = { current: 0, previous: 0 }; channels.set(id, state); }\n return state;\n};\nconst closed = () => new VerovioError('Superseded score render (the reader closed).', 'superseded');\nconst publishChannels = () => { (globalThis as { __pepperscoreVerovioChannels?: number }).__pepperscoreVerovioChannels = [...channels.keys()].filter(id => id !== 0).length; };\n/** A reader mounted: a channel of its own, so its imports and renders never supersede another reader's. */\nexport function openVerovioChannel(): number {\n const id = ++nextChannel;\n channels.set(id, { current: 0, previous: 0 });\n // Exposed for diagnostics and validation/embed.mjs: the number of open reader channels.\n publishChannels();\n return id;\n}\n/**\n * A reader unmounted: forget what only it used; the worker (and its WASM heap) goes when the last opened channel\n * closes. Channel 0, the default for direct callers of render.ts, is never opened and does not keep the worker.\n */\nexport function closeVerovioChannel(id: number): void {\n channels.delete(id);\n publishChannels();\n if (![...channels.keys()].some(open => open !== 0)) { stopWorker(new VerovioError('Verovio renderer disposed.')); return; }\n releaseUnused();\n}\nconst inUse = (revision: number) => [...channels.values()].some(state => state.current === revision || state.previous === revision || state.importing === revision);\n/** Keep at least BASELINE_LIMIT baselines; beyond that drop (and release in the worker) the oldest no channel uses. */\nfunction releaseUnused(): void {\n for (const revision of [...baselines.keys()]) {\n if (baselines.size <= BASELINE_LIMIT) return;\n if (inUse(revision)) continue;\n baselines.delete(revision);\n if (worker) request({ kind: 'release', revision }).catch(() => {});\n }\n}\n/** A channel shows `revision` now; the one it showed before stays its previous (still on screen while a new score imports). */\nconst adopt = (state: Channel, revision: number) => { if (state.current !== revision) { state.previous = state.current; state.current = revision; } };\n\n/**\n * Import a source once per revision and return its structure. The worker keeps Verovio's MEI baseline; the main\n * thread never receives it. A rejected import is forgotten so a retry imports again. Readers showing the same\n * document share its baseline.\n */\nexport function prepareVerovio(document: SourceDocument, channel = 0): Promise<BaselineInfo> {\n const revision = verovioRevision(document);\n const state = channelState(channel);\n if (!state) return Promise.reject(closed());\n let cached = baselines.get(revision);\n if (cached) {\n baselines.delete(revision); baselines.set(revision, cached);\n return cached.then(info => { adopt(state, revision); return info; });\n }\n // A large previous heap is not reused well by a different score; start from a fresh module instead.\n if (heap > RECYCLE_BEFORE_IMPORT_BYTES && worker) stopWorker(restarted());\n // The engraving goes as a copy of its UTF-8 bytes (transferred), never as a string decoded on the main thread; the\n // document keeps its own bytes, so a restart under the import (another reader's failure) sends them again.\n const send = () => {\n const bytes = document.engravingBytes().slice();\n return request<BaselineInfo>({ kind: 'import', revision, bytes: bytes.buffer, chunking: { force: forceChunks } }, [bytes.buffer]);\n };\n const attempt: Promise<BaselineInfo> = send().catch(error => {\n if (!isRestarted(error)) throw error;\n // The restart cleared the cache: this import is still the one other renders of the revision wait for.\n if (!baselines.has(revision)) baselines.set(revision, attempt);\n return send();\n });\n cached = attempt;\n baselines.set(revision, cached);\n state.importing = revision;\n importsInFlight++;\n const settled = () => { importsInFlight--; if (state.importing === revision) state.importing = undefined; };\n cached.then(info => { adopt(state, revision); currentChunked = !!info.chunked; settled(); releaseUnused(); },\n () => { settled(); if (baselines.get(revision) === cached) baselines.delete(revision); });\n return cached;\n}\n\n/**\n * The baseline for a render. A render never starts importing while its own reader imports another score: that render\n * belongs to the score being replaced (and importing it again could recycle the worker under the new import).\n */\nexport function verovioBaseline(document: SourceDocument, channel = 0): Promise<BaselineInfo> {\n const revision = verovioRevision(document);\n const state = channelState(channel);\n if (!state) return Promise.reject(closed());\n const { importing } = state;\n if (!baselines.has(revision) && importing !== undefined && importing !== revision) return Promise.reject(new VerovioError('Superseded score render.', 'superseded'));\n return prepareVerovio(document, channel);\n}\n\nlet ticket = 0;\n/** A new render generation: the worker answers older queued probes and renders on the same channel `superseded`. */\nexport const nextRenderTicket = () => ++ticket;\n\nasync function withBaseline<T>(document: SourceDocument, channel: number, run: (revision: number) => Promise<T>): Promise<T> {\n const revision = verovioRevision(document);\n await verovioBaseline(document, channel);\n try { return await run(revision); }\n catch (error) {\n // The worker restarted under the request, or dropped this revision while it is still the channel's score:\n // import it again, once.\n const missing = error instanceof VerovioError && error.code === 'missing' && revision === channelState(channel)?.current;\n if (!isRestarted(error) && !missing) throw error;\n // After a restart the cache is already empty (and may hold another reader's fresh re-import of this revision).\n if (missing) baselines.delete(revision);\n await verovioBaseline(document, channel);\n return run(revision);\n }\n}\n\n/** Lay out the first `measures` measures as a small document and return page 1 (the first system). */\nexport function probeVerovio(document: SourceDocument, channel: number, renderTicket: number, view: ViewSpec, options: Record<string, unknown>, measures: number): Promise<ProbeResult> {\n return withBaseline(document, channel, revision => request<ProbeResult>({ kind: 'probe', channel, ticket: renderTicket, revision, view, options, measures, chunkBudget, simulateOom: takeSimulatedOom(channel) || undefined }));\n}\n\n/** Serialize one-based pages of the whole view laid out with `options`; the worker reuses its loaded document when it can. */\nexport function renderVerovioPages(document: SourceDocument, channel: number, renderTicket: number, view: ViewSpec, options: Record<string, unknown>, pages: number[]): Promise<PagesResult> {\n return withBaseline(document, channel, revision => request<PagesResult>({ kind: 'render', channel, ticket: renderTicket, revision, view, options, pages, chunkBudget, simulateOom: takeSimulatedOom(channel) || undefined }));\n}\n","export type MusicFont = 'Bravura' | 'Petaluma';\n\n/**\n * Petaluma 1.065 `engravingDefaults` (steinbergmedia/petaluma redist/petaluma_metadata.json), in staff spaces.\n * Verovio 6.3.0 does not read a font's engravingDefaults on its own, so stems, staff/ledger/bar lines, ties and\n * slurs keep Verovio's thinner built-in widths unless we pass them. Keys Verovio 6.3.0 rejects\n * (arrowShaftThickness, beamSpacing, beamThickness, dashedBarlineThickness) are left out to keep the console clean.\n */\nconst PETALUMA_ENGRAVING_DEFAULTS = {\n barlineSeparation: 0.4, bracketThickness: 0.5, dashedBarlineDashLength: 0.5, dashedBarlineGapLength: 0.25,\n hairpinThickness: 0.16, legerLineExtension: 0.4, legerLineThickness: 0.16, lyricLineThickness: 0.16,\n octaveLineThickness: 0.16, pedalLineThickness: 0.16, repeatBarlineDotSeparation: 0.16, repeatEndingLineThickness: 0.16,\n slurEndpointThickness: 0.1, slurMidpointThickness: 0.22, staffLineThickness: 0.13, stemThickness: 0.12,\n subBracketThickness: 0.16, textEnclosureThickness: 0.16, thickBarlineThickness: 0.5, thinBarlineThickness: 0.16,\n tieEndpointThickness: 0.1, tieMidpointThickness: 0.22, tupletBracketThickness: 0.16,\n};\nconst PETALUMA_OPTIONS = {\n // Without this, Verovio centres Petaluma's time-signature digits on the middle line and they overprint.\n handwrittenFont: ['Petaluma'],\n engravingDefaults: JSON.stringify(PETALUMA_ENGRAVING_DEFAULTS),\n};\n\n/** Extra Verovio options a music font needs beyond `font`. Bravura keeps Verovio's defaults. */\nexport const musicFontOptions = (font: MusicFont | undefined): Record<string, unknown> => font === 'Petaluma' ? PETALUMA_OPTIONS : {};\n","import type { Part, Score, ScoreNote } from './score';\nimport { inferChordSymbol } from './chords';\nimport { spellChordSymbol } from './spelling';\nimport { measureKey, scoreForView, spellingSpecFor } from './transpose';\nimport { isRestarted, isSuperseded, nextRenderTicket, probeVerovio, renderVerovioPages, VerovioError, verovioBaseline } from './verovio-runtime';\nimport { staffDefXmlId, type SourceDocument } from './notation/document';\nimport type { BaselineInfo, ViewSpec } from './notation/mei-view';\nimport { musicFontOptions } from './music-fonts';\nimport { DEFAULT_VERTICAL_BARS, HEIGHT_FIT_STAVES, STAVE_SCALE_FLOOR, STAVE_SCALE_MAX } from './stave-scale';\n\nconst SVG = 'http://www.w3.org/2000/svg';\n\nexport type NotePoint = { id: string; measure: number; part: number; start: number; duration: number; rest?: boolean; x: number; y: number; element?: Element; sourceId?: string; system: number };\nexport type MeasureGeometry = { index: number; system: number; x: number; width: number; y: number; height: number; element?: Element };\nexport type SystemGeometry = { index: number; firstMeasure: number; measureCount: number; width: number; height: number; staffCenters: number[];\n /** The system's engraving is in the DOM; otherwise its block is a placeholder sized from layout data (estimated until first drawn). */\n rendered: boolean };\nexport type RenderResult = { systemSize: number; staffCenters: number[]; scale: number; barWidth: number; systemHeight: number; systems: SystemGeometry[]; visiblePartIds: string[];\n /** Note and measure geometry of the systems currently drawn (see `rendered`); positions are relative to their system block (y: canvas offset at draw time). */\n readonly points: NotePoint[];\n readonly measures: MeasureGeometry[];\n /** Rendered five-line staff height (px) of the first system, the unit staff controls are sized from. */\n stavePx: number;\n /** Smallest distance between adjacent staff centres in the first system (px); Infinity for one staff. */\n staffPitchPx: number;\n /** Left gutter reserved for staff controls before the first system (px). */\n gutter: number;\n /** Stave scale the score was laid out at (px per Verovio unit); the resolved value when 'fit' was requested. */\n zoom: number;\n /** A drawn note by Score note ID. */\n point(id: string): NotePoint | undefined;\n /** A drawn measure by Score measure index. */\n measure(index: number): MeasureGeometry | undefined;\n /** The system (block index) that engraves a Score measure. */\n systemOfMeasure(index: number): number;\n /** Draw a system now (it is otherwise drawn when it scrolls near the viewport). */\n ensureSystem(index: number): Promise<void>;\n /** Called after systems are drawn, released or resized. */\n onChange(listener: () => void): () => void;\n /** Stop drawing systems on demand (a newer render replaced this one). */\n dispose(): void };\nexport type RenderOptions = { font?: 'Bravura' | 'Petaluma'; textFont?: 'Sans' | 'Serif' | 'Mono'; transpose?: number; semitones?: number; scorePitch?: 'written' | 'concert';\n /** Spell in the enharmonic key (with `transpose`, applied when `score` is not already a `scoreForView` result). */\n flip?: boolean; generation?: number; hiddenPartIds?: string[];\n /** The reader's Verovio channel (verovio-runtime openVerovioChannel); every engraving request of this render uses it. */\n channel?: number;\n /**\n * Control gutter for a rendered staff height and staff pitch (px). The layout reserves the gutter for a\n * staff of `STAFF_UNITS * zoom` px before rendering; the final gutter uses the measured staves.\n */\n gutterFor?: (stavePx: number, staffPitchPx: number) => number;\n /** Endless 'fit' zoom (the device's Endless default); a many-staff stack is height-fitted below it. Vertical 'fit' ignores it. */\n fitCap?: number;\n /** Vertical 'fit' is never below this stave scale (compact readability floor); the stack then scrolls. */\n fitFloor?: number;\n /** Draw the system holding this Score measure before resolving (a zoom anchor), besides those in view. */\n focusMeasure?: number };\n\nconst latestGeneration = new WeakMap<HTMLElement, number>();\nconst liveResults = new WeakMap<HTMLElement, RenderResult>();\n/** Endless view keeps one unbroken system up to this many bars, then uses bounded chunks. */\nconst ENDLESS_SINGLE_SYSTEM_LIMIT = 160;\nconst ENDLESS_CHUNK = 120;\n/**\n * A score engraved in chunks (Phase 3) keeps Endless blocks to about this many staff-measures, so each block is a\n * small document (16 to 120 bars).\n */\nconst ENDLESS_CHUNK_STAFF_MEASURES = 480;\nconst endlessChunkBars = (staves: number) => Math.max(16, Math.min(ENDLESS_CHUNK, Math.round(ENDLESS_CHUNK_STAFF_MEASURES / Math.max(1, staves) / 8) * 8));\nconst LANE_GAP = 6;\nconst LANE_ROW = 17;\n/**\n * Scores up to this many staff-measures (visible staves x measures) draw every system before the first paint, as\n * before virtualization; larger ones draw the systems near the viewport and release far ones (see the spec).\n */\nexport const EAGER_STAFF_MEASURES = 1600;\n/** Systems drawn ahead of and behind the viewport, as a multiple of its size (IntersectionObserver root margin). */\nconst NEAR_SCREENS = 2;\n/** Drawn systems beyond this many viewport sizes away are released back to placeholders. */\nconst KEEP_SCREENS = 4;\n/** Pages requested from the worker at once while scrolling. */\nconst PAGE_BATCH = 2;\n\nexport function portraitMinimumBarWidth(score: Score): number {\n let busiest = 4; let lyrics = 0;\n for (const part of score.parts) for (const measure of part.measures) {\n busiest = Math.max(busiest, measure.notes.length);\n let syllables = 0;\n for (const note of measure.notes) if (note.lyric) syllables++;\n lyrics = Math.max(lyrics, syllables);\n }\n return Math.max(190, 50 + busiest * 34, 190 + Math.max(0, busiest - 4) * 44, lyricBarWidth(lyrics));\n}\n// Lyric syllables need roughly a word's width each; without this, Verovio compresses them into collisions.\nconst lyricBarWidth = (syllables: number) => syllables ? 110 + syllables * 62 : 0;\n/** Auto bars per line never exceeds this; explicit choices stay 1-4. */\nexport const AUTO_BAR_CAP = 8;\n/** Five-line staff height in Verovio layout units at `scale: 100` (72px at stave scale 1). */\nexport const STAFF_UNITS = 72;\n/** Most bars that fit a line of `width` Verovio units (the layout width, not px). */\nexport function portraitBarLimit(width: number, score: Score, minimumBar = portraitMinimumBarWidth(score)): number {\n return Math.max(1, Math.min(AUTO_BAR_CAP, score.parts[0]?.measures.length || 1, Math.floor((Math.max(240, width) - 56) / minimumBar)));\n}\n/** Auto bars per line: the width limit, balanced so the last line is not left short. */\nexport function autoBarsPerLine(width: number, score: Score, minimumBar = portraitMinimumBarWidth(score)): number {\n const limit = portraitBarLimit(width, score, minimumBar);\n const count = Math.max(1, score.parts[0]?.measures.length || 1);\n return Math.ceil(count / Math.ceil(count / limit));\n}\n/** Narrowest layout width (Verovio units) that engraves `bars` bars at their minimum width with no width fit (matches `layoutAt`). */\nexport const systemMinimumWidth = (bars: number, barFloor: number) => bars * Math.max(190, barFloor) + 120;\n/** Slack (px) for the measured staff and gutter being a pixel or two larger than the layout model. */\nconst BAR_FIT_SLACK = 4;\n/**\n * Largest stave scale at which `bars` bars fit on the first system (beside the zoom-dependent control gutter) at their\n * minimum width, so Auto yields that many bars per line. Usable width `(viewport - gutter(z)) / z` falls as z grows\n * (the gutter never shrinks with the staff), so a bisection finds it. Deterministic, render-free, rounded down to 0.001.\n */\nexport function barFitZoom(viewportWidth: number, bars: number, barFloor: number, gutterAt: (zoom: number) => number = () => 0): number {\n const need = systemMinimumWidth(bars, barFloor);\n const fits = (zoom: number) => Math.max(180, viewportWidth - gutterAt(zoom) - BAR_FIT_SLACK) / zoom >= need;\n if (fits(STAVE_SCALE_MAX)) return STAVE_SCALE_MAX;\n if (!fits(STAVE_SCALE_FLOOR)) return STAVE_SCALE_FLOOR;\n let low = STAVE_SCALE_FLOOR, high = STAVE_SCALE_MAX;\n for (let step = 0; step < 40; step++) { const mid = (low + high) / 2; if (fits(mid)) low = mid; else high = mid; }\n return Math.floor(low * 1000) / 1000;\n}\n\nfunction parseXml(text: string): XMLDocument {\n const doc = new DOMParser().parseFromString(text, 'application/xml');\n const error = doc.querySelector('parsererror');\n if (error) throw new Error(`Could not parse Verovio output: ${error.textContent?.slice(0, 180)}`);\n return doc;\n}\n\n/**\n * Bounding box of an element in the outer SVG's user (viewBox) coordinates. `rootInverse` is the outer SVG's inverted\n * screen matrix, when the caller measures many elements of one SVG without layout changes in between.\n */\nfunction box(element: Element, svg: SVGSVGElement, rootInverse?: DOMMatrix | null): DOMRect {\n try {\n const graphics = element as SVGGraphicsElement;\n const rect = graphics.getBBox();\n const root = rootInverse !== undefined ? rootInverse : svg.getScreenCTM()?.inverse() ?? null; const own = graphics.getScreenCTM();\n const transform = root && own ? root.multiply(own) : new DOMMatrix();\n const points = [[rect.x, rect.y], [rect.x + rect.width, rect.y], [rect.x, rect.y + rect.height], [rect.x + rect.width, rect.y + rect.height]]\n .map(([x, y]) => new DOMPoint(x, y).matrixTransform(transform));\n const left = Math.min(...points.map(p => p.x)); const top = Math.min(...points.map(p => p.y));\n return new DOMRect(left, top, Math.max(...points.map(p => p.x)) - left, Math.max(...points.map(p => p.y)) - top);\n } catch { return new DOMRect(0, 0, 0, 0); }\n}\n\n/**\n * Map Score parts to Verovio staff numbers. Verovio gives a single-staff\n * MusicXML part's staffDef the part ID, while a multi-staff part's staffGrp\n * carries the part ID; semantic MEI from scoreToMei has deterministic staffDef\n * IDs; original MEI keeps its staff numbers.\n */\nexport function staffNumbers(info: BaselineInfo, score: Score): { byPart: Map<string, string>; engraved: string[] } {\n const defs = info.staffDefs;\n const engraved = [...new Set(defs.map(def => def.n).filter(Boolean))];\n const identity = score.document?.identity?.staffIdToSource || {};\n const byPart = new Map<string, string>();\n const claimed = new Set<string>();\n const claim = (part: Part, def?: { n: string }) => {\n const n = def?.n;\n if (!n || claimed.has(n)) return false;\n byPart.set(part.id, n); claimed.add(n); return true;\n };\n for (const part of score.parts) {\n const legacy = /^(.*)-(\\d+)$/.exec(part.id);\n const source = identity[part.id] || (legacy ? { partId: legacy[1], staff: Number(legacy[2]) } : { partId: part.id, staff: 1 });\n if (claim(part, defs.find(def => [part.id, staffDefXmlId(part.id)].includes(def.id)))) continue;\n const group = info.groups.find(item => item.id === source.partId);\n if (group && claim(part, group.staves[source.staff - 1])) continue;\n if (source.staff === 1 && claim(part, defs.find(def => def.id === source.partId))) continue;\n if (score.document?.format === 'mei' || score.document?.engravingFormat === 'mei') claim(part, defs.find(def => def.n === part.id));\n }\n // Positional fallback only when the remaining parts and staves correspond one to one.\n const unmappedParts = score.parts.filter(part => !byPart.has(part.id));\n const unclaimed = engraved.filter(n => !claimed.has(n));\n if (unmappedParts.length && unmappedParts.length === unclaimed.length) unmappedParts.forEach((part, index) => { byPart.set(part.id, unclaimed[index]); claimed.add(unclaimed[index]); });\n return { byPart, engraved };\n}\n\nfunction beatLabel(start: number, subdivisions: boolean): string {\n const beat = Math.floor(start) + 1;\n if (!subdivisions) return String(beat);\n const fraction = ((start % 1) + 1) % 1;\n return fraction < .01 ? String(beat) : fraction < .3 ? `${beat}e` : fraction < .55 ? `${beat}&` : `${beat}a`;\n}\nfunction annotation(layer: Element, className: string, x: number, y: number, label: string): void {\n const text = document.createElementNS(SVG, 'text');\n text.setAttribute('x', x.toFixed(1)); text.setAttribute('y', y.toFixed(1)); text.setAttribute('text-anchor', 'middle');\n text.setAttribute('class', `annotation ${className}`); text.textContent = label; layer.appendChild(text);\n}\nfunction sourceIds(score: Score, event: ScoreNote): string[] {\n const mapped = score.document?.identity?.noteIdToSourceId?.[event.id];\n return [event.sourceId, mapped, event.id, ...event.pitches.map(p => p.sourceId)].filter((id): id is string => !!id);\n}\n/** Resolve the rendered event for a model note; a chord wins over any one of its noteheads. */\nfunction findNote(byId: Map<string, Element>, score: Score, event: ScoreNote): Element | undefined {\n for (const id of sourceIds(score, event)) {\n const target = byId.get(id);\n if (!target) continue;\n const related = target.closest('.chord') || target.closest('.note, .rest, .mRest, .multiRest');\n if (related) return related;\n }\n return undefined;\n}\n\nconst SVG_ELEMENTS = new Set(['svg', 'g', 'defs', 'symbol', 'use', 'path', 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'text', 'tspan', 'desc', 'title', 'style', 'clippath', 'mask', 'lineargradient', 'radialgradient', 'stop', 'pattern', 'marker', 'metadata']);\nconst SAFE_URL = /url\\(\\s*['\"]?(?!#)/i;\n/** Allowlist sanitizer: only static SVG drawing elements, local references and inert styles survive. */\nfunction sanitizeSvg(doc: XMLDocument): SVGSVGElement {\n if (doc.documentElement.namespaceURI !== SVG || doc.documentElement.localName !== 'svg') throw new Error('Verovio returned invalid SVG.');\n for (const element of Array.from(doc.querySelectorAll('*'))) {\n if (!element.isConnected && !doc.contains(element)) continue;\n if (element.namespaceURI !== SVG || !SVG_ELEMENTS.has(element.localName.toLowerCase())) { element.remove(); continue; }\n if (element.localName === 'style' && (/@import|javascript:|expression\\(/i.test(element.textContent || '') || SAFE_URL.test(element.textContent || ''))) { element.remove(); continue; }\n for (const attribute of Array.from(element.attributes)) {\n const name = attribute.name.toLowerCase();\n const value = attribute.value;\n if (name.startsWith('on')\n || ((name === 'href' || name.endsWith(':href')) && !value.startsWith('#'))\n || SAFE_URL.test(value) || /javascript:/i.test(value)) element.removeAttributeNode(attribute);\n }\n }\n return document.importNode(doc.documentElement, true) as unknown as SVGSVGElement;\n}\n\nconst naturalWidthOf = (svg: string) => Number(/viewBox=\"\\S+\\s+\\S+\\s+([\\d.]+)/.exec(svg)?.[1]) || Infinity;\nconst naturalHeightOf = (svg: string) => Number(/viewBox=\"[^\"]*?\\s([\\d.]+)\"/.exec(svg)?.[1]) || 1;\n/** Auto bars are an estimate: Verovio may still wrap a line inside a page. */\nconst wraps = (svg: string) => (svg.match(/class=\"system\"/g) || []).length > 1;\nconst yieldTask = () => new Promise<void>(resolve => setTimeout(resolve, 0));\n\ntype StaffBand = { top: number; bottom: number; center: number; laneTop: number; lines: boolean };\n/** One system block: drawn (`svg`) or a placeholder holding the size from layout data. */\ntype Slot = {\n index: number;\n block: HTMLElement;\n svg?: SVGSVGElement;\n /** Size in Verovio units: measured once drawn, estimated before. */\n naturalWidth: number; naturalHeight: number; estimated: boolean;\n scale: number;\n firstMeasure: number; measureCount: number;\n bands: Map<string, StaffBand>;\n points: NotePoint[]; measures: MeasureGeometry[];\n loading?: Promise<void>;\n /** Drawing failed; scrolling does not retry it (playback and zoom anchors ask again through ensureSystem). */\n failed?: boolean;\n};\n\n/**\n * Render from the original engraving document through the locally bundled WASM worker.\n *\n * Systems near the viewport are drawn; on a large score the rest are placeholders sized from layout data and are drawn\n * (and far ones released) as the reader scrolls, so DOM size and SVG work stay bounded. The first system comes from a\n * small first-measures document, so the first paint does not wait for the whole score's layout.\n */\nexport async function renderScore(\n container: HTMLElement, score: Score, mode: 'portrait' | 'landscape',\n showNames: boolean, showCounts: boolean, subdivisions: boolean,\n barsPerLine: 'auto' | number, showChordSymbols: boolean, inferChordSymbols: boolean,\n availableHeight = 0, zoom: number | 'fit' = 1, firstSystemGutter = 0, options: RenderOptions = {},\n): Promise<RenderResult> {\n // A caller passing the source Score with pitch options gets its view here (Reader passes `scoreForView`'s result).\n if (!score.pitchView) score = scoreForView(score, score.parts.some(part => part.pitchBasis === 'concert') ? 'concert' : options.scorePitch ?? 'written', options.transpose ?? options.semitones ?? 0, !!options.flip);\n const generation = options.generation ?? (latestGeneration.get(container) || 0) + 1;\n latestGeneration.set(container, generation);\n const isCurrent = () => latestGeneration.get(container) === generation;\n const superseded = () => new VerovioError('Superseded score render.', 'superseded');\n const document_ = score.document;\n if (!document_?.engravingBytes().length) throw new Error('This score has no engraving document.');\n const source: SourceDocument = document_;\n const channel = options.channel ?? 0;\n const info = await verovioBaseline(source, channel);\n if (!isCurrent()) throw superseded();\n const ticket = nextRenderTicket();\n const viewportWidth = Math.max(240, container.clientWidth);\n const count = Math.max(1, score.parts[0]?.measures.length || 1);\n const measureTotal = info.measureIds.length || count;\n // A chunked score is long or wide: Endless keeps one system only when that is still a small document.\n const endlessSingle = mode === 'landscape' && count <= ENDLESS_SINGLE_SYSTEM_LIMIT && !(info.chunked && score.parts.length * count > EAGER_STAFF_MEASURES);\n const minimumBar = Math.max(portraitMinimumBarWidth(score), lyricBarWidth(info.lyricDensity));\n const barFloor = Math.max(190, minimumBar);\n const hiddenIds = new Set(options.hiddenPartIds || []);\n // The gutter for a staff drawn at this zoom (staff pitch is unknown before layout, so this is an upper bound).\n const layoutGutter = (scale: number) => options.gutterFor ? Math.round(options.gutterFor(STAFF_UNITS * scale, Infinity)) : firstSystemGutter;\n\n const { byPart: staffOf, engraved } = staffNumbers(info, score);\n let visibleParts = score.parts.filter(part => !hiddenIds.has(part.id) && staffOf.has(part.id));\n if (!visibleParts.length) visibleParts = score.parts.filter(part => staffOf.has(part.id)).slice(0, 1);\n const shown = new Set(visibleParts.map(part => staffOf.get(part.id)!));\n // Staves without a Score part (for example rest-only template parts that import dropped) are hidden reversibly here.\n const hiddenStaves = shown.size ? engraved.filter(n => !shown.has(n)) : [];\n if (!shown.size) visibleParts = score.parts;\n const visibleIndex = new Map(visibleParts.map((part, index) => [part.id, index]));\n\n // Annotation lanes sit under each staff (below lyrics); reserve room for them in the engraving.\n const annotated = visibleParts.filter(part => part.clef !== 'percussion' || showCounts);\n let nameRows = 0;\n if (showNames) { nameRows = 1; for (const part of annotated) for (const measure of part.measures) for (const note of measure.notes) nameRows = Math.max(nameRows, note.pitches.length); }\n const laneRows = nameRows + (showCounts ? 1 : 0);\n const laneHeight = laneRows ? LANE_GAP + laneRows * LANE_ROW + 4 : 0;\n const spacingStaff = Math.min(48, 12 + Math.ceil(laneHeight / 9) + (showChordSymbols && inferChordSymbols ? 2 : 0));\n\n // Transposition and spelling: the worker moves and respells the baseline (notation/mei-spelling.ts) with the plan\n // `scoreForView` used for this Score view, so the view is loaded untransposed.\n const spelling = spellingSpecFor(score, staffOf);\n // `natural`: one unbroken system at its natural width (Endless, and a Vertical score shorter than a full line).\n const verovioOptions = (pageWidth: number, natural = false): Record<string, unknown> => ({\n breaks: endlessSingle || natural ? 'none' : 'encoded', font: options.font || 'Bravura', fontFallback: 'Bravura',\n pageWidth: Math.min(100000, Math.max(100, Math.round(pageWidth))), pageHeight: 60000,\n pageMarginLeft: 25, pageMarginRight: 25, pageMarginTop: 20, pageMarginBottom: 20,\n adjustPageHeight: true, adjustPageWidth: mode === 'landscape' || natural, svgViewBox: true, scale: 100, xmlIdChecksum: true,\n spacingStaff, smuflTextFont: 'none', header: 'none', footer: 'none', svgAdditionalAttribute: ['staff@n', 'note@pname', 'note@oct'],\n ...musicFontOptions(options.font),\n });\n\n // Layout at a stave scale: Verovio lays out (viewport - gutter) / zoom units, so systems fill the viewport.\n type Layout = { zoom: number; bars: number; centred: boolean; natural: boolean; view: ViewSpec; pageCount: number; firstWidth: number; restWidth: number };\n const layoutAt = (scale: number, maxBars = Infinity): Layout => {\n const usableUnits = Math.max(180, viewportWidth - layoutGutter(scale)) / scale;\n const restUnits = viewportWidth / scale;\n const explicit = mode === 'portrait' && barsPerLine !== 'auto';\n const bars = mode === 'landscape' ? (endlessSingle ? count : info.chunked ? endlessChunkBars(visibleParts.length) : ENDLESS_CHUNK) : barsPerLine === 'auto' ? Math.min(maxBars, autoBarsPerLine(usableUnits, score, minimumBar)) : Math.min(4, Math.max(1, barsPerLine));\n // A score shorter than a full Auto line is not stretched to fill it: one system at Verovio's natural width, centred.\n const fullLine = Math.max(1, Math.min(AUTO_BAR_CAP, Math.floor((Math.max(240, usableUnits) - 56) / minimumBar)));\n const short = mode === 'portrait' && !explicit && count < fullLine;\n const view: ViewSpec = { breakEvery: endlessSingle ? 0 : bars, hiddenStaves, chordSymbols: showChordSymbols, spelling };\n // A bar never gets narrower than its minimum (the system is width-fitted instead); explicit counts are not stretched\n // past a comfortable width, so their systems stay narrower than the viewport and are centred.\n const least = systemMinimumWidth(bars, barFloor);\n const most = explicit ? bars * barFloor * 2 + 120 : Infinity;\n return { zoom: scale, bars, centred: explicit || short, natural: short, view, pageCount: endlessSingle ? 1 : Math.ceil(measureTotal / bars),\n firstWidth: Math.max(least, Math.min(most, usableUnits)), restWidth: Math.max(least, Math.min(most, restUnits)) };\n };\n const probe = async (layout: Layout, natural = false) => {\n const result = await probeVerovio(source, channel, ticket, layout.view, natural ? verovioOptions(layout.firstWidth, true) : verovioOptions(layout.firstWidth), layout.bars);\n if (!isCurrent()) throw superseded();\n return result.svg;\n };\n const restOptions = (layout: Layout) => verovioOptions(mode === 'landscape' ? 100000 : layout.restWidth);\n /** Serialize pages of the whole layout; `pages` are one-based. */\n const fetchPages = async (layout: Layout, pages: number[]) => {\n if (!pages.length) return new Map<number, string>();\n const result = await renderVerovioPages(source, channel, ticket, layout.view, restOptions(layout), pages);\n return new Map(result.pages.map(item => [item.page, item.svg]));\n };\n\n // 'fit' (the default zoom): Endless uses the device cap; Vertical fits DEFAULT_VERTICAL_BARS bars across the first\n // system, so Auto yields that many per line. The stave size depends on the viewport, not the score length: a shorter\n // score gets a shorter, centred system at the same size. Many staves are height-fitted below either.\n const fitCap = mode === 'landscape' ? options.fitCap ?? 1 : barFitZoom(viewportWidth, DEFAULT_VERTICAL_BARS, barFloor, layoutGutter);\n const heightFit = (naturalHeight: number) => visibleParts.length > HEIGHT_FIT_STAVES && availableHeight > 0 ? Math.min(fitCap, availableHeight / naturalHeight) : fitCap;\n const eager = mode === 'landscape' ? endlessSingle || visibleParts.length * count <= EAGER_STAFF_MEASURES : visibleParts.length * count <= EAGER_STAFF_MEASURES;\n\n // Choose the layout. Vertical draws its first system from a probe of the first measures (cheap at any score length):\n // a short score as one natural-width system, a many-staff stack measured for the height fit, and Auto bars reduced\n // while the first line still wraps. Endless lays out the whole score.\n let layout: Layout;\n /** Page SVG by system index (a Vertical system 0 comes from the probe; system k >= 1 is page k + 1 of the whole layout). */\n let fetched = new Map<number, string>();\n let single = false;\n const scroller = container.closest<HTMLElement>('.score-viewport');\n const countOf = (candidate: Layout) => single ? 1 : candidate.pageCount;\n const pageOf = (system: number) => system + 1;\n const systemFor = (candidate: Layout, index: number) => single || endlessSingle ? 0 : Math.max(0, Math.min(countOf(candidate) - 1, Math.floor(index / candidate.bars)));\n // Which systems to draw before the first paint: all of them for a small score; otherwise those in view (from the\n // first system's size) and the zoom anchor's.\n const initialSystems = (candidate: Layout): number[] => {\n const total = countOf(candidate);\n if (eager) return Array.from({ length: total }, (_, index) => index);\n const wanted = new Set<number>([0]);\n if (options.focusMeasure !== undefined) { const focus = systemFor(candidate, options.focusMeasure); for (const index of [focus - 1, focus, focus + 1]) if (index >= 0 && index < total) wanted.add(index); }\n const sample = fetched.get(0);\n if (scroller && sample) {\n const zoomGuess = mode === 'landscape' ? candidate.zoom : Math.min(candidate.zoom, viewportWidth / Math.max(1, candidate.restWidth));\n const step = (mode === 'landscape' ? naturalWidthOf(sample) : naturalHeightOf(sample)) * zoomGuess || 1;\n const view = scroller.getBoundingClientRect(), own = container.getBoundingClientRect();\n const from = mode === 'landscape' ? view.left - own.left : view.top - own.top;\n const size = mode === 'landscape' ? scroller.clientWidth : scroller.clientHeight;\n const firstIndex = Math.max(0, Math.floor(from / step));\n const lastIndex = Math.min(total - 1, Math.ceil((from + size) / step));\n // At the top the first system (from the probe) is enough for the first paint; the rest of the view needs the\n // whole score's layout and is drawn right after. Scrolled further down, the systems in view are drawn first.\n if (firstIndex > 0) for (let index = firstIndex; index <= lastIndex; index++) wanted.add(index);\n }\n return [...wanted].sort((a, b) => a - b);\n };\n\n if (mode === 'landscape') {\n layout = layoutAt(zoom === 'fit' ? fitCap : zoom);\n // Endless: the first pages fix the zoom ('fit' fits the tallest drawn stack), then the rest follow the same scale.\n // A zoom anchor's chunk is drawn too, so the reader's place can be restored from its measure.\n const focus = options.focusMeasure !== undefined ? systemFor(layout, options.focusMeasure) : -1;\n const wanted = eager ? Array.from({ length: layout.pageCount }, (_, index) => index) : [...new Set([0, 1, focus])].filter(index => index >= 0 && index < layout.pageCount);\n const pages = await fetchPages(layout, wanted.map(pageOf));\n if (!isCurrent()) throw superseded();\n fetched = new Map([...pages].map(([page, svg]) => [page - 1, svg]));\n if (zoom === 'fit') layout.zoom = Math.round(heightFit(Math.max(...[...fetched.values()].map(naturalHeightOf))) * 1000) / 1000;\n } else {\n layout = layoutAt(zoom === 'fit' ? Math.max(options.fitFloor ?? 0, fitCap) : zoom);\n let firstSvg = '';\n if (layout.natural) {\n firstSvg = await probe(layout, true);\n single = !wraps(firstSvg) && naturalWidthOf(firstSvg) <= layout.firstWidth + .5;\n }\n if (!single) {\n firstSvg = await probe(layout);\n // Vertical: the bar fit; many staves then measure the first system there and lay out again at the height fit.\n // The readability floor wins over both, so a compact default never draws an unreadably small staff.\n if (zoom === 'fit' && visibleParts.length > HEIGHT_FIT_STAVES) {\n const fitted = Math.max(options.fitFloor ?? 0, Math.round(heightFit(naturalHeightOf(firstSvg)) * 1000) / 1000);\n if (fitted < layout.zoom - .001) { layout = layoutAt(fitted); firstSvg = await probe(layout); }\n }\n }\n for (let attempt = 0; ; attempt++) {\n // The bar-width model is an estimate: while Verovio still wraps an Auto line inside a page, lay out with one bar fewer.\n while (!single && barsPerLine === 'auto' && layout.bars > 1 && wraps(firstSvg)) { layout = layoutAt(layout.zoom, layout.bars - 1); firstSvg = await probe(layout); }\n fetched = new Map([[0, firstSvg]]);\n if (single) break;\n const pages = await fetchPages(layout, initialSystems(layout).filter(index => index > 0).map(pageOf));\n if (!isCurrent()) throw superseded();\n for (const [page, svg] of pages) fetched.set(page - 1, svg);\n if (barsPerLine !== 'auto' || layout.bars <= 1 || ![...pages.values()].some(wraps) || attempt >= 8) break;\n layout = layoutAt(layout.zoom, layout.bars - 1);\n firstSvg = await probe(layout);\n }\n }\n const systemCount = countOf(layout);\n const systemOfMeasure = (index: number) => systemFor(layout, index);\n if (!isCurrent()) throw superseded();\n if (!fetched.size) throw new Error('Verovio did not produce a score page.');\n\n const textFont = options.textFont || 'Sans';\n const parseSvg = (text: string): SVGSVGElement => {\n const svg = sanitizeSvg(parseXml(text));\n const viewBox = (svg.getAttribute('viewBox') || '0 0 1000 200').split(/\\s+/).map(Number);\n // Pin the inner drawing so extending the outer viewBox for annotation lanes never rescales it.\n const inner = svg.querySelector(':scope > svg.definition-scale');\n if (inner) { inner.setAttribute('width', String(viewBox[2] || 1000)); inner.setAttribute('height', String(viewBox[3] || 200)); }\n svg.classList.add('score-svg');\n svg.dataset.textFont = textFont;\n svg.dataset.musicFont = options.font || 'Bravura';\n return svg;\n };\n /**\n * A large score's first paint draws the first system (and a zoom anchor's); other systems fetched with it are kept as\n * text and drawn by the pump one per task, so no main-thread task parses and measures several large systems at once.\n */\n const focusSystem = options.focusMeasure !== undefined ? systemFor(layout, options.focusMeasure) : -1;\n const stash = new Map<number, string>();\n if (!eager) for (const [index, text] of fetched) if (index !== 0 && index !== focusSystem) { stash.set(index, text); fetched.delete(index); }\n // Parse (and sanitize) the systems drawn now, then yield before inserting and measuring them.\n const parsed = new Map([...fetched].map(([index, text]) => [index, parseSvg(text)]));\n fetched.clear();\n if (!eager) {\n await yieldTask();\n if (!isCurrent()) throw superseded();\n }\n liveResults.get(container)?.dispose();\n\n // Build every block; drawn systems get their SVG, the rest stay placeholders until they scroll near.\n const slots: Slot[] = Array.from({ length: systemCount }, (_, index) => {\n const block = document.createElement('div');\n block.className = 'score-system is-pending';\n block.dataset.system = String(index);\n const firstMeasure = single || endlessSingle ? 0 : index * layout.bars;\n block.dataset.firstMeasure = String(firstMeasure + 1);\n const slot: Slot = { index, block, naturalWidth: 0, naturalHeight: 0, estimated: true, scale: 1, firstMeasure, measureCount: single || endlessSingle ? count : Math.min(layout.bars, measureTotal - firstMeasure), bands: new Map(), points: [], measures: [] };\n // A fetched system not drawn yet is sized from its laid-out SVG rather than estimated.\n const text = stash.get(index);\n const width = text ? naturalWidthOf(text) : Infinity;\n if (text && Number.isFinite(width)) { slot.naturalWidth = width; slot.naturalHeight = naturalHeightOf(text); slot.estimated = false; }\n return slot;\n });\n const attach = (slot: Slot, source: string | SVGSVGElement) => {\n const svg = typeof source === 'string' ? parseSvg(source) : source;\n const viewBox = (svg.getAttribute('viewBox') || '0 0 1000 200').split(/\\s+/).map(Number);\n slot.svg = svg; slot.naturalWidth = viewBox[2] || 1000; slot.naturalHeight = viewBox[3] || 200; slot.estimated = false;\n slot.block.classList.remove('is-pending');\n slot.block.replaceChildren(svg);\n };\n const fragment = document.createDocumentFragment();\n for (const slot of slots) {\n const svg = parsed.get(slot.index);\n if (svg) attach(slot, svg);\n fragment.appendChild(slot.block);\n }\n parsed.clear();\n container.replaceChildren(fragment);\n\n const measureIndexById = new Map(info.measureIds.map((id, index) => [id, index]));\n const pointsById = new Map<string, NotePoint>();\n const measuresByIndex = new Map<number, MeasureGeometry>();\n /** Staff bands, lanes, note and measure boxes of a drawn system, in its natural (Verovio) units. */\n const measureGeometry = (slot: Slot) => {\n const svg = slot.svg!;\n slot.bands = new Map();\n // Nothing below changes layout until the annotation layer is appended, so the root matrix is read once.\n let inverse: DOMMatrix | null = null;\n try { inverse = svg.getScreenCTM()?.inverse() ?? null; } catch { /* not rendered */ }\n const boxOf = (element: Element) => box(element, svg, inverse);\n // Staff bands from the first measure of the system, keyed by staff number.\n const measureElements = Array.from(svg.querySelectorAll('g.measure'));\n for (const staff of Array.from(measureElements[0]?.querySelectorAll(':scope > g.staff') || [])) {\n const n = staff.getAttribute('data-n'); if (!n) continue;\n const lines = Array.from(staff.querySelectorAll(':scope > path')).slice(0, 5).map(line => boxOf(line));\n const rect = lines.length ? null : boxOf(staff);\n const top = lines.length ? Math.min(...lines.map(line => line.y)) : rect!.y;\n const bottom = lines.length ? Math.max(...lines.map(line => line.y + line.height)) : rect!.y + rect!.height;\n slot.bands.set(n, { top, bottom, center: (top + bottom) / 2, laneTop: bottom, lines: lines.length > 1 });\n }\n // The lane goes below the staff and anything hanging under it: low notes, lyrics and below-staff directions.\n if (laneRows) {\n const ordered = [...slot.bands.entries()].sort((a, b) => a[1].top - b[1].top);\n const controls = Array.from(svg.querySelectorAll('g.measure > g.dynam, g.measure > g.hairpin, g.measure > g.dir, g.measure > g.pedal')).map(control => boxOf(control));\n ordered.forEach(([n, band], index) => {\n const nextTop = ordered[index + 1]?.[1].top ?? Infinity;\n let lowest = band.bottom;\n // Staff content includes ledger-line notes, stems, articulations and lyrics.\n for (const staff of Array.from(svg.querySelectorAll(`g.staff[data-n=\"${CSS.escape(n)}\"]`))) lowest = Math.max(lowest, boxOf(staff).bottom);\n for (const rect of controls) if (rect.height && rect.top >= band.bottom - 2 && rect.top < band.bottom + (nextTop - band.bottom) / 2) lowest = Math.max(lowest, rect.bottom);\n band.laneTop = lowest + LANE_GAP;\n });\n }\n const byId = new Map<string, Element>();\n for (const element of Array.from(svg.querySelectorAll('[id]'))) byId.set(element.id, element);\n const svgMeasureByIndex = new Map<number, Element>();\n const measureRects: { index: number; element: Element; rect: DOMRect }[] = [];\n measureElements.forEach((element, local) => {\n const index = measureIndexById.get(element.getAttribute('id') || '') ?? -1;\n if (index < 0) return;\n svgMeasureByIndex.set(index, element);\n measureRects.push({ index, element, rect: boxOf(element) });\n if (!local) slot.firstMeasure = index;\n });\n slot.measureCount = svgMeasureByIndex.size || slot.measureCount;\n slot.block.dataset.firstMeasure = String(slot.firstMeasure + 1);\n const layer = document.createElementNS(SVG, 'g');\n layer.setAttribute('class', 'reader-annotations');\n let laneBottom = 0;\n const notes: { element: Element; event: ScoreNote; partIndex: number; measure: number; x: number; y: number }[] = [];\n for (const part of visibleParts) {\n const partIndex = visibleIndex.get(part.id)!;\n const band = slot.bands.get(staffOf.get(part.id) || '');\n for (const [measureIndex, svgMeasure] of svgMeasureByIndex) {\n const measure = part.measures[measureIndex]?.index === measureIndex ? part.measures[measureIndex] : part.measures.find(item => item.index === measureIndex);\n if (!measure) continue;\n for (const event of measure.notes) {\n const element = findNote(byId, score, event);\n if (!element || !svgMeasure.contains(element)) continue;\n const anchor = element.querySelector('.notehead') || element;\n const rect = boxOf(anchor); const x = rect.x + rect.width / 2; const y = rect.y + rect.height / 2;\n element.classList.add('reader-note'); element.setAttribute('data-note-id', event.id);\n notes.push({ element, event, partIndex, measure: measure.index, x, y });\n if (!band) continue;\n const labelled = part.clef !== 'percussion';\n if (showNames && labelled) [...event.pitches].sort((a, b) => b.midi - a.midi).forEach((pitch, row) => annotation(layer, 'note-label', x, band.laneTop + LANE_ROW * (row + 1) - 4, pitch.step));\n if (showCounts) annotation(layer, 'count-label', x, band.laneTop + LANE_ROW * (nameRows + 1) - 4, beatLabel(event.start, subdivisions));\n if (laneRows) laneBottom = Math.max(laneBottom, band.laneTop + laneRows * LANE_ROW + 2);\n if (showChordSymbols && inferChordSymbols && !event.chordSymbol && labelled) {\n // Inferred names follow the view's key like the engraved chord symbols.\n const chord = inferChordSymbol(event.pitches); if (chord) annotation(layer, 'chord-symbol', x, band.top - 20, score.pitchView ? spellChordSymbol(chord, measureKey(part, measure, score)) : chord);\n }\n }\n }\n }\n svg.appendChild(layer);\n if (laneBottom > slot.naturalHeight) {\n slot.naturalHeight = Math.ceil(laneBottom + 4);\n const viewBox = (svg.getAttribute('viewBox') || '').split(/\\s+/).map(Number);\n svg.setAttribute('viewBox', `${viewBox[0] || 0} ${viewBox[1] || 0} ${slot.naturalWidth} ${slot.naturalHeight}`);\n }\n return { notes, measureRects };\n };\n\n // Staff controls scale with the first system's staves, and the first system fits beside the controls' gutter.\n const first = slots[0];\n const firstGeometry = measureGeometry(first);\n const firstBands = visibleParts.map(part => first.bands.get(staffOf.get(part.id) || '')).filter((band): band is StaffBand => !!band);\n const lined = firstBands.find(band => band.lines);\n const staffNatural = lined ? lined.bottom - lined.top : 72;\n const centers = firstBands.map(band => band.center).sort((a, b) => a - b);\n const pitchNatural = centers.slice(1).reduce((least, center, index) => Math.min(least, center - centers[index]), Infinity);\n // Systems draw at the stave scale; a portrait system is only width-fitted when its bars cannot fit at their minimum width.\n const widthLimitFor = (index: number, gutter: number) => index === 0 ? Math.max(180, viewportWidth - gutter) : viewportWidth;\n const scaleFor = (slot: Slot, gutter: number) => mode === 'portrait' ? Math.min(layout.zoom, widthLimitFor(slot.index, gutter) / slot.naturalWidth) : layout.zoom;\n let gutter = layoutGutter(layout.zoom);\n if (options.gutterFor) {\n // Gutter grows with the staff while a wider gutter shrinks a width-fitted staff; damped iteration settles in a few steps.\n for (let step = 0; step < 12; step++) {\n const scale = scaleFor(first, gutter);\n const next = options.gutterFor(staffNatural * scale, pitchNatural * scale);\n if (Math.abs(next - gutter) < .5) { gutter = next; break; }\n gutter = step < 2 ? next : (gutter + next) / 2;\n }\n gutter = Math.round(gutter);\n }\n\n /** Size estimate for a placeholder: Vertical systems span the layout width; heights follow the latest drawn system. */\n let reference = first;\n const estimate = (slot: Slot) => {\n if (mode === 'portrait') { slot.naturalWidth = Math.round(layout.restWidth); slot.naturalHeight = reference.naturalHeight; }\n else { slot.naturalWidth = first.naturalWidth * slot.measureCount / Math.max(1, first.measureCount); slot.naturalHeight = first.naturalHeight; }\n };\n /** Size and place a block; a size change above the viewport keeps the reader's place. */\n const place = (slot: Slot, keepPlace: boolean) => {\n if (slot.estimated) estimate(slot);\n const scale = slot.scale = scaleFor(slot, gutter);\n const { block } = slot;\n const width = slot.naturalWidth * scale, height = slot.naturalHeight * scale;\n const before = keepPlace && scroller ? block.getBoundingClientRect() : null;\n const view = before ? scroller!.getBoundingClientRect() : null;\n const oldSize = before ? (mode === 'landscape' ? before.width : before.height) : 0;\n block.style.width = `${width}px`;\n block.style.height = `${height}px`;\n const minLeft = slot.index === 0 ? gutter : 0;\n // Portrait systems end flush with the viewport; explicit bar counts and short scores narrower than it are centred.\n const left = mode === 'landscape' ? minLeft : layout.centred ? Math.max(minLeft, (viewportWidth - width) / 2) : Math.max(minLeft, viewportWidth - width);\n block.style.marginLeft = left ? `${Math.floor(left)}px` : '';\n if (slot.svg) { slot.svg.style.width = `${width}px`; slot.svg.style.height = `${height}px`; }\n if (before && view) {\n const delta = (mode === 'landscape' ? width : height) - oldSize;\n const above = mode === 'landscape' ? before.right <= view.left + 1 : before.bottom <= view.top + 1;\n if (delta && above) { if (mode === 'landscape') scroller!.scrollLeft += delta; else scroller!.scrollTop += delta; }\n }\n };\n /** Scaled note and measure geometry of a drawn system, indexed for lookups. */\n const record = (slot: Slot, geometry: ReturnType<typeof measureGeometry>) => {\n const { scale, block } = slot;\n const blockTop = block.offsetTop;\n slot.measures = geometry.measureRects.map(({ index, element, rect }) => ({ index, system: slot.index, x: rect.x * scale, width: rect.width * scale, y: blockTop + rect.y * scale, height: rect.height * scale, element }));\n slot.points = geometry.notes.map(note => ({ id: note.event.id, measure: note.measure, part: note.partIndex, start: note.event.start, duration: note.event.duration, rest: note.event.rest, x: note.x * scale, y: blockTop + note.y * scale, element: note.element, sourceId: note.event.sourceId, system: slot.index }));\n for (const measure of slot.measures) measuresByIndex.set(measure.index, measure);\n for (const point of slot.points) pointsById.set(point.id, point);\n };\n const release = (slot: Slot) => {\n if (!slot.svg) return;\n for (const measure of slot.measures) if (measuresByIndex.get(measure.index) === measure) measuresByIndex.delete(measure.index);\n for (const point of slot.points) if (pointsById.get(point.id) === point) pointsById.delete(point.id);\n slot.points = []; slot.measures = []; slot.svg = undefined;\n slot.block.replaceChildren();\n slot.block.classList.add('is-pending');\n };\n\n // Geometry of the systems drawn now (each needs the gutter, which needs the first), then sizes for all blocks.\n const drawn = slots.filter(slot => slot.svg);\n const geometries = new Map(drawn.map(slot => [slot, slot === first ? firstGeometry : measureGeometry(slot)]));\n const rest = drawn.find(slot => slot.index > 0);\n if (rest) reference = rest;\n for (const slot of slots) place(slot, false);\n for (const [slot, geometry] of geometries) record(slot, geometry);\n\n let disposed = false;\n const listeners = new Set<() => void>();\n let notifyQueued = false;\n const notify = () => {\n if (notifyQueued) return;\n notifyQueued = true;\n queueMicrotask(() => { notifyQueued = false; if (!disposed) for (const listener of listeners) listener(); });\n };\n const alive = () => !disposed && isCurrent();\n\n // On-demand drawing: an observer marks systems near the viewport, a pump draws them nearest first (a couple of pages\n // per worker request, one system per task), and systems far away are released back to placeholders.\n const near = new Set<number>();\n let pumping = false;\n const distance = (slot: Slot) => {\n if (!scroller) return slot.index;\n const view = scroller.getBoundingClientRect(), rect = slot.block.getBoundingClientRect();\n return mode === 'landscape' ? Math.abs((rect.left + rect.right) / 2 - (view.left + view.right) / 2) : Math.abs((rect.top + rect.bottom) / 2 - (view.top + view.bottom) / 2);\n };\n const draw = async (wanted: Slot[]) => {\n // A Vertical first system is laid out beside the staff controls, so it comes from the first-measures probe again.\n const reprobe = mode === 'portrait' && wanted.some(slot => slot.index === 0);\n // Systems fetched for the first paint but not drawn then are drawn from their kept SVG.\n const kept = new Map<number, string>();\n for (const slot of wanted) { const text = stash.get(slot.index); if (text) { kept.set(pageOf(slot.index), text); stash.delete(slot.index); } }\n const pages = await fetchPages(layout, wanted.filter(slot => !(reprobe && slot.index === 0) && !kept.has(pageOf(slot.index))).map(slot => pageOf(slot.index)));\n for (const [page, text] of kept) pages.set(page, text);\n if (reprobe) pages.set(pageOf(0), await probe(layout, single));\n for (const slot of wanted) {\n const text = pages.get(pageOf(slot.index));\n if (!alive()) return;\n if (!text || slot.svg) continue;\n attach(slot, text);\n const geometry = measureGeometry(slot);\n if (slot.index > 0 && mode === 'portrait') reference = slot;\n place(slot, true);\n record(slot, geometry);\n notify();\n await yieldTask();\n }\n };\n /**\n * A superseded draw means another render or another score's import owns the worker now. Drawing pauses rather than\n * retrying at once (the rejection can come back in the same microtask turn, which would starve the event loop) and\n * tries again later a bounded number of times, in case this score stays on screen (for example a failed import).\n */\n let supersededDraws = 0;\n let stalled = false;\n let retryTimer = 0;\n const SUPERSEDED_RETRIES = 4;\n const load = (wanted: Slot[]) => {\n const promise = draw(wanted).then(() => { supersededDraws = 0; }, error => {\n // A renderer restarted twice under the draw (other readers running out of memory) stalls the same way.\n if (isSuperseded(error) || isRestarted(error)) { stalled = true; return; }\n if (!alive()) return;\n for (const slot of wanted) if (!slot.svg) slot.failed = true;\n console.warn('Could not draw a score system:', error);\n });\n for (const slot of wanted) slot.loading = promise.finally(() => { slot.loading = undefined; });\n return promise;\n };\n const pump = async () => {\n if (pumping || !alive()) return;\n pumping = true;\n try {\n while (alive()) {\n const pendingSlots = [...near].map(index => slots[index]).filter(slot => !slot.svg && !slot.loading && !slot.failed);\n if (!pendingSlots.length) break;\n pendingSlots.sort((a, b) => distance(a) - distance(b));\n await load(pendingSlots.slice(0, PAGE_BATCH));\n if (stalled) {\n stalled = false;\n if (++supersededDraws <= SUPERSEDED_RETRIES) retryTimer = window.setTimeout(() => void pump(), 1000 * supersededDraws);\n break;\n }\n }\n } finally { pumping = false; }\n };\n const observers: IntersectionObserver[] = [];\n let observeTimer = 0;\n if (!eager && systemCount > 1 && typeof IntersectionObserver !== 'undefined') {\n const margin = (screens: number) => mode === 'landscape' ? `0px ${screens * 100}%` : `${screens * 100}% 0px`;\n const nearObserver = new IntersectionObserver(entries => {\n for (const entry of entries) {\n const index = Number((entry.target as HTMLElement).dataset.system);\n if (entry.isIntersecting) near.add(index); else near.delete(index);\n }\n void pump();\n }, { root: scroller, rootMargin: margin(NEAR_SCREENS) });\n const keepObserver = new IntersectionObserver(entries => {\n let released = false;\n for (const entry of entries) {\n if (entry.isIntersecting) continue;\n const slot = slots[Number((entry.target as HTMLElement).dataset.system)];\n if (slot?.svg && !slot.loading) { release(slot); released = true; }\n }\n if (released) notify();\n }, { root: scroller, rootMargin: margin(KEEP_SCREENS) });\n observers.push(nearObserver, keepObserver);\n // Observing thousands of blocks (and their first callbacks) is real work: it starts after the first paint's task,\n // a batch per task, nearest the start first.\n const OBSERVE_BATCH = 1500;\n const observeFrom = (start: number) => {\n observeTimer = 0;\n if (disposed) return;\n for (const slot of slots.slice(start, start + OBSERVE_BATCH)) { nearObserver.observe(slot.block); keepObserver.observe(slot.block); }\n if (start + OBSERVE_BATCH < slots.length) observeTimer = window.setTimeout(() => observeFrom(start + OBSERVE_BATCH), 0);\n };\n observeTimer = window.setTimeout(() => observeFrom(0), 0);\n }\n\n const firstSystem = (): SystemGeometry => geometryOf(first);\n const geometryOf = (slot: Slot): SystemGeometry => ({ index: slot.index, firstMeasure: slot.firstMeasure, measureCount: slot.measureCount, width: slot.naturalWidth * slot.scale, height: slot.naturalHeight * slot.scale, rendered: !!slot.svg,\n staffCenters: visibleParts.map(part => (slot.bands.get(staffOf.get(part.id) || '')?.center ?? (slot.svg ? NaN : first.bands.get(staffOf.get(part.id) || '')?.center ?? NaN)) * slot.scale) });\n const head = firstSystem();\n const firstCenters = head.staffCenters.map((center, index) => Number.isFinite(center) ? center : (head.staffCenters[index - 1] ?? 0) + 80 * first.scale);\n const result: RenderResult = {\n systemSize: layout.bars, staffCenters: firstCenters, scale: first.scale, visiblePartIds: visibleParts.map(part => part.id),\n barWidth: Math.max(1, head.width) / Math.max(1, head.measureCount || layout.bars), systemHeight: head.height,\n stavePx: staffNatural * first.scale, staffPitchPx: pitchNatural * first.scale, gutter, zoom: layout.zoom,\n get systems() { return slots.map(geometryOf); },\n get points() { return slots.flatMap(slot => slot.points); },\n get measures() { return slots.flatMap(slot => slot.measures); },\n point: id => pointsById.get(id),\n measure: index => measuresByIndex.get(index),\n systemOfMeasure,\n ensureSystem: async index => {\n const slot = slots[index];\n if (!slot || slot.svg || !alive()) return;\n slot.failed = false;\n await (slot.loading || load([slot]));\n },\n onChange: listener => { listeners.add(listener); return () => listeners.delete(listener); },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n window.clearTimeout(retryTimer);\n window.clearTimeout(observeTimer);\n for (const observer of observers) observer.disconnect();\n listeners.clear();\n if (liveResults.get(container) === result) liveResults.delete(container);\n },\n };\n liveResults.set(container, result);\n return result;\n}\n","/**\n * Staff-control sizing. Every dimension of a `.part-control` (instrument icon,\n * name font, focus and hide buttons) and the first-system control gutter is derived from\n * the rendered five-line staff height in CSS px, so controls keep a constant\n * ratio to the stave across zoom, width fit, many-staff height fit and\n * Vertical/Endless. Clamps keep them legible and inside their staff's band.\n */\nexport type PartControlMetrics = { stavePx: number; icon: number; font: number; eye: number; height: number; gutter: number };\nexport type PartControlLimits = {\n /** Smallest distance between adjacent staff centres (px); controls never grow past it. */\n staffPitchPx?: number;\n /** Largest gutter the viewport can spare (px). */\n maxGutter?: number;\n /** How many small buttons (focus, hide) each control carries. */\n buttons?: number;\n};\n\n/** Icon and name font as a fraction of the five-line staff height (double the original 28px icon / 11px name on a 72px staff). */\nexport const ICON_RATIO = 56 / 72;\nexport const FONT_RATIO = 22 / 72;\nconst ICON_MIN = 22, ICON_MAX = 104;\nconst FONT_MIN = 11, FONT_MAX = 30;\nconst EYE_MIN = 24, EYE_MAX = 40;\nconst PAD = 8, GAP = 4;\n/** Room for roughly nine characters of part name before it ellipsizes. */\nconst NAME_EMS = 5;\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\n\nexport function partControlMetrics(stavePx: number, { staffPitchPx = Infinity, maxGutter = Infinity, buttons = 0 }: PartControlLimits = {}): PartControlMetrics {\n const s = Number.isFinite(stavePx) && stavePx > 0 ? stavePx : 72;\n // Adjacent controls must not overlap: cap the control height a little under the staff pitch.\n const room = Number.isFinite(staffPitchPx) && staffPitchPx > 0 ? Math.max(18, staffPitchPx - 4) : Infinity;\n const icon = Math.round(Math.min(room, clamp(s * ICON_RATIO, ICON_MIN, ICON_MAX)));\n const font = Math.round(Math.min(room * .6, clamp(s * FONT_RATIO, FONT_MIN, FONT_MAX)) * 10) / 10;\n const eyeSize = buttons > 0 ? Math.round(Math.min(room, clamp(icon * .7, EYE_MIN, EYE_MAX))) : 0;\n const fixed = PAD + icon + GAP + buttons * (GAP + eyeSize);\n const gutter = Math.round(Math.max(fixed + font * 2, Math.min(maxGutter, fixed + font * NAME_EMS)));\n return { stavePx: s, icon, font, eye: eyeSize, height: Math.max(icon, eyeSize, Math.ceil(font * 1.3)), gutter };\n}\n","/**\n * Header controls registry.\n *\n * Maintainers: edit this list to reorder header controls or move them between\n * tiers. Array order is render order. `primary` controls always sit inline in\n * the header; `secondary` controls sit inline above MOBILE_HEADER_BREAKPOINT\n * and move into the \"More controls\" dropdown at or below it. PepperScore.tsx maps\n * each id to its element; every control is always rendered (`bars` is disabled outside Vertical view, `keyFlip` when the key has no enharmonic) so the\n * header footprint never depends on client-only state.\n */\nexport type HeaderControlId = 'stop' | 'play' | 'openFile' | 'bpm' | 'transpose' | 'keyFlip' | 'mode' | 'bars' | 'staveScale' | 'mixer';\nexport type HeaderControlTier = 'primary' | 'secondary';\nexport type HeaderControlConfig = { id: HeaderControlId; tier: HeaderControlTier };\n\nexport const HEADER_CONTROLS = [\n { id: 'stop', tier: 'primary' },\n { id: 'play', tier: 'primary' },\n { id: 'openFile', tier: 'primary' },\n { id: 'mode', tier: 'primary' },\n { id: 'bpm', tier: 'secondary' },\n { id: 'transpose', tier: 'secondary' },\n { id: 'keyFlip', tier: 'secondary' },\n { id: 'bars', tier: 'secondary' },\n { id: 'staveScale', tier: 'secondary' },\n { id: 'mixer', tier: 'secondary' },\n] as const satisfies readonly HeaderControlConfig[];\n\n/** Reader root width (px) at or below which secondary controls collapse into the \"More controls\" dropdown (`@container pepperscore (max-width:760px)` in styles.css). */\nexport const MOBILE_HEADER_BREAKPOINT = 760;\n\n/** Stave scale (zoom) bounds shared by the header slider and pinch zoom live with the defaults in stave-scale.ts. */\nexport { clampStaveScale, STAVE_SCALE_MAX, STAVE_SCALE_MIN, STAVE_SCALE_STEP } from './stave-scale';\n\n/** Which `controls` key shows each header control (see chrome.ts). */\nexport const HEADER_CONTROL_GROUP: Record<HeaderControlId, 'transport' | 'viewToggle' | 'openFile' | 'zoom' | 'mixer'> = {\n stop: 'transport', play: 'transport', bpm: 'transport', transpose: 'transport', keyFlip: 'transport', bars: 'transport',\n mode: 'viewToggle', openFile: 'openFile', staveScale: 'zoom', mixer: 'mixer',\n};\n","/** Chrome presets (docs/specs/pepperscore-embeddable-component.md, \"Chrome presets\") and per-control overrides. No runtime imports. */\nexport type ChromePreset = 'full' | 'minimal' | 'none';\nexport type PepperScoreControls = Partial<Record<'mixer' | 'openFile' | 'drawer' | 'transport' | 'viewToggle' | 'zoom', boolean>>;\nexport type ResolvedChrome = {\n header: boolean; transport: boolean; viewToggle: boolean; openFile: boolean; mixer: boolean; drawer: boolean; zoom: boolean;\n /** The overlaid play/stop button of `minimal`. */\n compactPlay: boolean;\n /** Playhead, note highlight and follow. */\n playhead: boolean;\n /** Part icons, instrument picker and stave eyes (they follow `mixer`). */\n partControls: boolean;\n /** Whether playback (and so any audio asset) can load at all. */\n audio: boolean;\n};\n\n/**\n * `transport` covers stop, play, BPM, transpose, key flip and bars; `viewToggle` the Vertical/Endless toggle; `openFile` the\n * Open button, file input, open dialog and reopen offer; `mixer` the mixer and the part icons / instrument picker / stave\n * eyes; `zoom` the stave-scale slider, pinch zoom and the page arrows row; `drawer` the bottom drawer and its handle.\n */\nexport function resolveChrome(preset: ChromePreset = 'full', controls: PepperScoreControls = {}): ResolvedChrome {\n const on = (key: keyof PepperScoreControls) => controls[key] ?? preset === 'full';\n const transport = on('transport'), viewToggle = on('viewToggle'), openFile = on('openFile'), mixer = on('mixer'), drawer = on('drawer'), zoom = on('zoom');\n return {\n header: transport || viewToggle || openFile || mixer || zoom,\n transport, viewToggle, openFile, mixer, drawer, zoom,\n compactPlay: preset === 'minimal' && !transport,\n playhead: preset !== 'none' || transport,\n partControls: mixer,\n audio: preset !== 'none' || transport,\n };\n}\n","/**\n * Per-score memory: a small IndexedDB store of FileState v2 records keyed by source hash.\n *\n * Database `scoreflow` by default (`dbName`; storage.ts uses the reader's persist namespace), object store `scores`\n * (key path `source.sha256`, index `lastOpened`). localStorage keys carry `keyPrefix` (default `scoreflow`).\n * The first read of a hash falls back to the localStorage v1 record and imports it; the\n * v1 copy is removed after the next successful IndexedDB write. When IndexedDB is\n * unavailable (private mode, blocked) records go to localStorage instead. All access is\n * wrapped in try/catch, writes are debounced and never block rendering, and only the most\n * recently opened MAX_SCORE_RECORDS scores are kept. Only settings and hashes are stored.\n *\n * Write-ahead: an IndexedDB transaction started while the page unloads may never complete, so\n * `persistPending()` (called on pagehide / visibilitychange→hidden) synchronously copies queued\n * records to localStorage `scoreflow-pending-v2:<hash>` and still kicks the IndexedDB write. A read\n * prefers a pending copy newer than the stored record, persists it, and the pending key is removed\n * after the next successful write.\n */\nimport type { Score } from './score';\nimport { legacyStorageKey, migrateFileState, parseFileState, parseLegacyFileState, textSource, type FileSource, type FileState } from './file-state';\nimport { deviceClass, type DeviceClass } from './stave-scale';\n\nexport const SCORE_DB_NAME = 'scoreflow';\nexport const SCORE_STORE = 'scores';\nexport const MAX_SCORE_RECORDS = 200;\nexport const SCORE_WRITE_DEBOUNCE_MS = 400;\n\nexport type ScoreDbOptions = {\n /** IndexedDB factory; `null` forces the localStorage fallback. Defaults to `globalThis.indexedDB`. */\n indexedDB?: Pick<IDBFactory, 'open'> | null;\n /** Fallback and legacy storage; `null` disables it. Defaults to `globalThis.localStorage`. */\n storage?: Storage | null;\n dbName?: string;\n /** Prefix of the localStorage keys (`<prefix>-file-v2:`, `<prefix>-pending-v2:`, legacy `<prefix>-file-v1:`). Defaults to `scoreflow`. */\n keyPrefix?: string;\n maxRecords?: number;\n debounceMs?: number;\n /** Device class a migrated v1 zoom is attributed to. */\n device?: () => DeviceClass;\n};\nexport type ScoreDb = {\n read(source: FileSource): Promise<FileState | null>;\n /** Queue a record; writes for the same hash within the debounce window coalesce. */\n write(state: FileState): void;\n /** Write every queued record now. */\n flush(): Promise<void>;\n /** Synchronously save queued records to the localStorage write-ahead keys, then start writing them. For page unload. */\n persistPending(): void;\n keys(): Promise<string[]>;\n backend(): Promise<'indexeddb' | 'localstorage' | 'none'>;\n};\n\nconst settle = <T>(request: IDBRequest<T>) => new Promise<T>((resolve, reject) => { request.onsuccess = () => resolve(request.result); request.onerror = () => reject(request.error); });\nconst done = (transaction: IDBTransaction) => new Promise<void>((resolve, reject) => { transaction.oncomplete = () => resolve(); transaction.onerror = transaction.onabort = () => reject(transaction.error || new Error('IndexedDB transaction failed.')); });\n\nexport function createScoreDb(options: ScoreDbOptions = {}): ScoreDb {\n const dbName = options.dbName ?? SCORE_DB_NAME;\n const maxRecords = options.maxRecords ?? MAX_SCORE_RECORDS;\n const debounceMs = options.debounceMs ?? SCORE_WRITE_DEBOUNCE_MS;\n const device = options.device ?? deviceClass;\n const prefix = options.keyPrefix ?? 'scoreflow';\n const fallbackPrefix = `${prefix}-file-v2:`;\n const fallbackKey = (hash: string) => `${fallbackPrefix}${hash}`;\n const pendingKey = (hash: string) => `${prefix}-pending-v2:${hash}`;\n const legacyKey = (hash: string) => legacyStorageKey(hash, prefix);\n const storage = (): Storage | null => {\n if (options.storage !== undefined) return options.storage;\n try { return globalThis.localStorage ?? null; } catch { return null; }\n };\n let opening: Promise<IDBDatabase | null> | undefined;\n const open = () => opening ??= new Promise<IDBDatabase | null>(resolve => {\n try {\n const factory = options.indexedDB !== undefined ? options.indexedDB : globalThis.indexedDB;\n if (!factory) { resolve(null); return; }\n const request = factory.open(dbName, 1);\n request.onupgradeneeded = () => {\n const store = request.result.createObjectStore(SCORE_STORE, { keyPath: 'source.sha256' });\n store.createIndex('lastOpened', 'lastOpened');\n };\n request.onsuccess = () => {\n const db = request.result;\n db.onversionchange = () => { db.close(); opening = undefined; };\n resolve(db);\n };\n request.onerror = () => resolve(null);\n request.onblocked = () => resolve(null);\n } catch { resolve(null); }\n });\n\n const readLocal = (hash: string): FileState | null => {\n try { return parseFileState(storage()?.getItem(fallbackKey(hash)), hash); } catch { return null; }\n };\n const readLegacy = (hash: string): FileState | null => {\n try {\n const legacy = parseLegacyFileState(storage()?.getItem(legacyKey(hash)), hash);\n return legacy && migrateFileState(legacy, device());\n } catch { return null; }\n };\n const writeLocal = (state: FileState): boolean => {\n const store = storage();\n if (!store) return false;\n try {\n store.setItem(fallbackKey(state.source.sha256), JSON.stringify(state));\n const records = localKeys(store).map(hash => ({ hash, lastOpened: readLocal(hash)?.lastOpened ?? 0 })).sort((a, b) => a.lastOpened - b.lastOpened);\n for (const { hash } of records.slice(0, Math.max(0, records.length - maxRecords))) store.removeItem(fallbackKey(hash));\n return true;\n } catch { return false; /* Storage may be full or unavailable; the session still works. */ }\n };\n const localKeys = (store: Storage) => {\n const hashes: string[] = [];\n for (let index = 0; index < store.length; index++) { const key = store.key(index); if (key?.startsWith(fallbackPrefix)) hashes.push(key.slice(fallbackPrefix.length)); }\n return hashes;\n };\n\n /** A write-ahead copy for `hash`, when valid: its state and when it was queued. */\n const readPending = (hash: string): { updatedAt: number; state: FileState } | null => {\n try {\n const raw = JSON.parse(storage()?.getItem(pendingKey(hash)) || 'null');\n const state = raw && Number.isFinite(raw.updatedAt) ? parseFileState(raw.state, hash) : null;\n return state ? { updatedAt: raw.updatedAt, state } : null;\n } catch { return null; }\n };\n const dropPending = (hash: string) => { try { storage()?.removeItem(pendingKey(hash)); } catch { /* ignore */ } };\n /** Newest of the stored record and a pending write-ahead copy; a newer pending copy is queued to be persisted. */\n const withPending = (hash: string, stored: FileState | null): FileState | null => {\n const pending = readPending(hash);\n if (!pending) return stored;\n if (stored && stored.lastOpened >= pending.updatedAt) { dropPending(hash); return stored; }\n queue(pending.state);\n return structuredClone(pending.state);\n };\n const writeDb = async (db: IDBDatabase, state: FileState) => {\n const transaction = db.transaction(SCORE_STORE, 'readwrite');\n const store = transaction.objectStore(SCORE_STORE);\n store.put(state);\n const count = await settle(store.count());\n if (count > maxRecords) {\n let excess = count - maxRecords;\n const cursor = store.index('lastOpened').openCursor();\n await new Promise<void>((resolve, reject) => {\n cursor.onsuccess = () => {\n const current = cursor.result;\n if (!current || excess <= 0) { resolve(); return; }\n if (current.primaryKey !== state.source.sha256) { current.delete(); excess--; }\n current.continue();\n };\n cursor.onerror = () => reject(cursor.error);\n });\n }\n await done(transaction);\n };\n\n const pending = new Map<string, FileState>();\n let timer: ReturnType<typeof setTimeout> | undefined;\n let flushing: Promise<void> = Promise.resolve();\n const flushNow = async () => {\n clearTimeout(timer); timer = undefined;\n const batch = [...pending.values()];\n pending.clear();\n if (!batch.length) return;\n const db = await open();\n for (const state of batch) {\n if (db) {\n try {\n await writeDb(db, state);\n // The legacy copy (and any fallback copy) is dropped once IndexedDB holds the record.\n try { storage()?.removeItem(legacyKey(state.source.sha256)); storage()?.removeItem(fallbackKey(state.source.sha256)); } catch { /* ignore */ }\n dropPending(state.source.sha256);\n continue;\n } catch { /* fall back below */ }\n }\n if (writeLocal(state)) dropPending(state.source.sha256);\n }\n };\n const flush = () => (flushing = flushing.then(flushNow, flushNow));\n const queue = (state: FileState) => {\n pending.set(state.source.sha256, structuredClone(state));\n clearTimeout(timer);\n if (debounceMs <= 0) void flush();\n else timer = setTimeout(() => void flush(), debounceMs);\n };\n\n return {\n async read(source) {\n const hash = source.sha256;\n const queued = pending.get(hash);\n if (queued) return structuredClone(queued);\n const db = await open();\n if (db) {\n try {\n const stored = await settle(db.transaction(SCORE_STORE, 'readonly').objectStore(SCORE_STORE).get(hash));\n const state = stored === undefined ? null : parseFileState(stored, hash);\n if (state) return withPending(hash, state);\n } catch { /* fall back to localStorage */ }\n }\n return withPending(hash, readLocal(hash) ?? readLegacy(hash));\n },\n write: queue,\n flush,\n persistPending() {\n if (!pending.size) return;\n const updatedAt = Date.now();\n for (const state of pending.values()) {\n try { storage()?.setItem(pendingKey(state.source.sha256), JSON.stringify({ updatedAt, state })); } catch { /* storage full or unavailable */ }\n }\n void flush();\n },\n async keys() {\n const db = await open();\n if (db) {\n try { return (await settle(db.transaction(SCORE_STORE, 'readonly').objectStore(SCORE_STORE).getAllKeys())).map(String); }\n catch { /* fall through */ }\n }\n const store = storage();\n return store ? localKeys(store) : [];\n },\n async backend() { return (await open()) ? 'indexeddb' : storage() ? 'localstorage' : 'none'; },\n };\n}\n\n/** The app-wide store; IndexedDB opens lazily on first use. */\nexport const scoreDb = createScoreDb();\n\n/** Stable identity of the built-in sample: its engraving text with its format prefix. */\nexport const sampleSource = (score: Score): FileSource => textSource(score.document?.format || 'sample', score.document?.originalText || '', score.title || 'Sample score');\n","import type { FileSettings } from './file-state';\n\n/** Reader settings; `zoom` is the score's explicit stave scale, or null for the device default (see stave-scale.ts). */\nexport type Prefs = FileSettings & { zoom: number | null };\nexport const defaults: Prefs = { mode: 'portrait', notationFont: 'Bravura', barsPerLine: 'auto', overlap: 1, names: false, chordSymbols: false, inferChordSymbols: false, counts: false, subdivisions: false, annotationFont: 'Sans', bpm: 96, zoom: null, semitones: 0, scorePitch: 'written', keyFlip: false };\n\n/** Saved global prefs, repaired. Zoom is per score (score-db), so a legacy global zoom is ignored. */\nexport function sanitizeSavedPrefs(raw: unknown): Prefs {\n const { zoom: _legacyZoom, ...saved } = (raw && typeof raw === 'object' ? raw : {}) as Record<string, unknown>;\n const next = { ...defaults, ...saved, zoom: null } as Prefs;\n if (typeof next.barsPerLine === 'number') next.barsPerLine = Math.max(1, Math.min(4, next.barsPerLine));\n if (!Number.isInteger(next.semitones)) next.semitones = 0;\n next.semitones = Math.max(-12, Math.min(12, next.semitones));\n if (!['written', 'concert'].includes(next.scorePitch)) next.scorePitch = 'written';\n if (typeof next.keyFlip !== 'boolean') next.keyFlip = false;\n if (!['Sans', 'Serif', 'Mono'].includes(next.annotationFont)) next.annotationFont = 'Sans';\n return next;\n}\n\n/** Initial reader settings a host passes as `settings` (spec names). Changing a key in the prop re-applies that key. */\nexport type PepperScoreSettings = Partial<{\n noteNames: boolean; chordSymbols: boolean; inferChords: boolean; beatCounts: boolean; subdivisions: boolean;\n musicFont: 'Bravura' | 'Petaluma'; staveFont: 'Sans' | 'Serif' | 'Mono'; barsPerLine: 'auto' | number;\n /** Explicit stave scale (clamped to the slider range when applied), or null for the device default. */\n zoom: number | null;\n semitones: number; concert: boolean; overlap: number;\n}>;\nconst clamp = (value: number, low: number, high: number) => Math.max(low, Math.min(high, Math.round(value)));\n\nexport function settingsToPrefs(settings: PepperScoreSettings = {}): Partial<Prefs> {\n const out: Partial<Prefs> = {};\n if (settings.noteNames !== undefined) out.names = settings.noteNames;\n if (settings.chordSymbols !== undefined) out.chordSymbols = settings.chordSymbols;\n if (settings.inferChords !== undefined) out.inferChordSymbols = settings.inferChords;\n if (settings.beatCounts !== undefined) out.counts = settings.beatCounts;\n if (settings.subdivisions !== undefined) out.subdivisions = settings.subdivisions;\n if (settings.musicFont !== undefined) out.notationFont = settings.musicFont;\n if (settings.staveFont !== undefined) out.annotationFont = settings.staveFont;\n if (settings.barsPerLine !== undefined) out.barsPerLine = settings.barsPerLine === 'auto' ? 'auto' : clamp(settings.barsPerLine, 1, 4);\n if (settings.zoom !== undefined) out.zoom = settings.zoom;\n if (settings.semitones !== undefined) out.semitones = clamp(settings.semitones, -12, 12);\n if (settings.concert !== undefined) out.scorePitch = settings.concert ? 'concert' : 'written';\n if (settings.overlap !== undefined) out.overlap = clamp(settings.overlap, 0, 3);\n return out;\n}\nexport const viewToMode = (view: 'vertical' | 'endless'): Prefs['mode'] => view === 'endless' ? 'landscape' : 'portrait';\n","/**\n * The last opened score file, kept on this device so the reader can offer to reopen it after a reload or crash\n * (docs/specs/large-score-performance.md, Phase 3 \"Guardrails\"). It is never opened automatically.\n *\n * Database `<namespace>-last-file` (`scoreflow-last-file` for the Scoreflow names, see storage.ts), object store\n * `last-file` with two out-of-line keys: `info` (name, type, size, lastModified, savedAt) and `bytes` (the\n * original file bytes, stored as the Blob itself so a large file is not read\n * and cloned on the main thread; an ArrayBuffer is also accepted), written in one transaction, so the\n * offer can be shown without loading the bytes. Only files up to MAX_SCORE_FILE_BYTES are kept. Every access is\n * wrapped in try/catch: without IndexedDB (private mode, blocked) nothing is remembered and nothing throws.\n */\nimport { MAX_SCORE_FILE_BYTES } from './mxl';\n\nexport const LAST_FILE_DB_NAME = 'scoreflow-last-file';\nexport const LAST_FILE_STORE = 'last-file';\nconst INFO_KEY = 'info';\nconst BYTES_KEY = 'bytes';\n\nexport type LastFileInfo = { name: string; type: string; size: number; lastModified: number; savedAt: number };\nexport type LastFileRecord = LastFileInfo & { bytes: Blob | ArrayBuffer };\n\nconst settle = <T>(request: IDBRequest<T>) => new Promise<T>((resolve, reject) => { request.onsuccess = () => resolve(request.result); request.onerror = () => reject(request.error); });\nconst done = (transaction: IDBTransaction) => new Promise<void>((resolve, reject) => { transaction.oncomplete = () => resolve(); transaction.onerror = transaction.onabort = () => reject(transaction.error || new Error('IndexedDB transaction failed.')); });\n\nconst isInfo = (value: unknown): value is LastFileInfo => {\n const info = value as LastFileInfo | null;\n return !!info && typeof info.name === 'string' && typeof info.type === 'string' && Number.isFinite(info.size) && Number.isFinite(info.lastModified) && Number.isFinite(info.savedAt);\n};\nconst infoOf = (info: LastFileInfo): LastFileInfo => ({ name: info.name, type: info.type, size: info.size, lastModified: info.lastModified, savedAt: info.savedAt });\n/** Whether `file` is the remembered one (same name, type, size and modification time). */\nexport const isSameFile = (info: LastFileInfo | null, file: Pick<File, 'name' | 'type' | 'size' | 'lastModified'>) =>\n !!info && info.name === file.name && info.type === file.type && info.size === file.size && info.lastModified === file.lastModified;\n\n/** A File for the normal open path, rebuilt from a remembered record. */\nexport const lastFileToFile = (record: LastFileRecord) => new File([record.bytes], record.name, { type: record.type, lastModified: record.lastModified });\n\n/** The last-file store of one persist namespace (see storage.ts). Every method resolves and never rejects. */\nexport type LastFileStore = {\n /** The remembered file's details, without its bytes; null when there is none or storage is unavailable. */\n readInfo(): Promise<LastFileInfo | null>;\n /** The remembered file with its bytes; null when there is none, it is incomplete, or storage is unavailable. */\n read(): Promise<LastFileRecord | null>;\n /**\n * Remember `file` (its original bytes) as the last opened file, replacing any previous one. Files above\n * MAX_SCORE_FILE_BYTES are not kept. Resolves to the stored details, or null when nothing was stored.\n */\n remember(file: File): Promise<LastFileInfo | null>;\n /** Delete the remembered file. */\n forget(): Promise<void>;\n};\nconst disabled: LastFileStore = { readInfo: async () => null, read: async () => null, remember: async () => null, forget: async () => {} };\n\n/** The store in database `dbName` (LAST_FILE_DB_NAME for the Scoreflow names); `null` remembers nothing. */\nexport function createLastFileStore(dbName: string | null): LastFileStore {\n if (!dbName) return disabled;\n let opening: Promise<IDBDatabase | null> | undefined;\n const open = (): Promise<IDBDatabase | null> => opening ??= new Promise<IDBDatabase | null>(resolve => {\n try {\n const factory = globalThis.indexedDB;\n if (!factory) { resolve(null); return; }\n const request = factory.open(dbName, 1);\n request.onupgradeneeded = () => { request.result.createObjectStore(LAST_FILE_STORE); };\n request.onsuccess = () => {\n const db = request.result;\n db.onversionchange = () => { db.close(); opening = undefined; };\n resolve(db);\n };\n request.onerror = () => resolve(null);\n request.onblocked = () => resolve(null);\n } catch { resolve(null); }\n }).then(db => { if (!db) opening = undefined; return db; });\n\n return {\n async readInfo() {\n try {\n const db = await open();\n if (!db) return null;\n const value = await settle(db.transaction(LAST_FILE_STORE, 'readonly').objectStore(LAST_FILE_STORE).get(INFO_KEY));\n return isInfo(value) ? infoOf(value) : null;\n } catch { return null; }\n },\n async read() {\n try {\n const db = await open();\n if (!db) return null;\n const store = db.transaction(LAST_FILE_STORE, 'readonly').objectStore(LAST_FILE_STORE);\n const [info, bytes] = await Promise.all([settle(store.get(INFO_KEY)), settle(store.get(BYTES_KEY))]);\n if (!isInfo(info) || !(bytes instanceof Blob || bytes instanceof ArrayBuffer)) return null;\n return { ...infoOf(info), bytes };\n } catch { return null; }\n },\n async remember(file) {\n try {\n if (file.size > MAX_SCORE_FILE_BYTES) return null;\n const db = await open();\n if (!db) return null;\n // The File itself is stored: IndexedDB keeps a Blob without the page reading or cloning its bytes.\n const bytes: Blob = file;\n const info: LastFileInfo = { name: file.name, type: file.type, size: file.size, lastModified: file.lastModified, savedAt: Date.now() };\n const transaction = db.transaction(LAST_FILE_STORE, 'readwrite');\n const store = transaction.objectStore(LAST_FILE_STORE);\n store.put(bytes, BYTES_KEY);\n store.put(info, INFO_KEY);\n await done(transaction);\n return info;\n } catch { return null; }\n },\n async forget() {\n try {\n const db = await open();\n if (!db) return;\n const transaction = db.transaction(LAST_FILE_STORE, 'readwrite');\n transaction.objectStore(LAST_FILE_STORE).clear();\n await done(transaction);\n } catch { /* nothing to forget */ }\n },\n };\n}\n","import { createScoreDb, type ScoreDb } from './score-db';\nimport { createLastFileStore, type LastFileStore } from './last-file';\n\n/**\n * Where a reader keeps its state: `persist` names the namespace (`<ns>-prefs`, `<ns>-file-v2:<hash>`, IndexedDB `<ns>` and\n * `<ns>-last-file`, sessionStorage `<ns>-reopen-dismissed`). `persist=\"scoreflow\"` gives exactly the original Scoreflow\n * names, so existing visitors keep their settings. `false` reads and writes nothing.\n *\n * Not namespaced: the diagnostic and test hooks `scoreflow-chunking`, `scoreflow-simulate-oom` (verovio-runtime.ts) and\n * `scoreflow-large-file-bytes` (large-file.ts). Set by tests or by hand (the reader only clears\n * `scoreflow-simulate-oom` once it fires), they are diagnostics exempt from `persist`.\n */\nexport type PersistNamespace = string | false;\nexport type ReaderStorage = {\n namespace: PersistNamespace;\n readPrefs(): unknown;\n writePrefs(prefs: object): void;\n reopenDismissed(): boolean;\n dismissReopen(): void;\n scoreDb: ScoreDb;\n lastFile: LastFileStore;\n};\n\nconst stores = new Map<string, ReaderStorage>();\nconst none: ReaderStorage = {\n namespace: false,\n readPrefs: () => null, writePrefs: () => {}, reopenDismissed: () => false, dismissReopen: () => {},\n scoreDb: createScoreDb({ indexedDB: null, storage: null }),\n lastFile: createLastFileStore(null),\n};\n\n/** The storage of a namespace, one per namespace for the page (readers sharing a namespace share its stores). */\nexport function readerStorage(ns: PersistNamespace): ReaderStorage {\n if (ns === false || !ns.trim()) return none;\n let store = stores.get(ns);\n if (!store) {\n const prefsKey = `${ns}-prefs`, dismissedKey = `${ns}-reopen-dismissed`;\n store = {\n namespace: ns,\n readPrefs: () => { try { return JSON.parse(localStorage.getItem(prefsKey) || 'null'); } catch { return null; } },\n writePrefs: prefs => { try { localStorage.setItem(prefsKey, JSON.stringify(prefs)); } catch { /* storage full or blocked */ } },\n reopenDismissed: () => { try { return sessionStorage.getItem(dismissedKey) === '1'; } catch { return false; } },\n dismissReopen: () => { try { sessionStorage.setItem(dismissedKey, '1'); } catch { /* hidden for this page only */ } },\n scoreDb: createScoreDb({ dbName: ns, keyPrefix: ns }),\n lastFile: createLastFileStore(`${ns}-last-file`),\n };\n stores.set(ns, store);\n }\n return store;\n}\n","/** One AudioContext and master compressor for every reader on the page, and one playing reader at a time. */\nexport type SharedAudio = { context: AudioContext; master: DynamicsCompressorNode };\nlet shared: SharedAudio | undefined;\n\n/** The page's audio graph, created on first use; null when the device has no Web Audio (playback then runs silently). */\nexport function getSharedAudio(): SharedAudio | null {\n if (shared && shared.context.state !== 'closed') return shared;\n let context: AudioContext;\n try { context = new AudioContext(); } catch { return null; }\n const master = context.createDynamicsCompressor();\n master.threshold.value = -15; master.knee.value = 12; master.ratio.value = 4; master.attack.value = .003; master.release.value = .18;\n master.connect(context.destination);\n return shared = { context, master };\n}\n\nconst RESUME_TIMEOUT_MS = 1000;\n/** AudioContext.resume() can stay pending forever (no output device, autoplay policy), so give it a bounded wait. */\nexport async function resumeAudio(context: AudioContext): Promise<boolean> {\n if (context.state === 'running') return true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try { await Promise.race([context.resume(), new Promise(resolve => { timer = setTimeout(resolve, RESUME_TIMEOUT_MS); })]); }\n catch { /* a rejected resume means no sound */ }\n finally { clearTimeout(timer); }\n return (context.state as AudioContextState) === 'running'; // re-read: resume() changes it\n}\n\nexport type PlaybackOwner = { stop(): void };\nlet owner: PlaybackOwner | null = null;\n/** Starting playback in one reader stops whichever other reader is playing (also in silent wall-clock playback). */\nexport function claimPlayback(next: PlaybackOwner): void {\n if (owner && owner !== next) owner.stop();\n owner = next;\n}\nexport function releasePlayback(who: PlaybackOwner): void {\n if (owner === who) owner = null;\n}\n","/**\n * Large-score guardrail: a non-blocking \"this will take a while\" notice with an expected wait (see\n * docs/specs/large-score-performance.md, Phase 3 \"Guardrails\"). The estimate is a deliberately simple linear model;\n * its constants are named so they can be recalibrated against the e2e perf probe.\n */\nimport { formatMb } from './mxl';\n\nconst MB = 1024 * 1024;\n/** Files at or above this many bytes get the large-score notice as soon as they are chosen. */\nexport const LARGE_FILE_BYTES = 8 * MB;\n/** Scores at or above this many staff-measures (parts × measures) get the notice once the score is known. */\nexport const LARGE_SCORE_STAFF_MEASURES = 2400;\n/**\n * Test / tuning override: `localStorage['scoreflow-large-file-bytes']` (a positive number of bytes) replaces\n * LARGE_FILE_BYTES, so validation can trigger the notice with a small fixture. A diagnostic hook: un-namespaced and\n * exempt from `persist` (storage.ts).\n */\nexport const LARGE_FILE_BYTES_OVERRIDE_KEY = 'scoreflow-large-file-bytes';\n/**\n * Desktop open time per MB of score file, in seconds: [optimistic, pessimistic]. Calibrated on the Phase 3 e2e probe\n * (12-core desktop): 12.5 MB orchestral 3.3 s, 31.6 MB orchestral 4.1 s, 31.9 MB ensemble 3.6 s to first paint.\n */\nexport const DESKTOP_SECONDS_PER_MB: readonly [number, number] = [0.08, 0.2];\n/** Fixed desktop overhead (worker start, WASM load, first layout), in seconds. */\nexport const OPEN_BASE_SECONDS = 1.5;\n/** Phones and tablets take this many times as long as a desktop. */\nexport const PHONE_SLOWDOWN = 2.5;\n/** File bytes a staff-measure is treated as (orchestral MusicXML runs about 1.6 KB), when the score is what makes it large (a compressed .mxl). */\nexport const BYTES_PER_STAFF_MEASURE = 1.5 * 1024;\n\n/** The byte threshold in effect (LARGE_FILE_BYTES unless overridden in localStorage). */\nexport function largeFileBytes(): number {\n try {\n const override = Number(globalThis.localStorage?.getItem(LARGE_FILE_BYTES_OVERRIDE_KEY));\n if (Number.isFinite(override) && override > 0) return override;\n } catch { /* storage blocked: use the default */ }\n return LARGE_FILE_BYTES;\n}\nexport const isLargeFile = (bytes: number) => bytes >= largeFileBytes();\n/** Staves × measures: what engraving cost scales with. */\nexport const staffMeasures = (score: { parts: ReadonlyArray<{ measures: ArrayLike<unknown> }> }) =>\n score.parts.length * Math.max(0, ...score.parts.map(part => part.measures.length));\nexport const isLargeScore = (score: { parts: ReadonlyArray<{ measures: ArrayLike<unknown> }> }) => staffMeasures(score) >= LARGE_SCORE_STAFF_MEASURES;\n\n/** Expected seconds to open a score file of `bytes`: a [low, high] range, whole seconds, low ≥ 1. */\nexport function estimateOpenSeconds(bytes: number, { phone = false }: { phone?: boolean } = {}): [number, number] {\n const mb = Math.max(0, bytes) / MB;\n const factor = phone ? PHONE_SLOWDOWN : 1;\n const low = (OPEN_BASE_SECONDS + mb * DESKTOP_SECONDS_PER_MB[0]) * factor;\n const high = (OPEN_BASE_SECONDS + mb * DESKTOP_SECONDS_PER_MB[1]) * factor;\n const roundedLow = Math.max(1, Math.round(low));\n return [roundedLow, Math.max(roundedLow, Math.ceil(high))];\n}\n\n/**\n * The notice text, e.g. \"Large score (31.6 MB). Opening may take about 10–20 seconds on this device.\" When the score's\n * staff-measures are known and imply a longer wait than its bytes, the estimate follows them.\n */\nexport function largeScoreMessage(bytes: number, { phone = false, staffMeasures: cells }: { phone?: boolean; staffMeasures?: number } = {}): string {\n const equivalent = Math.max(bytes, (cells ?? 0) * BYTES_PER_STAFF_MEASURE);\n const [low, high] = estimateOpenSeconds(equivalent, { phone });\n const size = cells && cells * BYTES_PER_STAFF_MEASURE > bytes ? `${cells.toLocaleString('en')} staff-bars` : formatMb(bytes);\n const wait = low === high ? `about ${low} second${low === 1 ? '' : 's'}` : `about ${low}–${high} seconds`;\n return `Large score (${size}). Opening may take ${wait} on this device.`;\n}\n","/**\n * Score file discovery for the Open dialog: which files the reader can open, and\n * how dropped files and folders are enumerated (bounded, so a huge folder can't hang the page).\n */\nexport type ScoreFormat = 'MusicXML' | 'MIDI' | 'MEI' | 'ABC';\nexport type ScoreFileCandidate = { file: File; path: string; format: ScoreFormat };\nexport type CollectedScoreFiles = { candidates: ScoreFileCandidate[]; unsupported: string[]; truncated: boolean };\n\n/** The accept list for file inputs; importFile() dispatches on the same extensions. */\nexport const SCORE_FILE_ACCEPT = '.xml,.musicxml,.mxl,.mid,.midi,.mei,.abc,.txt';\nexport const FOLDER_MAX_DEPTH = 4;\nexport const FOLDER_MAX_ENTRIES = 500;\n/** Plain .txt files found in folders are only offered when they look like ABC; only this much is read to check. */\nconst TXT_SNIFF_BYTES = 65_536;\n\nconst EXTENSION_FORMATS: Array<[RegExp, ScoreFormat]> = [\n [/\\.(musicxml|xml|mxl)$/i, 'MusicXML'],\n [/\\.(mid|midi)$/i, 'MIDI'],\n [/\\.mei$/i, 'MEI'],\n [/\\.(abc|txt)$/i, 'ABC'],\n];\n\nexport const scoreFormatOf = (name: string): ScoreFormat | null => EXTENSION_FORMATS.find(([pattern]) => pattern.test(name))?.[1] ?? null;\n\n/** ABC tunes need a key field (K:), which ends the header; that is enough to tell ABC from prose. */\nexport const looksLikeAbc = (text: string) => /^\\s*K:/m.test(text);\n\n// Minimal structural types for the File and Directory Entries API; entries are duck-typed so tests can mock them.\ntype FsEntry = { isFile: boolean; isDirectory: boolean; name: string; fullPath?: string };\ntype FsFileEntry = FsEntry & { file(success: (file: File) => void, failure?: (error: unknown) => void): void };\ntype FsDirectoryEntry = FsEntry & { createReader(): { readEntries(success: (entries: FsEntry[]) => void, failure?: (error: unknown) => void): void } };\n\nconst entryFile = (entry: FsFileEntry) => new Promise<File>((resolve, reject) => entry.file(resolve, reject));\nconst readBatch = (reader: ReturnType<FsDirectoryEntry['createReader']>) => new Promise<FsEntry[]>((resolve, reject) => reader.readEntries(resolve, reject));\nconst trimPath = (path: string) => path.replace(/^\\/+/, '');\n\nasync function keepTxt(file: File) {\n try { return looksLikeAbc(await file.slice(0, TXT_SNIFF_BYTES).text()); }\n catch { return false; }\n}\n\nclass Collector {\n candidates: ScoreFileCandidate[] = [];\n unsupported: string[] = [];\n truncated = false;\n seen = 0;\n constructor(private readonly fromFolder: (path: string) => boolean) {}\n full() {\n if (this.seen >= FOLDER_MAX_ENTRIES) { this.truncated = true; return true; }\n return false;\n }\n async add(file: File, path: string) {\n this.seen++;\n const format = scoreFormatOf(file.name);\n // Inside a folder, unsupported files and prose .txt files are skipped silently; a directly dropped one is reported.\n const inFolder = this.fromFolder(path);\n if (!format) { if (!inFolder) this.unsupported.push(file.name); return; }\n if (inFolder && /\\.txt$/i.test(file.name) && !await keepTxt(file)) return;\n this.candidates.push({ file, path, format });\n }\n async walk(entry: FsEntry, depth: number): Promise<void> {\n if (this.full()) return;\n const path = trimPath(entry.fullPath || entry.name);\n if (entry.isFile) {\n try { await this.add(await entryFile(entry as FsFileEntry), path); }\n catch { /* unreadable file: skip it */ }\n return;\n }\n if (!entry.isDirectory) return;\n this.seen++;\n if (depth >= FOLDER_MAX_DEPTH) { this.truncated = true; return; }\n const reader = (entry as FsDirectoryEntry).createReader();\n // readEntries returns results in batches (100 in Chromium) until an empty batch.\n for (;;) {\n let batch: FsEntry[];\n try { batch = await readBatch(reader); } catch { return; }\n if (!batch.length) return;\n for (const child of batch) {\n if (this.full()) return;\n await this.walk(child, depth + 1);\n }\n }\n }\n result(): CollectedScoreFiles {\n const candidates = [...this.candidates].sort((a, b) => a.path.localeCompare(b.path, undefined, { numeric: true, sensitivity: 'base' }));\n return { candidates, unsupported: this.unsupported, truncated: this.truncated };\n }\n}\n\n/**\n * Collects score files from a drop. Directory entries must be taken synchronously inside the drop\n * handler (the DataTransfer is emptied afterwards), so callers pass the DataTransfer straight in\n * and this snapshots it before awaiting anything.\n */\nexport function collectDroppedScoreFiles(data: DataTransfer): Promise<CollectedScoreFiles> {\n const items = Array.from(data.items || []).filter(item => item.kind === 'file');\n const entries = items.map(item => (item as DataTransferItem & { webkitGetAsEntry?: () => FsEntry | null }).webkitGetAsEntry?.() ?? null);\n const files = Array.from(data.files || []);\n const collector = new Collector(path => path.includes('/'));\n return (async () => {\n if (entries.length && entries.every(Boolean)) {\n for (const entry of entries as FsEntry[]) await collector.walk(entry, 0);\n } else {\n // No entry API: plain files only (a dropped folder then shows up as an unreadable \"file\" and is skipped).\n for (const file of files.slice(0, FOLDER_MAX_ENTRIES)) await collector.add(file, file.name);\n if (files.length > FOLDER_MAX_ENTRIES) collector.truncated = true;\n }\n return collector.result();\n })();\n}\n","/**\n * System-aware paging for Vertical mode. A page is a scroll position whose viewport shows whole systems: it starts at\n * a system top (less a small pad) and holds as many complete systems as fit. Overhang repeats the last systems of the\n * previous page at the top of the next, but only while at least one new complete system still fits below them.\n * A system taller than the viewport is a tall page: it is stepped through a viewport at a time.\n */\nexport type SystemSpan = { top: number; bottom: number };\n/** `first..last` are the systems wholly in view at `start`; a tall page shows part of system `first` (=== `last`). */\nexport type ReadingPage = { start: number; first: number; last: number; tall: boolean };\n\n/** Space kept above a page's first system; the previous system's bottom margin is blank at least this far. */\nexport const PAGE_PAD_PX = 8;\n/** Overlap between consecutive steps through a system taller than the viewport. */\nexport const TALL_PAGE_OVERLAP_PX = 48;\n/** Scroll positions this close count as the same page. */\nexport const PAGE_EPSILON_PX = 2;\n\nexport function systemPages(systems: SystemSpan[], viewHeight: number, overlap: number, pad = PAGE_PAD_PX, tallOverlap = TALL_PAGE_OVERLAP_PX): ReadingPage[] {\n const n = systems.length;\n if (!n || viewHeight <= 0) return [{ start: 0, first: 0, last: n - 1, tall: false }];\n const fits = (index: number, start: number) => systems[index].bottom <= start + viewHeight + .5;\n const topOf = (index: number) => Math.max(0, systems[index].top - pad);\n const pages: ReadingPage[] = [];\n // The first page shows the title; when the first system does not fit below it, the first page starts at that system.\n let first = 0;\n let start = fits(0, 0) ? 0 : topOf(0);\n for (let next = 0; next < n;) {\n let last = next - 1;\n while (last + 1 < n && fits(last + 1, start)) last++;\n if (last < next) {\n // A system taller than the viewport: step through it, ending with its bottom in view.\n const end = Math.max(start, systems[next].bottom + pad - viewHeight);\n const step = Math.max(40, viewHeight - tallOverlap);\n for (let at = start; ; at = Math.min(end, at + step)) {\n pages.push({ start: at, first: next, last: next, tall: true });\n if (at >= end - .5) break;\n }\n next++;\n if (next < n) { first = next; start = topOf(next); }\n continue;\n }\n pages.push({ start, first, last, tall: false });\n next = last + 1;\n if (next >= n) break;\n // Overhang: repeat up to `overlap` systems, dropping them until one new complete system fits.\n let repeat = Math.max(0, Math.min(overlap, next - first));\n while (repeat > 0 && !fits(next, topOf(next - repeat))) repeat--;\n first = next - repeat;\n start = topOf(first);\n }\n return pages;\n}\n\n/** Distinct page starts in scroll order. */\nexport const pageStarts = (pages: ReadingPage[]) => [...new Set(pages.map(page => Math.round(page.start)))].sort((a, b) => a - b);\n\n/** The page start a turn moves to from `current`: the next start below it, or the last start above it (else the top). */\nexport function turnTarget(pages: ReadingPage[], current: number, direction: number, epsilon = PAGE_EPSILON_PX): number | null {\n const starts = pageStarts(pages);\n if (direction > 0) return starts.find(start => start > current + epsilon) ?? null;\n return [...starts].reverse().find(start => start < current - epsilon) ?? (current > epsilon ? 0 : null);\n}\n\n/** The first page that shows system `index` whole (or the first step of it when it is tall). */\nexport const pageOfSystem = (pages: ReadingPage[], index: number) => pages.find(page => page.first <= index && index <= page.last) ?? null;\n","/**\n * Opening a score from a public URL (PepperScore's `scoreUrl` prop; the demo maps `?score=<url>` to it). The file is\n * downloaded here and then opened through the reader's normal file path, so its format is read from its name.\n */\nimport { formatMb, MAX_SCORE_FILE_BYTES } from './mxl';\nimport { scoreFormatOf } from './score-files';\n\n/** File extensions for score media types, for URLs whose path has no score extension. */\nconst MEDIA_EXTENSIONS: Array<[RegExp, string]> = [\n [/^application\\/vnd\\.recordare\\.musicxml$/, '.mxl'],\n [/musicxml|^(application|text)\\/xml$/, '.musicxml'],\n [/^(audio\\/(x-)?midi|audio\\/mid)$/, '.mid'],\n [/mei/, '.mei'],\n [/abc|^text\\/plain$/, '.abc'],\n];\n\n/** A file name for the download: the URL's own name when it has a score extension, else one from the media type. */\nexport function remoteFileName(url: URL, contentType: string): string {\n const raw = url.pathname.split('/').filter(Boolean).pop() || '';\n let last = raw;\n try { last = decodeURIComponent(raw); } catch { /* a malformed escape: keep the name as written */ }\n if (last && scoreFormatOf(last)) return last;\n const type = contentType.split(';')[0].trim().toLowerCase();\n const extension = MEDIA_EXTENSIONS.find(([pattern]) => pattern.test(type))?.[1];\n if (!extension) throw new Error('This link doesn’t point to a MusicXML, MIDI, MEI or ABC file.');\n return `${(last || url.hostname).replace(/\\.[^.]*$/, '') || 'score'}${extension}`;\n}\n\n/** Download a public score as a File. Only http(s) links are fetched, and a score larger than the open limit is refused. */\nexport async function fetchScoreFile(link: string, base: string, signal?: AbortSignal): Promise<File> {\n let url: URL;\n // Resolved against the page, so a site-relative path works too.\n try { url = new URL(link, base); } catch { throw new Error('The score link isn’t a valid URL.'); }\n if (url.protocol !== 'https:' && url.protocol !== 'http:') throw new Error('Scores can only be opened from http or https links.');\n let response: Response;\n try { response = await fetch(url, { signal, credentials: 'omit' }); }\n catch (e) {\n if (signal?.aborted) throw e;\n // A network failure and a CORS refusal look the same from here.\n throw new Error(`The score at ${url.host} couldn’t be downloaded. Check the link, and that its server allows other sites to load it (CORS).`);\n }\n if (!response.ok) throw new Error(`The score at ${url.host} couldn’t be downloaded (${response.status}${response.statusText ? ` ${response.statusText}` : ''}).`);\n const tooLarge = (bytes: number) => new Error(`This score is ${formatMb(bytes)}; scores up to ${formatMb(MAX_SCORE_FILE_BYTES)} can be opened.`);\n const declared = Number(response.headers.get('content-length'));\n if (declared > MAX_SCORE_FILE_BYTES) throw tooLarge(declared);\n const name = remoteFileName(new URL(response.url || url.href), response.headers.get('content-type') || '');\n const blob = await response.blob();\n if (blob.size > MAX_SCORE_FILE_BYTES) throw tooLarge(blob.size);\n return new File([blob], name, { type: blob.type });\n}\n","import { useEffect, useId, useRef, useState } from 'react';\nimport { ChevronLeft, FileMusic, FolderOpen, Upload, X } from 'lucide-react';\nimport { collectDroppedScoreFiles, FOLDER_MAX_ENTRIES, looksLikeAbc, type CollectedScoreFiles, type ScoreFileCandidate } from '../lib/score-files';\nimport './open-score-dialog.css';\n\nexport type OpenScoreDialogProps = {\n onClose(): void;\n /** Opens one file through the reader's normal import path. */\n onOpenFile(file: File): void;\n /** Opens pasted ABC text through the reader's normal ABC path. */\n onOpenAbc(text: string): void;\n /** Shows the reader's own file picker. */\n onBrowse(): void;\n};\n\nconst FORMATS = [\n { name: 'MusicXML', detail: '.musicxml, .xml, compressed .mxl' },\n { name: 'MIDI', detail: '.mid, .midi' },\n { name: 'MEI', detail: '.mei' },\n { name: 'ABC notation', detail: '.abc, .txt, or paste' },\n] as const;\nconst TIP = 'Paste ABC notation here, or drop a score file or a folder of scores.';\nconst NOT_ABC = 'This doesn’t look like ABC notation yet: a tune needs a K: (key) line, e.g. K:C.';\nconst hasFiles = (data: DataTransfer | null) => Boolean(data && Array.from(data.types || []).includes('Files'));\nconst FOCUSABLE = 'button:not([disabled]), textarea, input:not([type=file]):not([disabled]), [href], [tabindex]:not([tabindex=\"-1\"])';\n\n/** \"Open a score\" modal: format guide, file browsing, and one box that takes pasted ABC or dropped files and folders. */\nexport default function OpenScoreDialog({ onClose, onOpenFile, onOpenAbc, onBrowse }: OpenScoreDialogProps) {\n const headingId = useId();\n const tipId = useId();\n const panelRef = useRef<HTMLElement>(null);\n const textRef = useRef<HTMLTextAreaElement>(null);\n const dragDepth = useRef(0);\n const [abc, setAbc] = useState('');\n const [dragging, setDragging] = useState(false);\n const [scanning, setScanning] = useState(false);\n const [message, setMessage] = useState('');\n const [choices, setChoices] = useState<ScoreFileCandidate[] | null>(null);\n const [truncated, setTruncated] = useState(false);\n\n // Focus the entry box on open; hand focus back to whatever opened the dialog on close.\n useEffect(() => {\n const opener = document.activeElement as HTMLElement | null;\n textRef.current?.focus();\n return () => { if (opener?.isConnected) opener.focus(); };\n }, []);\n useEffect(() => {\n const key = (event: KeyboardEvent) => {\n // Only while focus is in this dialog's reader (a click on dialog text can leave it on the reader root):\n // another reader on the page keeps its own keys.\n if (!panelRef.current?.closest('.pepperscore')?.contains(document.activeElement)) return;\n if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); onClose(); return; }\n if (event.key !== 'Tab' || !panelRef.current) return;\n // Keep Tab inside the dialog.\n const focusable = [...panelRef.current.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(element => element.offsetParent !== null);\n if (!focusable.length) return;\n const first = focusable[0], last = focusable[focusable.length - 1];\n if (event.shiftKey && (document.activeElement === first || !panelRef.current.contains(document.activeElement))) { event.preventDefault(); last.focus(); }\n else if (!event.shiftKey && (document.activeElement === last || !panelRef.current.contains(document.activeElement))) { event.preventDefault(); first.focus(); }\n };\n document.addEventListener('keydown', key, true);\n return () => document.removeEventListener('keydown', key, true);\n }, [onClose]);\n\n const open = (file: File) => { onClose(); onOpenFile(file); };\n const settle = ({ candidates, unsupported, truncated: cut }: CollectedScoreFiles, folder: boolean) => {\n setScanning(false);\n setTruncated(cut);\n if (candidates.length === 1 && !cut) { open(candidates[0].file); return; }\n if (candidates.length > 1 || (candidates.length === 1 && cut)) { setChoices(candidates); setMessage(''); return; }\n setChoices(null);\n if (unsupported.length) setMessage(`${unsupported.length === 1 ? `“${unsupported[0]}” isn’t` : `${unsupported.length} files aren’t`} a supported score. Choose a MusicXML, MIDI, MEI or ABC file.`);\n else setMessage(folder ? 'No MusicXML, MIDI, MEI or ABC files were found in that folder.' : 'Nothing to open there. Drop a MusicXML, MIDI, MEI or ABC file.');\n };\n const scan = (work: Promise<CollectedScoreFiles>, folder: boolean) => {\n setScanning(true); setMessage(''); setChoices(null);\n work.then(result => settle(result, folder), () => { setScanning(false); setMessage('Those files couldn’t be read. Try choosing them with Browse files.'); });\n };\n const submitAbc = () => {\n const text = abc.trim();\n if (!text) return;\n if (!looksLikeAbc(text)) { setMessage(NOT_ABC); textRef.current?.focus(); return; }\n onClose(); onOpenAbc(text);\n };\n\n const dragProps = {\n onDragEnter: (event: React.DragEvent) => { if (!hasFiles(event.dataTransfer)) return; event.preventDefault(); dragDepth.current++; setDragging(true); },\n onDragOver: (event: React.DragEvent) => { if (!hasFiles(event.dataTransfer)) return; event.preventDefault(); event.dataTransfer.dropEffect = 'copy'; },\n onDragLeave: (event: React.DragEvent) => { if (!hasFiles(event.dataTransfer)) return; dragDepth.current = Math.max(0, dragDepth.current - 1); if (!dragDepth.current) setDragging(false); },\n onDrop: (event: React.DragEvent) => {\n if (!hasFiles(event.dataTransfer)) return; // plain text dropped into the box inserts as usual\n event.preventDefault();\n dragDepth.current = 0; setDragging(false);\n const folder = Array.from(event.dataTransfer.items || []).some(item => (item as DataTransferItem & { webkitGetAsEntry?: () => { isDirectory: boolean } | null }).webkitGetAsEntry?.()?.isDirectory);\n scan(collectDroppedScoreFiles(event.dataTransfer), folder);\n },\n };\n\n const messageIsHint = message === NOT_ABC;\n return <div className={`open-dialog-backdrop ${dragging ? 'is-drag-over' : ''}`} onMouseDown={event => { if (event.target === event.currentTarget) onClose(); }} {...dragProps}>\n <section ref={panelRef} tabIndex={-1} className=\"open-dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby={headingId}>\n <div className=\"open-dialog-heading\">\n <div className=\"open-dialog-title\"><FolderOpen className=\"open-dialog-title-icon\" size={18}/><h2 id={headingId} className=\"open-dialog-title-text\">Open a score</h2></div>\n <button className=\"icon-button open-dialog-close\" aria-label=\"Close open score dialog\" onClick={onClose}><X size={19}/></button>\n </div>\n <p className=\"open-dialog-intro\">Scoreflow reads these notation formats. Everything stays on this device.</p>\n <ul className=\"open-dialog-formats\" aria-label=\"Supported formats\">{FORMATS.map(format => <li key={format.name} className=\"open-dialog-format\"><span className=\"open-dialog-format-name\">{format.name}</span><span className=\"open-dialog-format-detail\">{format.detail}</span></li>)}</ul>\n\n {choices ? <div className=\"open-dialog-choices\">\n <div className=\"open-dialog-choices-heading\">\n <h3 className=\"open-dialog-choices-title\">Choose a score <span className=\"open-dialog-choices-count\">{choices.length} found</span></h3>\n <button className=\"text-action open-dialog-choices-back\" onClick={() => { setChoices(null); setTruncated(false); textRef.current?.focus(); }}><ChevronLeft size={15}/> Back</button>\n </div>\n {truncated && <p className=\"open-dialog-choices-note\">Only the first {FOLDER_MAX_ENTRIES} items (four folders deep) were searched.</p>}\n <ul className=\"open-dialog-choice-list\" aria-label=\"Scores found\">{choices.map(choice => <li key={choice.path} className=\"open-dialog-choice-item\">\n <button className=\"open-dialog-choice\" onClick={() => open(choice.file)}>\n <FileMusic className=\"open-dialog-choice-icon\" size={17}/>\n <span className=\"open-dialog-choice-text\"><span className=\"open-dialog-choice-name\">{choice.file.name}</span><span className=\"open-dialog-choice-path\">{choice.path}</span></span>\n <span className=\"open-dialog-choice-format\">{choice.format}</span>\n </button>\n </li>)}</ul>\n </div> : <>\n <label className=\"open-dialog-entry-label\" htmlFor={`${headingId}-abc`}>ABC notation, or drop files here</label>\n <div className={`open-dialog-dropzone ${dragging ? 'is-drag-over' : ''} ${scanning ? 'is-scanning' : ''}`}>\n <textarea ref={textRef} id={`${headingId}-abc`} className=\"open-dialog-abc-input\" value={abc} spellCheck={false} placeholder={'X:1\\nT:My tune\\nK:C\\nC D E F | G2 G2 |'} aria-describedby={tipId}\n onChange={event => { setAbc(event.target.value); if (messageIsHint) setMessage(''); }}\n onKeyDown={event => { if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) { event.preventDefault(); submitAbc(); } }}/>\n {dragging && <div className=\"open-dialog-drop-overlay\" aria-hidden=\"true\"><Upload className=\"open-dialog-drop-icon\" size={26}/><span className=\"open-dialog-drop-text\">Drop to open</span></div>}\n {scanning && <div className=\"open-dialog-drop-overlay is-scanning\" role=\"status\"><span className=\"score-loading-spinner open-dialog-spinner\"/><span className=\"open-dialog-drop-text\">Looking for scores…</span></div>}\n </div>\n <p id={tipId} className=\"open-dialog-tip\">{TIP} <span className=\"open-dialog-tip-keys\">Ctrl/⌘ + Enter opens pasted ABC.</span></p>\n </>}\n\n {message && <p className={`open-dialog-message ${messageIsHint ? 'is-hint' : 'is-error'}`} role={messageIsHint ? 'status' : 'alert'}>{message}</p>}\n\n <div className=\"open-dialog-actions\">\n <button className=\"open-dialog-browse\" onClick={() => { onBrowse(); onClose(); }}><FolderOpen size={16}/> Browse files</button>\n {!choices && <button className=\"primary-action open-dialog-open-abc\" disabled={!abc.trim()} onClick={submitAbc}>Open ABC</button>}\n </div>\n </section>\n </div>;\n}\n","/**\n * Built-in assets (music fonts, instrument icons, sound packs) live at `assetBaseUrl` in the layout of a\n * pepperscore-sounds-<pack> package: fonts/, instruments/, soundfonts/ and pack.json\n * (docs/specs/pepperscore-embeddable-component.md, \"Assets and sounds\"). No runtime imports: validation/assets.mjs runs it in Node.\n */\nexport type SoundPackName = 'core' | 'complete';\n\n/** Version of the pepperscore-sounds-* packages this build loads by default; validation/sound-packs.mjs keeps it in step. */\nexport const SOUNDS_VERSION = '0.1.0';\n\nexport const defaultAssetBaseUrl = (pack: SoundPackName): string => `https://cdn.jsdelivr.net/npm/pepperscore-sounds-${pack}@${SOUNDS_VERSION}/`;\n\nconst pageBase = (): string => (typeof document !== 'undefined' && document.baseURI) || 'http://localhost/';\n\n/** The absolute asset base, always ending in `/`. A relative base resolves against the page; none means the CDN default. */\nexport function resolveAssetBase(base: string | undefined, pack: SoundPackName = 'core', page: string = pageBase()): string {\n const raw = base?.trim() || defaultAssetBaseUrl(pack);\n return new URL(raw.endsWith('/') ? raw : `${raw}/`, page).href;\n}\n\n/** A built-in asset under the base; a leading `/` (as in the GM manifest's `localPack`) is relative to the base too. */\nexport const assetUrl = (base: string, path: string): string => new URL(path.replace(/^\\/+/, ''), base).href;\n\nexport type PackInfo = { pack: SoundPackName | 'unknown'; fluidr3: ReadonlySet<string> };\nconst packInfo = new Map<string, Promise<PackInfo>>();\n\n/**\n * The base's pack.json, cached per base. A missing or invalid one lists no FluidR3 sounds, so every program falls back\n * to TimGM6mb; a failed fetch is not cached, so the next playback tries again.\n */\nexport function loadPackInfo(base: string): Promise<PackInfo> {\n let info = packInfo.get(base);\n if (!info) {\n info = fetch(assetUrl(base, 'pack.json'))\n .then(response => (response.ok ? response.json() : null) as Promise<{ pack?: unknown; fluidr3?: unknown } | null>)\n .then(json => ({\n pack: json?.pack === 'core' || json?.pack === 'complete' ? json.pack : 'unknown' as const,\n fluidr3: new Set(Array.isArray(json?.fluidr3) ? json.fluidr3.filter((name): name is string => typeof name === 'string') : []),\n }), () => { packInfo.delete(base); return { pack: 'unknown' as const, fluidr3: new Set<string>() }; });\n packInfo.set(base, info);\n }\n return info;\n}\n\nconst warnedBases = new Set<string>();\n/**\n * One console warning per asset base when its fonts or built-in sounds fail to load (for example the default CDN URL\n * before the sounds packages are published). The reader keeps working: fonts fall back and playback runs silently.\n */\nexport function warnAssetBase(base: string, what: string): void {\n if (warnedBases.has(base)) return;\n warnedBases.add(base);\n console.warn(`pepperscore: could not load ${what} from assetBaseUrl \"${base}\". Music fonts fall back and playback is silent. `\n + 'Serve a pepperscore-sounds-core (or -complete) package there, or self-host one and pass its URL as assetBaseUrl.');\n}\n","/**\n * Where each part's sound comes from (docs/specs/pepperscore-embeddable-component.md, \"Sound resolution\"):\n * 1. the first `soundSources` entry that claims it, 2. the pack's FluidR3 sound if pack.json lists it,\n * 3. TimGM6mb.sf2 (always present). Drums use Perfect Drums note files unless a source claims them.\n * Pure: no fetching and no runtime imports (validation/sounds.mjs runs it in Node).\n */\nexport type SoundSource =\n | { id: string; kind: 'sf2'; url: string; programs?: number[]; drums?: boolean; preset?: string }\n | { id: string; kind: 'sample-pack'; url: string /* may contain {name} */; programs?: number[] }\n | { id: string; kind: 'note-files'; manifest: string; programs?: number[]; drums?: boolean };\n\n/** A part's sound: the drum kit, or a GM program (1-128) and its FluidR3 name. */\nexport type SoundRequest = { drums: true } | { drums: false; program: number; name: string };\n\nexport type SoundPlan =\n | { kind: 'sf2'; sourceId: string; url: string; drums: boolean; program?: number; preset?: string }\n | { kind: 'sample-pack'; sourceId: string; url: string; name: string }\n | { kind: 'note-files'; sourceId: string; manifest: string; drums: boolean };\n\nexport const BUILTIN_FLUIDR3 = 'builtin:fluidr3';\nexport const BUILTIN_DRUMS = 'builtin:perfect-drums';\nexport const BUILTIN_SF2 = 'builtin:timgm6mb';\n\nexport type PlanContext = { sources?: readonly SoundSource[]; fluidr3: ReadonlySet<string>; base: string; page: string };\n\nconst claims = (source: SoundSource, request: SoundRequest) =>\n request.drums ? source.kind !== 'sample-pack' && source.drums === true : !!source.programs?.includes(request.program);\n\n/** The built-in GM soundfont; it also plays drum notes a note-file kit lacks. */\nexport const fallbackSf2Url = (base: string) => new URL('soundfonts/TimGM6mb.sf2', base).href;\n\nexport function planSound(request: SoundRequest, { sources = [], fluidr3, base, page }: PlanContext): SoundPlan {\n const source = sources.find(item => claims(item, request));\n if (source?.kind === 'sf2') return { kind: 'sf2', sourceId: source.id, url: new URL(source.url, page).href, drums: request.drums, ...(request.drums ? {} : { program: request.program }), ...(source.preset ? { preset: source.preset } : {}) };\n if (source?.kind === 'sample-pack' && !request.drums) return { kind: 'sample-pack', sourceId: source.id, url: new URL(source.url.replaceAll('{name}', encodeURIComponent(request.name)), page).href, name: request.name };\n if (source?.kind === 'note-files') return { kind: 'note-files', sourceId: source.id, manifest: new URL(source.manifest, page).href, drums: request.drums };\n if (request.drums) return { kind: 'note-files', sourceId: BUILTIN_DRUMS, manifest: new URL('soundfonts/perfect-drums/manifest.json', base).href, drums: true };\n if (fluidr3.has(request.name)) return { kind: 'sample-pack', sourceId: BUILTIN_FLUIDR3, url: new URL(`soundfonts/fluidr3/${request.name}.json`, base).href, name: request.name };\n return { kind: 'sf2', sourceId: BUILTIN_SF2, url: fallbackSf2Url(base), drums: false, program: request.program };\n}\n\n/** Players are shared by parts with the same key (sample packs route each note to its part's gain; see Reader audioKey). */\nexport const planKey = (plan: SoundPlan): string =>\n plan.kind === 'sample-pack' ? `sample-pack:${plan.url}`\n : plan.kind === 'sf2' ? `sf2:${plan.url}#${plan.drums ? 'drums' : plan.program}:${plan.preset ?? ''}`\n : `note-files:${plan.manifest}`;\n","import type { SoundPlan } from './sounds';\n\nexport type AudioPlayer = {\n fallback?: boolean;\n start(options: { note: number; time: number; duration: number; velocity: number; destination?: AudioNode }): () => void;\n stop(): void;\n dispose(): void;\n loadNotes?(notes: number[]): Promise<void>;\n covers?(note: number): boolean;\n};\n\n/** The players for one plan (sf2 players are bound to `destination`, a part's track gain). */\nexport async function loadPlayers(context: AudioContext, plan: SoundPlan, destination: AudioNode): Promise<AudioPlayer[]> {\n if (plan.kind === 'sample-pack') {\n const { loadFluidPlayer } = await import('./fluid-player');\n return [await loadFluidPlayer(context, plan.url, plan.name)];\n }\n if (plan.kind === 'sf2') {\n const { loadSf2Player } = await import('./sf2-player');\n return [await loadSf2Player(context, { url: plan.url, drums: plan.drums, program: plan.program, preset: plan.preset, destination })];\n }\n const { loadNoteFilePlayer } = await import('./drum-player');\n return [await loadNoteFilePlayer(context, plan.manifest)];\n}\n\n/** A note-file drum kit plays the notes it lacks through the GM soundfont's standard kit, as before (added once). */\nexport async function addDrumFallback(context: AudioContext, players: AudioPlayer[], notes: number[], fallbackSf2: string, destination: AudioNode): Promise<void> {\n const kit = players[0];\n if (!kit?.covers || players.some(player => player.fallback) || notes.every(note => kit.covers!(note))) return;\n const { loadSf2Player } = await import('./sf2-player');\n const drums = await loadSf2Player(context, { url: fallbackSf2, drums: true, destination });\n players.push({ fallback: true, start: options => kit.covers!(options.note) ? () => {} : drums.start(options), stop: () => drums.stop(), dispose: () => drums.dispose() });\n}\n","const MUSIC_FONTS = [['Bravura', 'fonts/Bravura.woff2'], ['Petaluma', 'fonts/Petaluma.woff2'], ['Petaluma Script', 'fonts/PetalumaScript.woff2']] as const;\n\n/**\n * SMuFL fonts for Verovio's text glyphs (tempo marks, dynamics) and Petaluma Script stave text, loaded from the asset\n * base instead of hardcoded CSS. Font family names are page-global, so the first instance's base wins.\n */\nexport function ensureMusicFonts(base: string, onError?: (failed: string) => void): void {\n if (typeof document === 'undefined' || document.head.querySelector('style[data-pepperscore-fonts]')) return;\n const style = document.createElement('style');\n style.dataset.pepperscoreFonts = base;\n style.textContent = MUSIC_FONTS.map(([family, path]) => `@font-face{font-family:'${family}';src:url('${new URL(path, base).href}') format('woff2');font-display:block}`).join('\\n');\n document.head.appendChild(style);\n // Faces load on first use; a 404 surfaces as a FontFaceSet loadingerror listing the failed faces.\n if (!onError || !document.fonts?.addEventListener) return;\n const families = new Map<string, string>(MUSIC_FONTS.map(([family, path]) => [family, path]));\n document.fonts.addEventListener('loadingerror', event => {\n const failed = (event as FontFaceSetLoadEvent).fontfaces.map(face => families.get(face.family.replace(/^[\"']|[\"']$/g, ''))).filter(path => path !== undefined);\n if (failed.length) onError(failed.join(', '));\n });\n}\n","import { useCallback, useEffect, useId, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { ChevronDown, ChevronLeft, ChevronRight, Ellipsis, Eye, EyeOff, FileMusic, Focus, FolderOpen, History, Hourglass, Minus, Pause, Play, Plus, RotateCcw, SlidersHorizontal, Square, Settings2, Trash2, VolumeX, X } from 'lucide-react';\nimport { exampleScore, gmProgramForSoundfont, gmSoundfontLabel, GM_FAMILIES, GM_SOUNDS, instrumentDetails, type GmFamily, type GmSound, type Part, type Score } from '../lib/score';\nimport { cancelImports, importMusicXmlText, importScoreFile, parseAbc } from '../lib/import';\nimport { portraitBarLimit, renderScore, type MeasureGeometry, type RenderResult } from '../lib/render';\nimport { partControlMetrics, type PartControlMetrics } from '../lib/part-controls';\nimport { HEADER_CONTROL_GROUP, HEADER_CONTROLS, MOBILE_HEADER_BREAKPOINT, type HeaderControlId } from '../lib/header-controls';\nimport { resolveChrome, type ChromePreset, type PepperScoreControls } from '../lib/chrome';\nimport { clampStaveScale, deviceClass, ENDLESS_STAVE_SCALE, minimumDefaultStaveScale, STAVE_SCALE_MAX, STAVE_SCALE_MIN, STAVE_SCALE_STEP } from '../lib/stave-scale';\nimport { buildFileState, clampBpm, MAX_BPM, MIN_BPM, textSource, type FileSource, type FileState, type ScoreView } from '../lib/file-state';\nimport { sampleSource, type ScoreDb } from '../lib/score-db';\nimport { defaults, sanitizeSavedPrefs, settingsToPrefs, viewToMode, type PepperScoreSettings, type Prefs } from '../lib/prefs';\nimport { readerStorage, type PersistNamespace } from '../lib/storage';\nimport { scoreForView, spokenKey, transposeReadout } from '../lib/transpose';\nimport type { SpellingKey } from '../lib/spelling';\nimport { baseTimelineFor, deriveTimeline, playbackDuration, playbackEventsFrom, playbackMidis, playbackPositionAt, type BaseTimeline } from '../lib/playback/timeline';\nimport { closeVerovioChannel, isOutOfMemory, isRestarted, isSuperseded, openVerovioChannel, prepareVerovio, reduceChunkSize } from '../lib/verovio-runtime';\nimport { claimPlayback, getSharedAudio, releasePlayback, resumeAudio } from '../lib/audio-engine';\nimport { isLargeFile, isLargeScore, largeScoreMessage, staffMeasures } from '../lib/large-file';\nimport { isSameFile, lastFileToFile, type LastFileInfo } from '../lib/last-file';\nimport { withEngravingDocument } from '../lib/notation/document';\nimport { SCORE_FILE_ACCEPT } from '../lib/score-files';\nimport { PAGE_PAD_PX, pageOfSystem, systemPages, turnTarget, type ReadingPage, type SystemSpan } from '../lib/paging';\nimport { fetchScoreFile } from '../lib/remote-score';\nimport OpenScoreDialog from './OpenScoreDialog';\nimport { loadPackInfo, resolveAssetBase, warnAssetBase, type SoundPackName } from '../lib/assets';\nimport { fallbackSf2Url, planKey, planSound, type SoundPlan, type SoundRequest, type SoundSource } from '../lib/sounds';\nimport { addDrumFallback, loadPlayers, type AudioPlayer } from '../lib/sound-players';\nimport { ensureMusicFonts } from '../lib/asset-fonts';\n\n/** Short key name for readouts: 'Gb', 'C#m'. */\nconst keyName = (key: SpellingKey) => `${key.tonic}${key.mode === 'minor' ? 'm' : ''}`;\nconst clampSemitones = (semitones: number) => Math.max(-12, Math.min(12, semitones));\nconst sampleScore = () => withEngravingDocument(exampleScore());\nconst textFonts = { Sans: 'Poppins, Arial, sans-serif', Serif: 'Georgia, serif', Mono: 'ui-monospace, monospace' } as const;\nconst sampleAbc = `X:1\\nT:A little room to play\\nM:4/4\\nL:1/4\\nQ:1/4=96\\nK:C\\nC E G c | B A G E | C E G c | d2 c2 | G E D C | E G A G | F E D B, | C4 |`;\nconst playbackSound = (part: Part) => part.gmSoundfont || (part.instrument === 'drum-kit' ? 'drum-kit' : instrumentDetails(part.instrument).soundfont!);\nconst soundRequest = (part: Part): SoundRequest => {\n const sound = playbackSound(part);\n return sound === 'drum-kit' ? { drums: true } : { drums: false, program: gmProgramForSoundfont(sound) ?? 1, name: sound };\n};\n/** Sample packs route each note to its part's gain, so parts share them; sf2 and note-file players are bound to one part's gain. */\nconst audioKey = (plan: SoundPlan, part: Part) => plan.kind === 'sample-pack' ? planKey(plan) : `${planKey(plan)}|${part.id}`;\nconst SILENT_PLAYBACK_NOTICE = 'Audio couldn’t start on this device — playing silently.';\nexport type PepperScoreReadyInfo = { title: string; composer?: string; parts: Array<{ id: string; name: string }>; measures: number };\nexport type PepperScoreHandle = {\n /** Start playback (no-op while playing, or when the chrome loads no audio). */\n play(): Promise<void>;\n stop(): void;\n /** Set the absolute transposition in semitones (clamped to -12…12), like `settings.semitones`. */\n transpose(semitones: number): void;\n};\nexport type PepperScoreProps = {\n /** Score sources; the first present wins, in this order. */\n musicXml?: string;\n /** A score file (MusicXML, MXL, MIDI, MEI or ABC). */\n file?: File;\n /** A public score file to download and open (relative URLs resolve against the page). */\n scoreUrl?: string;\n abc?: string;\n /** `\"full\"` (default): header, drawer, mixer, sample score and open-file UI; `\"minimal\"`: notation with a compact play button; `\"none\"`: engraving only, no audio. */\n chrome?: ChromePreset;\n /** Per-control overrides of the chrome preset (lib/chrome.ts). */\n controls?: PepperScoreControls;\n /** Initial reading view; changing it re-applies it. */\n view?: 'vertical' | 'endless';\n /** `\"fill\"` fills the parent's height; any CSS length fixes it; omitted, full chrome fills its parent (480px floor) and the others size to their score. */\n height?: string;\n /** Extra classes on the `.pepperscore` root. */\n className?: string;\n /** Accessible name of the reader's landmark region; default `\"Score: <title>\"` once a titled score loads, else `\"Score reader\"`. */\n ariaLabel?: string;\n /** Initial reader settings; changing a key re-applies that key. A score's saved record (with `persist`) wins over them. */\n settings?: PepperScoreSettings;\n /**\n * Namespace of the saved state (prefs, per-score records, last file; see lib/storage.ts); `false` saves nothing.\n * Default `\"pepperscore\"` for full chrome, `false` otherwise. `\"scoreflow\"` keeps the original Scoreflow names.\n */\n persist?: PersistNamespace;\n /** Root of a pepperscore-sounds-<pack> layout; default: the jsDelivr copy of pepperscore-sounds-<soundPack>. */\n assetBaseUrl?: string;\n soundPack?: SoundPackName;\n /** Sounds that replace the built-in ones for the programs (or drum kit) they claim; the first claiming entry wins. */\n soundSources?: SoundSource[];\n /** A score finished loading and drew (once per score). */\n onReady?(info: PepperScoreReadyInfo): void;\n onPlay?(): void;\n onStop?(): void;\n onError?(error: Error): void;\n /** Focus the reader on mount so page-turn keys work before any click. */\n autoFocus?: boolean;\n ref?: React.Ref<PepperScoreHandle>;\n};\n/** The widest control gutter a viewport can spare. */\nconst maxControlGutter = (width: number) => Math.max(120, Math.round(width * .42));\n/** Keyboard steps on the stave scale slider commit once they settle; drags and pinches commit on release. */\nconst STAVE_SCALE_COMMIT_MS = 180;\n/** A per-score record read never holds up the first paint for longer than this. */\nconst SCORE_RECORD_TIMEOUT_MS = 1200;\nconst readScoreRecord = (scoreDb: ScoreDb, source: FileSource) => Promise.race([\n scoreDb.read(source).catch(() => null),\n new Promise<null>(resolve => setTimeout(() => resolve(null), SCORE_RECORD_TIMEOUT_MS)),\n]);\n/** After a user scroll (wheel, scrollbar drag, page turn) playback follow leaves the view alone this long. */\nconst FOLLOW_SUSPEND_MS = 2500;\n/** A programmatic smooth scroll counts as in flight until it lands, or for at most this long. */\nconst SCROLL_SETTLE_MS = 900;\n/** Guidance added to the renderer's out-of-memory message. */\nconst OOM_GUIDANCE = 'Close other tabs, or try again with smaller sections.';\n/** Shown when the renderer kept restarting under a draw (other readers on the page running out of memory). */\nconst RENDERER_RESTARTED = 'The notation renderer restarted while drawing this score.';\n/** Draws re-run this many times after a renderer restart before the reader reports it. */\nconst RESTART_REDRAWS = 2;\nconst LAST_FILE_PRIVACY = 'The last opened file is kept only on this device (in this browser), so it can be reopened after a reload. It is never uploaded.';\nconst scrollBehavior = (): ScrollBehavior => window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth';\nconst flag = (element: HTMLElement, key: 'psShort' | 'psTiny' | 'psWide', on: boolean) => { if (on) element.dataset[key] = ''; else delete element.dataset[key]; };\n/** Where the viewport centre sits in a measure, so a re-layout can put that point back at the centre. */\ntype ZoomAnchor = { index: number; fx: number; fy: number };\n\nexport default function PepperScore({ musicXml, file, scoreUrl, abc, chrome: preset = 'full', controls, view, height, className, ariaLabel, settings, persist, assetBaseUrl, soundPack = 'core', soundSources, onReady, onPlay, onStop, onError, autoFocus, ref }: PepperScoreProps) {\n const chrome = useMemo(() => resolveChrome(preset, controls), [preset, controls?.mixer, controls?.openFile, controls?.drawer, controls?.transport, controls?.viewToggle, controls?.zoom]);\n const storage = useMemo(() => readerStorage(persist ?? (preset === 'full' ? 'pepperscore' : false)), [persist, preset]);\n // Host settings and view as prefs; only keys the host gives are applied (on mount, on each score load, and when they change).\n const settingsKey = JSON.stringify(settings ?? {});\n const hostPrefs = useMemo<Partial<Prefs>>(() => {\n const mapped = settingsToPrefs(settings);\n if (mapped.zoom != null) mapped.zoom = clampStaveScale(mapped.zoom);\n return { ...mapped, ...(view ? { mode: viewToMode(view) } : {}) };\n }, [settingsKey, view]);\n const hostPrefsRef = useRef(hostPrefs);\n const callbacks = useRef({ onReady, onPlay, onStop, onError });\n callbacks.current = { onReady, onPlay, onStop, onError };\n const natural = !height && preset !== 'full';\n const storageRef = useRef(storage);\n storageRef.current = storage;\n const [score, setScore] = useState<Score>(sampleScore);\n const [scoreRevision, setScoreRevision] = useState(0);\n const [prefs, setPrefs] = useState<Prefs>(defaults);\n const [source, setSource] = useState<FileSource | null>(null);\n const [hiddenIds, setHiddenIds] = useState<string[]>([]);\n const [trackVolumes, setTrackVolumes] = useState<Record<string, number>>({});\n const [drawer, setDrawer] = useState(false);\n const [mixer, setMixer] = useState(false);\n const [openDialog, setOpenDialog] = useState(false);\n const [pickerPartId, setPickerPartId] = useState<string | null>(null);\n const [pickerFamily, setPickerFamily] = useState<GmFamily>('Keyboard');\n const [pickerPage, setPickerPage] = useState(0);\n const [abcDraft, setAbcDraft] = useState(sampleAbc);\n const [error, setError] = useState('');\n const [notice, setNotice] = useState('');\n /** Non-blocking \"large score, this may take a while\" notice for the file being opened. */\n const [largeNotice, setLargeNotice] = useState('');\n /** The large-score notice clears when the score it was shown for paints (armed once that score is loaded). */\n const largeNoticeArmedRef = useRef(false);\n /** An out-of-memory error and what to re-run after shrinking the engraving chunks; shown while `error` is its message. */\n const [oomRetry, setOomRetry] = useState<{ message: string; kind: 'open' | 'draw' } | null>(null);\n /** The file most recently passed to readFile, for an out-of-memory retry. */\n const lastFileRef = useRef<File | null>(null);\n /** The remembered last opened file (stored on this device), and whether to offer reopening it. */\n const [lastFileInfo, setLastFileInfo] = useState<LastFileInfo | null>(null);\n const [reopenOffer, setReopenOffer] = useState<LastFileInfo | null>(null);\n const [playing, setPlaying] = useState(false);\n const [loadingAudio, setLoadingAudio] = useState(false);\n const [loadingFont, setLoadingFont] = useState(false);\n const [painted, setPainted] = useState(false);\n const [painting, setPainting] = useState(true);\n const [resizeTick, setResizeTick] = useState(0);\n /** Bumped when systems are drawn, released or resized after the first paint (large scores draw on demand). */\n const [layoutTick, setLayoutTick] = useState(0);\n const [active, setActive] = useState<string | null>(null);\n const [activeNotes, setActiveNotes] = useState<string[]>([]);\n const [position, setPosition] = useState(0);\n const [ready, setReady] = useState(false);\n // Whether a score has loaded. Full chrome starts with the sample; the others show an empty frame until their source\n // loads. The first render depends only on the chrome, never on source props, so a client-only source (the demo's\n // ?score= link) cannot cause a hydration mismatch.\n const [loaded, setLoaded] = useState(preset === 'full');\n const [staffCenters, setStaffCenters] = useState<Record<string, number>>({});\n const [controlMetrics, setControlMetrics] = useState<PartControlMetrics>(() => partControlMetrics(72));\n const [zoomDraft, setZoomDraft] = useState<number | null>(null);\n const zoomCommitRef = useRef(0);\n /** Stave scale of the score on screen (the resolved default when prefs.zoom is null). */\n const [renderedZoom, setRenderedZoom] = useState(1);\n const renderedZoomRef = useRef(1);\n const prefsZoomRef = useRef<number | null>(null);\n prefsZoomRef.current = prefs.zoom;\n /** Slider floor: STAVE_SCALE_MIN, or lower when a many-staff height fit is smaller. */\n const staveScaleMinRef = useRef(STAVE_SCALE_MIN);\n const savedViewRef = useRef<ScoreView | undefined>(undefined);\n /** The next render is a zoom commit: no paint reveal or loading overlay, and the anchor measure is kept centred. */\n const quietRenderRef = useRef(false);\n const zoomAnchorRef = useRef<ZoomAnchor | null>(null);\n const previewOriginRef = useRef<{ x: number; y: number } | null>(null);\n /** A pointer is pressed on the stave scale slider. */\n const sliderPointerRef = useRef(false);\n /** Zoom handed to the pending quiet render, so a duplicate release (change + pointerup) does not commit twice. */\n const pendingZoomRef = useRef<number | null>(null);\n /** Latest native `change` handler for the slider (React's onChange is the `input` event). */\n const staveScaleChangeRef = useRef<(input: HTMLInputElement) => void>(() => {});\n const staveScaleInputRef = useRef<HTMLInputElement | null>(null);\n const [moreOpen, setMoreOpen] = useState(false);\n const moreRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const uid = useId();\n const panelId = `${uid}-more`;\n const overhangId = `${uid}-overhang`;\n const [scoreWidth, setScoreWidth] = useState(0);\n const fileRef = useRef<HTMLInputElement>(null);\n const viewportRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const renderRef = useRef<RenderResult | null>(null);\n /** This reader's players and track gains on the page's shared AudioContext and master (audio-engine.ts). */\n const audioRef = useRef<{ context: AudioContext; master: DynamicsCompressorNode; players: Map<string, AudioPlayer[]>; partKeys: Map<string, string>; trackGains: Map<string, GainNode>; mixScale: number } | null>(null);\n const playRef = useRef<{ start: number; beat: number; frame: number; interval?: ReturnType<typeof setInterval> } | null>(null);\n const scheduledStopsRef = useRef<Array<{ stop: () => void; end: number }>>([]);\n const playRunRef = useRef(0);\n const importRunRef = useRef(0);\n const renderRunRef = useRef(0);\n const swipeRef = useRef<{ x: number; y: number } | null>(null);\n const pinchRef = useRef<{ distance: number; zoom: number; nextZoom: number } | null>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const hasPaintedRef = useRef(false);\n const modeRef = useRef(prefs.mode);\n modeRef.current = prefs.mode;\n const overlapRef = useRef(prefs.overlap);\n overlapRef.current = prefs.overlap;\n /** Vertical reading pages (see paging.ts), recomputed from the rendered systems whenever they are used. */\n const pagesRef = useRef<{ pages: ReadingPage[]; spans: SystemSpan[] }>({ pages: [], spans: [] });\n /** Extra space below the score so the last page start can reach the viewport top. */\n const pageTailRef = useRef(0);\n /** Destination of the last programmatic smooth scroll, so a turn or follow during it builds on where it lands. */\n const scrollTargetRef = useRef<{ top: number; left: number; at: number } | null>(null);\n const userScrollAtRef = useRef(-Infinity);\n const assetBase = useMemo(() => resolveAssetBase(assetBaseUrl, soundPack), [assetBaseUrl, soundPack]);\n // This reader's Verovio channel (opened in an effect and closed in its cleanup, so StrictMode's remount gets a new one):\n // its imports and renders never supersede another reader's on the shared worker.\n const channelRef = useRef(0);\n const restartRedrawsRef = useRef(0);\n /** The score revision onReady last fired for. */\n const readyRevisionRef = useRef(-1);\n useEffect(() => { const channel = openVerovioChannel(); channelRef.current = channel; return () => { cancelImports(channel); closeVerovioChannel(channel); }; }, []);\n useEffect(() => ensureMusicFonts(assetBase, failed => warnAssetBase(assetBase, failed)), [assetBase]);\n const hiddenSet = useMemo(() => new Set(hiddenIds), [hiddenIds]);\n const visibleScore = useMemo(() => {\n const parts = score.parts.filter(part => !hiddenSet.has(part.id));\n return { ...score, parts: parts.length ? parts : score.parts.slice(0, 1) };\n }, [score, hiddenSet]);\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n for (const [id, gain] of audio.trackGains) gain.gain.setTargetAtTime((trackVolumes[id] ?? 100) / 100 * audio.mixScale, audio.context.currentTime, .015);\n }, [trackVolumes]);\n // Verovio can only transpose written pitch to sounding pitch, so concert-basis scores always show concert pitch.\n const concertBasis = score.parts.some(part => part.pitchBasis === 'concert');\n const scorePitch = concertBasis ? 'concert' : prefs.scorePitch;\n const displayScore = useMemo(() => scoreForView(score, scorePitch, prefs.semitones, prefs.keyFlip), [score, scorePitch, prefs.semitones, prefs.keyFlip]);\n // The key readout (\"+2 · D\") and the enharmonic key the flip offers, for the score as it is shown (header and drawer).\n const readout = useMemo(() => transposeReadout(score, scorePitch, prefs.semitones, prefs.keyFlip), [score, scorePitch, prefs.semitones, prefs.keyFlip]);\n const hasTransposingParts = score.parts.some(part => part.transposition?.semitones || part.measures.some(measure => measure.transposition?.semitones));\n // The performance timeline is built when playback first needs it, not while a score loads: on a large score it is\n // seconds of main-thread work that would otherwise hold up the first paint (docs/specs/large-score-performance.md).\n // It is built once per score (by the import worker when it registered one), in beats: BPM and transposition are\n // applied while playing, and hiding parts only filters it, so none of them rebuild it.\n const timelineRef = useRef<{ key: object; visible: string; timeline: BaseTimeline } | null>(null);\n const timelineKey: object = score.document || score;\n const visibleKey = visibleScore.parts.map(part => part.id).join('\\u0000');\n const timelineOf = useCallback((): BaseTimeline | null => {\n const cached = timelineRef.current;\n return cached && cached.key === timelineKey && cached.visible === visibleKey ? cached.timeline : null;\n }, [timelineKey, visibleKey]);\n const loadTimeline = useCallback(async (): Promise<BaseTimeline> => {\n const cached = timelineOf();\n if (cached) return cached;\n const timeline = deriveTimeline(await baseTimelineFor(score), { visiblePartIds: visibleScore.parts.map(part => part.id) });\n timelineRef.current = { key: timelineKey, visible: visibleKey, timeline };\n return timeline;\n }, [timelineOf, score, visibleScore, timelineKey, visibleKey]);\n\n useEffect(() => {\n setPrefs({ ...sanitizeSavedPrefs(storage.readPrefs()), ...hostPrefsRef.current });\n const hasSource = Boolean(musicXml || file || scoreUrl || abc);\n // The last opened file is offered (never opened) on start, unless a score was supplied or one is already opening.\n let offerCancelled = false;\n void storage.lastFile.readInfo().then(info => {\n if (offerCancelled) return;\n setLastFileInfo(info);\n if (chrome.openFile && info && !hasSource && importRunRef.current === 0 && !storage.reopenDismissed()) setReopenOffer(info);\n });\n // A supplied score loads in the source effect below; without one, only full chrome shows the sample (the others\n // stay an empty frame: never ready, nothing engraved).\n if (hasSource || preset !== 'full') return () => { offerCancelled = true; };\n // The sample's record (saved zoom and settings) is read before the first paint.\n let cancelled = false;\n const sample = score;\n const src = sampleSource(sample);\n void readScoreRecord(storageRef.current.scoreDb, src).then(saved => {\n if (cancelled) return;\n if (importRunRef.current === 0) loadScore(sample, src, saved);\n setReady(true);\n });\n return () => { cancelled = true; offerCancelled = true; };\n }, []);\n // Global prefs are saved with the host's settings applied (they are re-applied on mount anyway); a key the host later\n // drops keeps its last value here.\n useEffect(() => { if (ready) { const { zoom: _zoom, ...global } = prefs; storage.writePrefs(global); } }, [prefs, ready, storage]);\n useEffect(() => {\n if (!ready || !source) return;\n const view = prefs.zoom !== null ? { zoom: prefs.zoom, zoomDevice: deviceClass() } : savedViewRef.current;\n savedViewRef.current = view;\n storage.scoreDb.write(buildFileState(source, prefs, score, hiddenIds, trackVolumes, view));\n }, [ready, source, prefs, score, hiddenIds, trackVolumes, storage]);\n // Unload can cut an IndexedDB transaction short, so pending writes are also saved synchronously (write-ahead).\n useEffect(() => {\n const { scoreDb } = storage;\n const persistPending = () => scoreDb.persistPending();\n const hidden = () => { if (document.visibilityState === 'hidden') persistPending(); };\n window.addEventListener('pagehide', persistPending);\n document.addEventListener('visibilitychange', hidden);\n return () => { window.removeEventListener('pagehide', persistPending); document.removeEventListener('visibilitychange', hidden); void scoreDb.flush(); };\n }, [storage]);\n const update = (patch: Partial<Prefs>) => {\n if (['mode', 'notationFont', 'annotationFont', 'barsPerLine', 'names', 'chordSymbols', 'inferChordSymbols', 'counts', 'subdivisions', 'semitones', 'scorePitch', 'keyFlip'].some(key => key in patch && patch[key as keyof Prefs] !== prefs[key as keyof Prefs])) setPainting(true);\n if (patch.mode && patch.mode !== prefs.mode) viewportRef.current?.scrollTo({ left: 0, top: 0 });\n setPrefs(prev => ({ ...prev, ...patch }));\n };\n // Another reader starting playback stops this one through the shared owner slot (audio-engine claimPlayback).\n const stopRef = useRef<(reset?: boolean) => void>(() => {});\n const playbackOwner = useMemo(() => ({ stop: () => stopRef.current(true) }), []);\n const stop = useCallback((reset = false) => {\n releasePlayback(playbackOwner);\n playRunRef.current += 1;\n if (playRef.current) { cancelAnimationFrame(playRef.current.frame); clearInterval(playRef.current.interval); }\n playRef.current = null;\n scheduledStopsRef.current.splice(0).forEach(item => item.stop());\n audioRef.current?.players.forEach(players => players.forEach(player => player.stop()));\n setPlaying(false);\n setLoadingAudio(false);\n if (reset) { setPosition(0); setActive(null); setActiveNotes([]); }\n }, []);\n stopRef.current = stop;\n const changePitch = (patch: Partial<Prefs>) => { stop(true); update(patch); };\n const transposeBy = (delta: number) => changePitch({ semitones: clampSemitones(prefs.semitones + delta) });\n /** Show a score with its saved record (if any). The saved zoom applies only on the device class it was chosen on. */\n const loadScore = (next: Score, nextSource: FileSource, saved: FileState | null) => {\n const device = deviceClass();\n savedViewRef.current = saved?.view;\n const zoom = saved?.view?.zoomDevice === device ? saved.view.zoom : null;\n const restored = saved ? { ...next, parts: next.parts.map(part => {\n const state = saved.parts[part.id];\n if (!state) return part;\n return { ...part, instrument: state.instrument, gmSoundfont: state.gmSoundfont || (state.instrument === part.instrument ? part.gmSoundfont : instrumentDetails(state.instrument).soundfont || undefined) };\n }) } : next;\n stop(true); setPainting(true); setPickerPartId(null); setScore(restored); setScoreRevision(value => value + 1); setSource(nextSource); setLoaded(true);\n setHiddenIds(saved ? next.parts.filter(part => saved.parts[part.id]?.visible === false).map(part => part.id) : []);\n setTrackVolumes(saved ? Object.fromEntries(next.parts.map(part => [part.id, saved.parts[part.id]?.volume ?? 100])) : {});\n setError('');\n // A saved per-score record (persist on) wins over the host's settings and view: they are initial values, and the\n // reader's own edits to this score are newer. Without a record, the per-score resets (zoom, transposition, pitch\n // view) take the host's value for the keys it gives; every other pref keeps what the reader has now (drawer edits).\n const host = hostPrefsRef.current;\n const hostResets: Partial<Prefs> = Object.fromEntries((['zoom', 'semitones', 'scorePitch'] as const).filter(key => host[key] !== undefined).map(key => [key, host[key]]));\n setPrefs(prev => saved ? { ...prev, ...saved.settings, zoom } : { ...prev, bpm: clampBpm(Math.round(next.tempo)), zoom: null, semitones: 0, keyFlip: false, scorePitch: next.parts.some(part => part.pitchBasis === 'concert') ? 'concert' : 'written', ...hostResets });\n viewportRef.current?.scrollTo({ left: 0, top: 0 });\n setDrawer(false);\n };\n /** Import supplied MusicXML text (read and identified in the import worker, like a file). */\n const readMusicXml = async (text: string) => {\n const run = ++importRunRef.current;\n setReady(true);\n startOpening(); stop(true); setPainting(true);\n try {\n const job = importMusicXmlText(text, 'MusicXML', channelRef.current);\n const src = await job.source;\n const [saved, next] = await Promise.all([readScoreRecord(storageRef.current.scoreDb, src), job.score]);\n if (run !== importRunRef.current) return;\n if (next.document) await prepareEngraving(next.document);\n if (run === importRunRef.current) loadScore(next, src, saved);\n } catch (e) {\n if (run === importRunRef.current) { setPainting(false); showError(e, 'Could not read the supplied MusicXML.'); }\n }\n };\n /**\n * Show an error; an out-of-memory one gets guidance and a retry with smaller engraving chunks. So does a renderer that\n * kept restarting under this reader (other readers running out of memory), which has no raw message to show.\n */\n const showError = (e: unknown, fallback: string, retry?: 'open' | 'draw') => {\n const restarted = isRestarted(e);\n if (retry && (isOutOfMemory(e) || restarted)) {\n const message = `${restarted ? RENDERER_RESTARTED : (e as Error).message} ${OOM_GUIDANCE}`;\n setOomRetry({ message, kind: retry });\n setError(message);\n return;\n }\n setError(restarted ? RENDERER_RESTARTED : e instanceof Error ? e.message : fallback);\n };\n /** Import a score's engraving on this reader's channel; a renderer restart under it is tried once more. */\n const prepareEngraving = (doc: NonNullable<Score['document']>) => prepareVerovio(doc, channelRef.current)\n .catch(error => isRestarted(error) ? prepareVerovio(doc, channelRef.current) : Promise.reject(error));\n /** Opening any score retires the large-score notice, the reopen offer and the last error (so a repeated failure reports again). */\n const startOpening = () => { largeNoticeArmedRef.current = false; setLargeNotice(''); setReopenOffer(null); setError(''); };\n const readFile = async (file?: File) => {\n if (!file) return;\n const run = ++importRunRef.current;\n setReady(true);\n lastFileRef.current = file;\n startOpening();\n const phone = deviceClass() === 'compact';\n const largeBytes = isLargeFile(file.size);\n if (largeBytes) setLargeNotice(largeScoreMessage(file.size, { phone }));\n stop(true);\n setPainting(true);\n await new Promise<void>(resolve => requestAnimationFrame(() => resolve()));\n try {\n // The import worker reads and hashes the file once and parses it off the main thread; the saved record is read\n // while the score imports, so its zoom is applied before the first paint.\n const job = importScoreFile(file, channelRef.current);\n const nextSource = await job.source;\n const [saved, nextScore] = await Promise.all([readScoreRecord(storageRef.current.scoreDb, nextSource), job.score]);\n // A compact file (an .mxl, a dense MIDI) can still be a large score: warn before engraving starts.\n if (!largeBytes && run === importRunRef.current && isLargeScore(nextScore)) setLargeNotice(largeScoreMessage(file.size, { phone, staffMeasures: staffMeasures(nextScore) }));\n if (run !== importRunRef.current) return;\n if (nextScore.document) await prepareEngraving(nextScore.document);\n if (run === importRunRef.current) {\n largeNoticeArmedRef.current = true;\n loadScore(nextScore, nextSource, saved);\n // Remembered after the import succeeds, off the open path; an unchanged file is not written again.\n if (!isSameFile(lastFileInfo, file)) void storageRef.current.lastFile.remember(file).then(info => { if (info) setLastFileInfo(info); });\n }\n }\n catch (e) { if (run === importRunRef.current) { setPainting(false); setLargeNotice(''); showError(e, 'Could not open this file.', 'open'); } }\n };\n /** Download a public score and open it like a chosen file. */\n const readUrl = async (url: string) => {\n const run = ++importRunRef.current;\n setReady(true);\n startOpening(); stop(true); setPainting(true); setError('');\n try {\n const file = await fetchScoreFile(url, document.baseURI);\n if (run === importRunRef.current) await readFile(file);\n }\n catch (e) { if (run === importRunRef.current) { setPainting(false); showError(e, 'Could not download this score.'); } }\n };\n // The supplied source: the first present of musicXml, file, scoreUrl and abc. A newer source (or unmount) retires an import in flight.\n useEffect(() => {\n if (musicXml) { void readMusicXml(musicXml); return () => { importRunRef.current++; }; }\n if (file) { void readFile(file); return () => { importRunRef.current++; }; }\n if (scoreUrl) { void readUrl(scoreUrl); return () => { importRunRef.current++; }; }\n if (abc) { void readAbc(abc); return () => { importRunRef.current++; }; }\n }, [musicXml, file, scoreUrl, abc]);\n // Host settings and view: a changed key is applied again (unchanged keys keep the reader's own edits).\n useEffect(() => {\n const previous = hostPrefsRef.current;\n hostPrefsRef.current = hostPrefs;\n const changed = Object.fromEntries(Object.entries(hostPrefs).filter(([key, value]) => previous[key as keyof Prefs] !== value)) as Partial<Prefs>;\n if (!Object.keys(changed).length || !ready) return;\n if ('semitones' in changed || 'scorePitch' in changed) changePitch(changed);\n else update(changed);\n }, [hostPrefs]);\n /** After an out-of-memory failure: engrave in smaller chunks and open or draw the score again. */\n const retryOutOfMemory = () => {\n const retry = oomRetry;\n if (!retry) return;\n reduceChunkSize();\n setOomRetry(null);\n setError('');\n if (retry.kind === 'open' && lastFileRef.current) { void readFile(lastFileRef.current); return; }\n setPainting(true);\n setResizeTick(value => value + 1);\n };\n const reopenLastFile = async () => {\n setReopenOffer(null);\n const record = await storage.lastFile.read();\n if (!record) { setLastFileInfo(null); setError('The last opened file is no longer stored on this device.'); return; }\n void readFile(lastFileToFile(record));\n };\n const dismissReopen = () => {\n setReopenOffer(null);\n storage.dismissReopen();\n };\n const forgetLast = () => { setReopenOffer(null); setLastFileInfo(null); void storage.lastFile.forget(); };\n const readAbc = async (text: string) => {\n const run = ++importRunRef.current;\n setReady(true);\n startOpening();\n setPainting(true);\n try {\n const src = textSource('abc', text, 'Pasted ABC');\n const [next, saved] = await Promise.all([parseAbc(text), readScoreRecord(storageRef.current.scoreDb, src)]);\n if (run === importRunRef.current) loadScore(next, src, saved);\n } catch (e) { if (run === importRunRef.current) { setPainting(false); setError(e instanceof Error ? e.message : 'Could not read ABC notation.'); } }\n };\n const loadSample = async () => {\n const run = ++importRunRef.current;\n startOpening();\n setPainting(true);\n const sample = sampleScore();\n const src = sampleSource(sample);\n const saved = await readScoreRecord(storageRef.current.scoreDb, src);\n if (run === importRunRef.current) loadScore(sample, src, saved);\n };\n const togglePart = (id: string) => {\n if (!hiddenSet.has(id) && visibleScore.parts.length <= 1) return;\n stop(true); setPainting(true);\n setHiddenIds(previous => previous.includes(id) ? previous.filter(partId => partId !== id) : [...previous, id]);\n viewportRef.current?.scrollTo({ left: 0, top: 0 });\n };\n /** The stave a lone visible part is focused on, if any. */\n const focusedId = score.parts.length > 1 && visibleScore.parts.length === 1 ? visibleScore.parts[0].id : null;\n /** Focus hides every other stave; focusing the focused stave again shows them all. */\n const focusPart = (id: string) => {\n stop(true); setPainting(true);\n setHiddenIds(focusedId === id ? [] : score.parts.filter(part => part.id !== id).map(part => part.id));\n viewportRef.current?.scrollTo({ left: 0, top: 0 });\n };\n const resetStaves = () => { stop(true); setPainting(true); setHiddenIds([]); viewportRef.current?.scrollTo({ left: 0, top: 0 }); };\n // Stave scale: while dragging or pinching, a GPU transform previews the new size around the viewport centre;\n // the commit re-lays out at the new scale in place (no paint reveal) and keeps the centre measure centred.\n const viewportCentre = () => {\n const viewport = viewportRef.current;\n if (!viewport) return null;\n const view = viewport.getBoundingClientRect();\n return { x: view.left + viewport.clientLeft + viewport.clientWidth / 2, y: view.top + viewport.clientTop + viewport.clientHeight / 2 };\n };\n // The whole score content (title included) is scaled, with the paint-reveal transition off so it tracks the pointer.\n const previewStaveScale = (draft: number) => {\n const content = contentRef.current, centre = viewportCentre();\n if (!content || !centre) return;\n if (!previewOriginRef.current) {\n const box = content.getBoundingClientRect();\n previewOriginRef.current = { x: centre.x - box.left, y: centre.y - box.top };\n content.style.transition = 'none';\n content.style.transformOrigin = `${previewOriginRef.current.x}px ${previewOriginRef.current.y}px`;\n content.style.willChange = 'transform';\n }\n content.style.transform = `scale(${draft / renderedZoomRef.current})`;\n };\n const clearStaveScalePreview = () => {\n const content = contentRef.current;\n if (!previewOriginRef.current || !content) return;\n previewOriginRef.current = null;\n content.style.transform = ''; content.style.transformOrigin = ''; content.style.willChange = '';\n // Settle the style without a transition, then hand the reveal transition back.\n void getComputedStyle(content).transform;\n content.style.transition = '';\n };\n const captureZoomAnchor = (): ZoomAnchor | null => {\n const centre = viewportCentre(), measures = renderRef.current?.measures;\n if (!centre || !measures?.length) return null;\n let best: { measure: MeasureGeometry; rect: DOMRect; distance: number } | null = null;\n for (const measure of measures) {\n const rect = measure.element?.getBoundingClientRect();\n if (!rect || !rect.width) continue;\n const distance = Math.hypot(Math.max(rect.left - centre.x, 0, centre.x - rect.right), Math.max(rect.top - centre.y, 0, centre.y - rect.bottom));\n if (!best || distance < best.distance) best = { measure, rect, distance };\n }\n if (!best) return null;\n const clamp01 = (value: number) => Math.max(0, Math.min(1, value));\n return { index: best.measure.index, fx: clamp01((centre.x - best.rect.left) / best.rect.width), fy: clamp01((centre.y - best.rect.top) / best.rect.height) };\n };\n const restoreZoomAnchor = (anchor: ZoomAnchor, result: RenderResult, mode: Prefs['mode']) => {\n const viewport = viewportRef.current, centre = viewportCentre();\n // An undrawn anchor (a large score draws systems on demand) falls back to its system block from layout data, with\n // the measure's share of it: exact for a drawn measure, approximate (equal-width measures) otherwise.\n let rect = result.measure(anchor.index)?.element?.getBoundingClientRect();\n if (!rect) {\n const system = result.systems[result.systemOfMeasure(anchor.index)];\n const block = system && canvasRef.current?.querySelector<HTMLElement>(`:scope > .score-system[data-system=\"${system.index}\"]`)?.getBoundingClientRect();\n if (block && system.measureCount > 0) {\n const share = block.width / system.measureCount;\n rect = new DOMRect(block.left + share * Math.max(0, anchor.index - system.firstMeasure), block.top, share, block.height);\n }\n }\n if (!viewport || !centre || !rect) return;\n const dx = rect.left + anchor.fx * rect.width - centre.x, dy = rect.top + anchor.fy * rect.height - centre.y;\n // Endless keeps its vertical centring; Vertical scrolls the anchor's system back to the centre.\n if (mode === 'landscape') viewport.scrollLeft += dx;\n else viewport.scrollTop += dy;\n };\n const commitStaveScale = (value: number) => {\n window.clearTimeout(zoomCommitRef.current);\n const next = clampStaveScale(value, staveScaleMinRef.current);\n setZoomDraft(null);\n const committed = quietRenderRef.current ? pendingZoomRef.current : prefsZoomRef.current;\n if (next === committed) { if (!quietRenderRef.current) clearStaveScalePreview(); return; }\n zoomAnchorRef.current = captureZoomAnchor();\n quietRenderRef.current = true;\n pendingZoomRef.current = next;\n setPrefs(prev => ({ ...prev, zoom: next }));\n };\n // `input` (React onChange) previews and moves the label; the native `change` event commits. Range inputs fire\n // `change` on release after a drag and once per keyboard step, so keyboard steps are debounced.\n const draftStaveScale = (value: number) => {\n const next = clampStaveScale(value, staveScaleMinRef.current);\n setZoomDraft(next);\n previewStaveScale(next);\n };\n staveScaleChangeRef.current = input => {\n window.clearTimeout(zoomCommitRef.current);\n const value = Number(input.value);\n if (sliderPointerRef.current) { sliderPointerRef.current = false; commitStaveScale(value); }\n else zoomCommitRef.current = window.setTimeout(() => commitStaveScale(value), STAVE_SCALE_COMMIT_MS);\n };\n // Fallback for engines that end a drag without `change`: commit on release if the value moved.\n const releaseStaveScale = (input: HTMLInputElement) => {\n if (!sliderPointerRef.current) return;\n sliderPointerRef.current = false;\n commitStaveScale(Number(input.value));\n };\n const onStaveScaleChange = useCallback((event: Event) => staveScaleChangeRef.current(event.currentTarget as HTMLInputElement), []);\n // The slider remounts when it moves in or out of the More panel, so (re)attach the native listener by ref.\n const staveScaleInput = useCallback((input: HTMLInputElement | null) => {\n staveScaleInputRef.current?.removeEventListener('change', onStaveScaleChange);\n staveScaleInputRef.current = input;\n input?.addEventListener('change', onStaveScaleChange);\n }, [onStaveScaleChange]);\n useEffect(() => () => window.clearTimeout(zoomCommitRef.current), []);\n useEffect(() => {\n if (!moreOpen) return;\n const outside = (event: PointerEvent) => { if (!moreRef.current?.contains(event.target as Node)) setMoreOpen(false); };\n const escape = (event: KeyboardEvent) => { if (event.key === 'Escape' && rootRef.current?.contains(event.target as Node)) { setMoreOpen(false); moreRef.current?.querySelector<HTMLButtonElement>('.header-more-toggle')?.focus(); } };\n document.addEventListener('pointerdown', outside);\n document.addEventListener('keydown', escape);\n return () => { document.removeEventListener('pointerdown', outside); document.removeEventListener('keydown', escape); };\n }, [moreOpen]);\n // Sizes come from the root, not the viewport: short/tiny/wide replace the old max-height/orientation media queries,\n // and a root wider than the header breakpoint closes the More panel.\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n const observer = new ResizeObserver(() => {\n const width = root.clientWidth, height = root.clientHeight, natural = root.dataset.psHeight === 'natural';\n flag(root, 'psShort', !natural && height <= 500);\n flag(root, 'psTiny', !natural && height <= 360);\n flag(root, 'psWide', width >= height);\n if (width > MOBILE_HEADER_BREAKPOINT) setMoreOpen(false);\n });\n observer.observe(root);\n return () => observer.disconnect();\n }, []);\n useEffect(() => { if (autoFocus) rootRef.current?.focus({ preventScroll: true }); }, []);\n // Keys are handled on the root, so focus has to stay inside it: an overlay takes focus when it opens, and when one\n // closes with focus lost to <body> (its close button unmounted) focus returns to the overlay still open, or the root.\n const focusOnMount = useCallback((element: HTMLElement | null) => { element?.focus({ preventScroll: true }); }, []);\n const overlaysRef = useRef('');\n useEffect(() => {\n const overlays = `${mixer}|${pickerPartId ?? ''}`, was = overlaysRef.current;\n overlaysRef.current = overlays;\n if (!was || was === overlays) return;\n const active = document.activeElement;\n if (active && active !== document.body && active.isConnected) return;\n rootRef.current?.querySelector<HTMLElement>('.instrument-picker-panel, .mixer-panel')?.focus({ preventScroll: true }) ?? rootRef.current?.focus({ preventScroll: true });\n }, [mixer, pickerPartId]);\n useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n let width = viewport.clientWidth;\n let height = viewport.clientHeight;\n const observer = new ResizeObserver(() => {\n // A height change keeps the layout but changes how many systems make a page.\n if (Math.abs(viewport.clientHeight - height) >= 1) { height = viewport.clientHeight; refreshPagesRef.current(); }\n if (Math.abs(viewport.clientWidth - width) < 1) return;\n width = viewport.clientWidth;\n setResizeTick(value => value + 1);\n });\n observer.observe(viewport);\n return () => observer.disconnect();\n }, []);\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || !ready) return;\n let disposed = false;\n const generation = ++renderRunRef.current;\n let timer = 0;\n let frame = 0;\n // A zoom commit keeps the current score on screen until the new layout replaces it in place.\n const quiet = quietRenderRef.current;\n quietRenderRef.current = false;\n const anchor = quiet ? zoomAnchorRef.current : null;\n zoomAnchorRef.current = null;\n if (!quiet) setPainting(true);\n const draw = async () => {\n try {\n if (disposed) return;\n setScoreWidth(previous => previous === canvas.clientWidth ? previous : canvas.clientWidth);\n // Every multi-stave score gets a focus button per stave; a hide button joins it from five staves.\n const buttons = (score.parts.length > 1 ? 1 : 0) + (score.parts.length > 4 ? 1 : 0);\n const maxGutter = maxControlGutter(canvas.clientWidth);\n // Without part controls (they follow the mixer) the score takes the full width.\n const metricsFor = (stavePx: number, staffPitchPx: number) => {\n const metrics = partControlMetrics(stavePx, { staffPitchPx, maxGutter, buttons });\n return chrome.partControls ? metrics : { ...metrics, gutter: 0 };\n };\n const metaHeight = canvas.closest('.score-content')?.querySelector('.score-meta')?.getBoundingClientRect().height || 0;\n // A natural-height root sizes to its score, so there is no viewport height to fit against.\n const availableHeight = natural ? 4000 : Math.max(120, (viewportRef.current?.clientHeight || 600) - metaHeight - 70);\n // Without a user zoom the default ('fit': four bars in Vertical) is re-resolved for the viewport, so rotation re-fits.\n const requested = prefs.zoom ?? 'fit';\n const result = await renderScore(canvas, displayScore, prefs.mode, prefs.names, prefs.counts, prefs.subdivisions, prefs.barsPerLine, prefs.chordSymbols, prefs.inferChordSymbols, availableHeight, requested, 0, { gutterFor: (stavePx, staffPitchPx) => metricsFor(stavePx, staffPitchPx).gutter, fitCap: ENDLESS_STAVE_SCALE[deviceClass()], fitFloor: minimumDefaultStaveScale(deviceClass()), font: prefs.notationFont, textFont: prefs.annotationFont, transpose: prefs.semitones, flip: prefs.keyFlip, scorePitch, hiddenPartIds: hiddenIds, generation, focusMeasure: anchor?.index, channel: channelRef.current });\n if (disposed || generation !== renderRunRef.current) { result.dispose(); return; }\n renderRef.current = result;\n // Systems drawn later (scrolling, playback) change block sizes: re-page, and let the playhead find new notes.\n result.onChange(() => {\n refreshPagesRef.current();\n canvas.closest<HTMLElement>('.score-content')?.style.setProperty('--landscape-content-width', `${canvas.scrollWidth + 88}px`);\n setLayoutTick(value => value + 1);\n });\n renderedZoomRef.current = result.zoom;\n const metrics = metricsFor(result.stavePx, result.staffPitchPx);\n // Commit the controls with the new SVG so no frame shows them against the other layout.\n flushSync(() => {\n setStaffCenters(Object.fromEntries(result.visiblePartIds.map((id, index) => [id, result.staffCenters[index]])));\n setControlMetrics(metrics);\n setRenderedZoom(result.zoom);\n });\n const content = canvas.closest<HTMLElement>('.score-content');\n // Staff controls size from the rendered stave, so their ratio to it holds at every zoom and fit.\n content?.style.setProperty('--stave-px', `${result.stavePx.toFixed(2)}px`);\n content?.style.setProperty('--stave-scale', (result.stavePx / 72).toFixed(4));\n content?.style.setProperty('--landscape-staff-center', `${result.visiblePartIds.length > 4 ? result.systemHeight / 2 : result.staffCenters[0] ?? 74}px`);\n content?.style.setProperty('--landscape-content-width', `${canvas.scrollWidth + 88}px`);\n const stage = canvas.closest<HTMLElement>('.score-stage');\n stage?.style.setProperty('--control-gutter', `${result.gutter}px`);\n clearStaveScalePreview();\n refreshPages();\n if (anchor) restoreZoomAnchor(anchor, result, prefs.mode);\n restartRedrawsRef.current = 0;\n setError('');\n if (scoreRevision > 0 && readyRevisionRef.current !== scoreRevision) {\n readyRevisionRef.current = scoreRevision;\n callbacks.current.onReady?.({ title: score.title, composer: score.composer || undefined, parts: score.parts.map(part => ({ id: part.id, name: part.name })), measures: score.parts[0]?.measures.length ?? 0 });\n }\n if (largeNoticeArmedRef.current) { largeNoticeArmedRef.current = false; setLargeNotice(''); }\n } catch (e) {\n // The renderer restarted under this draw (another reader ran out of memory): draw again, a bounded number of times.\n if (!disposed && isRestarted(e) && restartRedrawsRef.current < RESTART_REDRAWS) { restartRedrawsRef.current++; setResizeTick(value => value + 1); return; }\n if (!disposed && !isSuperseded(e)) {\n if (largeNoticeArmedRef.current) { largeNoticeArmedRef.current = false; setLargeNotice(''); }\n showError(e, 'Could not draw this score.', 'draw');\n }\n }\n finally {\n if (!disposed) frame = requestAnimationFrame(() => {\n hasPaintedRef.current = true;\n setPainted(true);\n setPainting(false);\n });\n }\n };\n setLoadingFont(false);\n const delay = !quiet && hasPaintedRef.current && !window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 260 : 0;\n timer = window.setTimeout(() => void draw(), delay);\n return () => { disposed = true; window.clearTimeout(timer); cancelAnimationFrame(frame); };\n }, [ready, resizeTick, scoreRevision, chrome.partControls, hiddenIds, prefs.mode, prefs.notationFont, prefs.annotationFont, prefs.names, prefs.chordSymbols, prefs.inferChordSymbols, prefs.counts, prefs.subdivisions, prefs.barsPerLine, prefs.zoom, prefs.semitones, prefs.keyFlip, scorePitch]);\n\n /** Each rendered system's top and bottom in the viewport's scroll coordinates (score title included). */\n const systemSpans = (): SystemSpan[] => {\n const viewport = viewportRef.current, canvas = canvasRef.current, content = contentRef.current;\n if (!viewport || !canvas || !content) return [];\n const blocks = [...canvas.querySelectorAll<HTMLElement>(':scope > .score-system')];\n // Rects are exact but follow the paint-reveal and zoom-preview transforms; offsets ignore them (whole pixels).\n if (getComputedStyle(content).transform === 'none') {\n const origin = viewport.getBoundingClientRect().top + viewport.clientTop - viewport.scrollTop;\n return blocks.map(block => { const rect = block.getBoundingClientRect(); return { top: rect.top - origin, bottom: rect.bottom - origin }; });\n }\n // Blocks share an offset parent: its offset is summed once (a long score has thousands of blocks).\n const shared = blocks[0]?.offsetParent as HTMLElement | null | undefined;\n let base = 0;\n for (let element = shared ?? null; element && element !== viewport; element = element.offsetParent as HTMLElement | null) base += element.offsetTop;\n return blocks.map(block => {\n let top = 0;\n if (block.offsetParent === shared) top = base + block.offsetTop;\n else for (let element: HTMLElement | null = block; element && element !== viewport; element = element.offsetParent as HTMLElement | null) top += element.offsetTop;\n return { top, bottom: top + block.offsetHeight };\n });\n };\n /** Recompute the Vertical pages from the rendered systems, and pad the score so the last page start is reachable. */\n const refreshPages = () => {\n const viewport = viewportRef.current, content = contentRef.current;\n if (!viewport || !content) return pagesRef.current;\n const spans = modeRef.current === 'portrait' ? systemSpans() : [];\n // The pad above a page stays inside the previous system's blank bottom margin (20 Verovio units).\n const pad = Math.min(PAGE_PAD_PX, 16 * (renderRef.current?.scale ?? 1));\n // A natural-height root shows its whole score: no pages, and no tail (which would grow the root it is measured by).\n const pages = spans.length && !natural ? systemPages(spans, viewport.clientHeight, overlapRef.current, pad) : [];\n const lastStart = pages.at(-1)?.start ?? 0;\n const tail = lastStart > 0 ? Math.max(0, Math.ceil(lastStart + viewport.clientHeight - (viewport.scrollHeight - pageTailRef.current))) : 0;\n if (tail !== pageTailRef.current) { pageTailRef.current = tail; content.style.setProperty('--page-tail', `${tail}px`); }\n return pagesRef.current = { pages, spans };\n };\n const refreshPagesRef = useRef(refreshPages);\n refreshPagesRef.current = refreshPages;\n const scrollViewport = (to: { top?: number; left?: number }) => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n const top = Math.max(0, Math.min(viewport.scrollHeight - viewport.clientHeight, to.top ?? viewport.scrollTop));\n const left = Math.max(0, Math.min(viewport.scrollWidth - viewport.clientWidth, to.left ?? viewport.scrollLeft));\n // Already there: nothing will be in flight (and no scroll event will mark it landed).\n scrollTargetRef.current = Math.abs(viewport.scrollTop - top) <= 1 && Math.abs(viewport.scrollLeft - left) <= 1 ? null : { top, left, at: performance.now() };\n viewport.scrollTo({ top, left, behavior: scrollBehavior() });\n };\n /** The destination of a programmatic scroll that has not landed yet. */\n const pendingScroll = () => {\n const viewport = viewportRef.current, target = scrollTargetRef.current;\n if (!viewport || !target || performance.now() - target.at > SCROLL_SETTLE_MS) return null;\n return Math.abs(viewport.scrollTop - target.top) > 1 || Math.abs(viewport.scrollLeft - target.left) > 1 ? target : null;\n };\n // Endless turns by a viewport less the overhang bars; Vertical turns to the next or previous system page.\n const turn = useCallback((direction: number) => {\n const el = viewportRef.current;\n if (!el) return;\n userScrollAtRef.current = performance.now();\n const pending = pendingScroll();\n if (prefs.mode === 'landscape') {\n const step = Math.max(100, el.clientWidth - prefs.overlap * (renderRef.current?.barWidth || 230));\n scrollViewport({ left: (pending?.left ?? el.scrollLeft) + direction * step });\n } else {\n const target = turnTarget(refreshPages().pages, pending?.top ?? el.scrollTop, direction);\n if (target !== null) scrollViewport({ top: target });\n }\n }, [prefs.mode, prefs.overlap]);\n useEffect(() => { refreshPages(); }, [prefs.mode, prefs.overlap]);\n // Wheel and scrollbar drags are the reader's own scrolling: playback follow waits for them.\n useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n const manual = () => { userScrollAtRef.current = performance.now(); scrollTargetRef.current = null; };\n const scrollbar = (event: PointerEvent) => { if (event.target === viewport) manual(); };\n // A programmatic scroll that has landed is no longer in flight: a touch or other scroll away from it within\n // SCROLL_SETTLE_MS must not make the next turn or follow build on that stale destination.\n const landed = () => {\n const target = scrollTargetRef.current;\n if (target && Math.abs(viewport.scrollTop - target.top) <= 1 && Math.abs(viewport.scrollLeft - target.left) <= 1) scrollTargetRef.current = null;\n };\n viewport.addEventListener('wheel', manual, { passive: true });\n viewport.addEventListener('pointerdown', scrollbar);\n viewport.addEventListener('scroll', landed, { passive: true });\n return () => { viewport.removeEventListener('wheel', manual); viewport.removeEventListener('pointerdown', scrollbar); viewport.removeEventListener('scroll', landed); };\n }, []);\n // Keys act on the focused reader only: the handler sits on the root, so another instance (or the host page) never turns this one.\n const onRootKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape' && pickerPartId) { setPickerPartId(null); return; }\n if (event.key === 'Escape' && mixer) { setMixer(false); return; }\n if (pickerPartId || mixer || openDialog) return;\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes((event.target as HTMLElement).tagName)) return;\n if (['PageDown', 'ArrowRight', 'ArrowDown', ' '].includes(event.key)) { event.preventDefault(); turn(1); }\n if (['PageUp', 'ArrowLeft', 'ArrowUp'].includes(event.key)) { event.preventDefault(); turn(-1); }\n };\n // Where the playhead is when no engraved note marks it (an empty intro, rest bars, or an unmapped note):\n // the measure and its fraction, quantized to a 32nd of the bar so the effect below re-runs only as the line moves.\n const measureCursor = useMemo(() => {\n if (!playing && position <= 0) return null;\n if (active && renderRef.current?.point(active)?.element) return null;\n const timeline = timelineOf();\n if (!timeline) return null;\n const current = playbackPositionAt(timeline, position, prefs.bpm);\n const length = visibleScore.parts[0]?.measures[current.measureIndex]?.beats || 0;\n const fraction = length > 0 ? Math.max(0, Math.min(1, current.measureBeat / length)) : 0;\n return { measureIndex: current.measureIndex, fraction: Math.floor(fraction * 32) / 32 };\n }, [active, playing, position, timelineOf, visibleScore, layoutTick, prefs.bpm]);\n const measureCursorKey = measureCursor ? `${measureCursor.measureIndex}:${measureCursor.fraction}` : '';\n useEffect(() => {\n const result = renderRef.current;\n const note = active ? result?.point(active) : undefined;\n canvasRef.current?.querySelectorAll('.reader-note.is-playing').forEach(n => n.classList.remove('is-playing'));\n canvasRef.current?.querySelectorAll('.playback-line').forEach(n => n.remove());\n if (!chrome.playhead) return;\n for (const id of activeNotes) {\n const point = result?.point(id);\n if (point && !point.rest) point.element?.classList.add('is-playing');\n }\n // A note marks the playhead; otherwise it moves through the current measure's engraved bounds.\n const measure = !note?.element && measureCursor ? result?.measure(measureCursor.measureIndex) : undefined;\n const anchor = note?.element || measure?.element;\n // The playhead's system may not be drawn yet (large scores draw systems on demand): draw it, and this effect runs\n // again when it lands (layoutTick). Follow still scrolls to its placeholder block meanwhile.\n const pendingSystem = !anchor && measureCursor && result ? result.systemOfMeasure(measureCursor.measureIndex) : -1;\n if (pendingSystem >= 0) void result!.ensureSystem(pendingSystem);\n const block = anchor ? anchor.closest<HTMLElement>('.score-system') : pendingSystem >= 0 ? canvasRef.current?.querySelector<HTMLElement>(`:scope > .score-system[data-system=\"${pendingSystem}\"]`) : null;\n if (!block) return;\n const line = anchor ? document.createElement('div') : null;\n if (line) {\n line.className = 'playback-line';\n line.style.left = `${note?.element ? note.x : measure!.x + measure!.width * measureCursor!.fraction}px`;\n block.appendChild(line);\n }\n // Follow playback in page jumps: nothing moves while the active system is in view, a smooth scroll in flight\n // is left to land, and a reader who just scrolled keeps their view for a moment.\n const viewport = viewportRef.current;\n if (!viewport || !playRef.current || performance.now() - userScrollAtRef.current < FOLLOW_SUSPEND_MS || pendingScroll()) return;\n if (prefs.mode === 'landscape') {\n const view = viewport.getBoundingClientRect();\n const x = (line || block).getBoundingClientRect().left;\n if (x > view.left + view.width * .78 || x < view.left + view.width * .18) scrollViewport({ left: viewport.scrollLeft + x - view.left - view.width * .35 });\n return;\n }\n const { pages, spans } = refreshPages();\n const index = [...canvasRef.current?.querySelectorAll(':scope > .score-system') || []].indexOf(block);\n const span = spans[index], page = pageOfSystem(pages, index);\n if (!span || !page) return;\n const top = viewport.scrollTop, bottom = top + viewport.clientHeight;\n // A tall system is followed while any of it (and so the playback line) is in view; others must be wholly in view.\n const inView = page.tall ? span.top < bottom && span.bottom > top : span.top >= top - 1 && span.bottom <= bottom + 1;\n if (!inView && Math.abs(page.start - top) > 1) scrollViewport({ top: page.start });\n // measureCursor is read through its key, so the effect re-runs when the line moves rather than on every frame.\n }, [active, activeNotes, prefs.mode, painting, measureCursorKey, layoutTick]);\n\n // Returns null when the device can't produce sound (no output device, autoplay blocked, resume() never settling),\n // so playback falls back to a silent wall-clock run instead of hanging on a suspended AudioContext. Also null when the\n // built-in sounds at assetBaseUrl fail to load.\n const ensureAudio = async (timeline: BaseTimeline) => {\n if (!audioRef.current) {\n const sharedAudio = getSharedAudio();\n if (!sharedAudio) return null;\n audioRef.current = { ...sharedAudio, players: new Map(), partKeys: new Map(), trackGains: new Map(), mixScale: 1 };\n }\n const audio = audioRef.current;\n if (!await resumeAudio(audio.context)) return null;\n audio.mixScale = .8 / Math.sqrt(Math.max(1, visibleScore.parts.length));\n for (const part of visibleScore.parts) {\n let gain = audio.trackGains.get(part.id);\n if (!gain) { gain = audio.context.createGain(); gain.connect(audio.master); audio.trackGains.set(part.id, gain); }\n gain.gain.value = (trackVolumes[part.id] ?? 100) / 100 * audio.mixScale;\n }\n const pack = await loadPackInfo(assetBase);\n const page = document.baseURI;\n const plans = new Map(visibleScore.parts.map(part => [part.id, planSound(soundRequest(part), { sources: soundSources, fluidr3: pack.fluidr3, base: assetBase, page })]));\n audio.partKeys = new Map(visibleScore.parts.map(part => [part.id, audioKey(plans.get(part.id)!, part)]));\n // A built-in sound that fails to load (an assetBaseUrl with no sounds package behind it) plays silently, with one\n // console warning, instead of failing playback. A host soundSources entry that fails still reports an error.\n const builtinFailed = (e: unknown) => { warnAssetBase(assetBase, `built-in sounds (${e instanceof Error ? e.message : String(e)})`); return null; };\n for (const key of new Set(audio.partKeys.values())) {\n const matching = visibleScore.parts.filter(part => audio.partKeys.get(part.id) === key);\n const plan = plans.get(matching[0].id)!;\n const notes = playbackMidis(timeline, new Set(matching.map(part => part.id)), prefs.semitones);\n const destination = audio.trackGains.get(matching[0].id)!;\n const builtin = plan.sourceId.startsWith('builtin:');\n let players = audio.players.get(key);\n try {\n if (!players) { players = await loadPlayers(audio.context, plan, destination); audio.players.set(key, players); }\n await Promise.all(players.map(player => player.loadNotes?.(notes)));\n } catch (e) { if (builtin) return builtinFailed(e); throw e; }\n // The drum fallback is always the built-in TimGM6mb kit.\n if (plan.kind === 'note-files' && plan.drums) try { await addDrumFallback(audio.context, players, notes, fallbackSf2Url(assetBase), destination); } catch (e) { return builtinFailed(e); }\n }\n // Players no visible part uses any more (another score, a changed instrument, a hidden part) are released.\n const used = new Set(audio.partKeys.values());\n for (const [key, players] of audio.players) if (!used.has(key)) { players.forEach(player => player.dispose()); audio.players.delete(key); }\n return audio;\n };\n const play = async () => {\n // Nothing to play until a supplied score has loaded: an unloaded, loading or failed snippet never plays the hidden sample.\n if (!chrome.audio || !loaded) return;\n if (playing || loadingAudio) { stop(); return; }\n const run = ++playRunRef.current;\n claimPlayback(playbackOwner);\n try {\n setLoadingAudio(true);\n const timeline = await loadTimeline();\n if (run !== playRunRef.current) return;\n const audio = await ensureAudio(timeline);\n if (run !== playRunRef.current) return;\n setLoadingAudio(false);\n setNotice(audio ? '' : SILENT_PLAYBACK_NOTICE);\n // One clock drives scheduling and the cursor: audio time when sound works, wall time when playing silently.\n const now = audio ? () => audio.context.currentTime : () => performance.now() / 1000;\n const secondsStart = position;\n const started = now() + (audio ? .09 : 0);\n const bpm = prefs.bpm;\n const events = playbackEventsFrom(timeline, secondsStart, bpm, prefs.semitones);\n const duration = playbackDuration(timeline, bpm);\n let nextEvent = 0;\n const schedule = audio && (() => {\n const horizon = audio.context.currentTime + .5;\n while (nextEvent < events.length) {\n const event = events[nextEvent];\n const time = started + event.startSeconds - secondsStart;\n if (time > horizon) break;\n const duration = Math.max(.01, event.soundEndSeconds - event.startSeconds);\n const destination = audio.trackGains.get(event.partId);\n for (const player of audio.players.get(audio.partKeys.get(event.partId) ?? '') || []) scheduledStopsRef.current.push({ stop: player.start({ note: event.midi, time: Math.max(time, audio.context.currentTime), duration, velocity: event.velocity, destination }), end: time + duration });\n nextEvent++;\n }\n scheduledStopsRef.current = scheduledStopsRef.current.filter(item => item.end > audio.context.currentTime);\n });\n schedule?.();\n const interval = schedule ? setInterval(schedule, 50) : undefined;\n const tick = () => {\n const seconds = secondsStart + Math.max(0, now() - started);\n if (seconds >= duration) { stop(true); return; }\n const current = playbackPositionAt(timeline, seconds, bpm);\n setActive(current.noteId);\n setActiveNotes(previous => previous.join('|') === current.activeNoteIds.join('|') ? previous : current.activeNoteIds);\n setPosition(seconds);\n if (playRef.current) playRef.current.frame = requestAnimationFrame(tick);\n };\n playRef.current = { start: started, beat: secondsStart, frame: requestAnimationFrame(tick), interval };\n setPlaying(true);\n } catch (e) { if (run === playRunRef.current) { setLoadingAudio(false); releasePlayback(playbackOwner); setError(e instanceof Error ? e.message : 'Audio could not start.'); } }\n };\n // Host callbacks: onError for each shown error, onPlay/onStop on the playing edges (stop-others included).\n useEffect(() => { if (error) callbacks.current.onError?.(new Error(error)); }, [error]);\n const wasPlayingRef = useRef(false);\n useEffect(() => {\n if (playing && !wasPlayingRef.current) callbacks.current.onPlay?.();\n if (!playing && wasPlayingRef.current) callbacks.current.onStop?.();\n wasPlayingRef.current = playing;\n }, [playing]);\n const busyRef = useRef(false);\n busyRef.current = playing || loadingAudio;\n const latestPlayRef = useRef(play);\n latestPlayRef.current = play;\n const changePitchRef = useRef(changePitch);\n changePitchRef.current = changePitch;\n useImperativeHandle(ref, () => ({\n play: async () => { if (chrome.audio && !busyRef.current) await latestPlayRef.current(); },\n stop: () => stopRef.current(true),\n transpose: semitones => changePitchRef.current({ semitones: clampSemitones(Math.round(Number(semitones) || 0)) }),\n }), [chrome.audio]);\n // Unmount: release only this reader's players and track gains; the shared AudioContext and Verovio worker stay for other readers.\n useEffect(() => () => { importRunRef.current++; playRunRef.current++; renderRef.current?.dispose(); if (playRef.current) { cancelAnimationFrame(playRef.current.frame); clearInterval(playRef.current.interval); } scheduledStopsRef.current.splice(0).forEach(item => item.stop()); audioRef.current?.players.forEach(players => players.forEach(p => p.dispose())); audioRef.current?.trackGains.forEach(gain => gain.disconnect()); audioRef.current = null; releasePlayback(playbackOwner); }, []);\n const openInstrumentPicker = (part: Part) => {\n const currentSound = playbackSound(part);\n const selected = GM_SOUNDS.find(sound => (sound.soundfont || 'drum-kit') === currentSound);\n const family = selected?.family || 'Keyboard';\n setPickerFamily(family);\n setPickerPage(Math.max(0, Math.floor(GM_SOUNDS.filter(sound => sound.family === family).findIndex(sound => sound === selected) / 16)));\n setPickerPartId(part.id);\n };\n const changeInstrument = (partId: string, sound: GmSound) => {\n stop(true); setScore(prev => ({ ...prev, parts: prev.parts.map(p => p.id === partId ? { ...p, instrument: sound.iconId, gmProgram: sound.program || undefined, gmSoundfont: sound.soundfont || undefined } : p) }));\n setPickerPartId(null);\n };\n const pickerPart = score.parts.find(part => part.id === pickerPartId);\n const familySounds = GM_SOUNDS.filter(sound => sound.family === pickerFamily);\n const pickerPages = Math.ceil(familySounds.length / 16);\n const pickerSounds = familySounds.slice(pickerPage * 16, (pickerPage + 1) * 16);\n const hasScoreText = Boolean(score.title || score.subtitle || score.composer || score.credits?.length);\n // Auto bars follow the layout width in Verovio units: (width - gutter) / stave scale.\n const barsLimit = portraitBarLimit(Math.max(180, (scoreWidth || 800) - controlMetrics.gutter) / renderedZoom, visibleScore);\n // Always rendered (disabled in Endless, same footprint) so a saved mode applied after hydration can't add/remove it and shift the header.\n const barsDisabled = prefs.mode !== 'portrait';\n const barsSetting = <label className={`header-bars-setting ${barsDisabled ? 'is-disabled' : ''}`} title={barsDisabled ? 'Bars per line applies to Vertical view' : undefined}><span>Bars</span><select aria-label=\"Bars per line\" title={barsDisabled ? 'Bars per line applies to Vertical view' : `Auto fits up to ${barsLimit} bars`} disabled={barsDisabled} aria-disabled={barsDisabled} value={prefs.barsPerLine} onChange={event => update({ barsPerLine: event.target.value === 'auto' ? 'auto' : Number(event.target.value) })}><option value=\"auto\">Auto</option>{[1, 2, 3, 4].map(count => <option value={count} key={count}>{count}</option>)}</select></label>;\n\n const oomButton = oomRetry && oomRetry.message === error ? <button className=\"oom-retry-button\" onClick={retryOutOfMemory}>Try again with smaller sections</button> : null;\n const staveScale = zoomDraft ?? prefs.zoom ?? renderedZoom;\n const staveScaleMin = Math.min(STAVE_SCALE_MIN, renderedZoom);\n staveScaleMinRef.current = staveScaleMin;\n const staveScalePercent = Math.round(staveScale * 100);\n // Header and drawer readouts share state; only the visible one (drawer open or not) is a live region, so changes are announced once.\n // Key flip: aria-disabled (not disabled) so the button stays focusable and its label says why there is nothing to flip.\n const flipTo = readout.flipTo;\n const flipLabel = flipTo ? `Spell in ${spokenKey(flipTo)}` : 'No enharmonic key to flip to';\n const flipText = flipTo ? `${keyName(readout.key)} ↔ ${keyName(flipTo)}` : keyName(readout.key);\n const flipKey = () => { if (flipTo) changePitch({ keyFlip: !prefs.keyFlip }); };\n const transposeTitle = `Transposition ${prefs.semitones > 0 ? '+' : ''}${prefs.semitones} semitone${Math.abs(prefs.semitones) === 1 ? '' : 's'}, key ${spokenKey(readout.key)}`;\n const headerElements: Record<HeaderControlId, React.ReactNode> = {\n stop: <button className=\"icon-button stop-button\" aria-label=\"Stop playback\" title=\"Stop playback\" onClick={() => { stop(true); viewportRef.current?.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); }}><Square size={17} fill=\"currentColor\"/></button>,\n play: <button className={`play-button ${loadingAudio ? 'is-loading' : ''}`} aria-label={playing || loadingAudio ? 'Pause playback' : 'Play score'} onClick={play}>{playing || loadingAudio ? <Pause size={17} fill=\"currentColor\"/> : <Play size={17} fill=\"currentColor\"/>}<span className=\"play-button-label\">{loadingAudio ? 'Loading' : playing ? 'Pause' : 'Play'}</span></button>,\n openFile: <button className=\"header-open-file\" aria-label=\"Open score file\" title=\"Open score file\" aria-haspopup=\"dialog\" aria-expanded={openDialog} onClick={() => { setDrawer(false); setMoreOpen(false); setOpenDialog(true); }}><FolderOpen size={17}/><span className=\"header-open-file-label\">Open</span></button>,\n bpm: <label className=\"bpm-control\"><span>BPM</span><input type=\"number\" min={MIN_BPM} max={MAX_BPM} value={prefs.bpm} onChange={e => { stop(true); update({ bpm: clampBpm(Number(e.target.value) || 96) }); }}/></label>,\n mode: <div className=\"mode-toggle\" role=\"group\" aria-label=\"Reading mode\">\n <button aria-label=\"Vertical view\" title=\"Vertical view\" className={`mode-toggle-vertical ${prefs.mode === 'portrait' ? 'is-selected' : ''}`} onClick={() => update({ mode: 'portrait' })}><span className=\"mode-toggle-label-full\">Vertical</span><span className=\"mode-toggle-label-short\" aria-hidden=\"true\">V</span></button>\n <button aria-label=\"Endless view\" title=\"Endless view\" className={`mode-toggle-endless ${prefs.mode === 'landscape' ? 'is-selected' : ''}`} onClick={() => update({ mode: 'landscape' })}><span className=\"mode-toggle-label-full\">Endless</span><span className=\"mode-toggle-label-short\" aria-hidden=\"true\">E</span></button>\n </div>,\n transpose: <div className=\"header-transpose\" role=\"group\" aria-label=\"Transpose\">\n <span className=\"header-transpose-label\" aria-hidden=\"true\">Transpose</span>\n <span className=\"header-transpose-controls\">\n <button className=\"header-transpose-down\" aria-label=\"Transpose down a semitone\" title=\"Transpose down a semitone\" disabled={prefs.semitones <= -12} onClick={() => transposeBy(-1)}><Minus size={15}/></button>\n <output className=\"header-transpose-readout\" aria-live={drawer ? 'off' : 'polite'} title={transposeTitle}>{readout.text}</output>\n <button className=\"header-transpose-up\" aria-label=\"Transpose up a semitone\" title=\"Transpose up a semitone\" disabled={prefs.semitones >= 12} onClick={() => transposeBy(1)}><Plus size={15}/></button>\n </span>\n </div>,\n keyFlip: <div className=\"header-key-flip\">\n <span className=\"header-key-flip-caption\" aria-hidden=\"true\">Key spelling</span>\n <button className={`header-key-flip-button ${flipTo ? '' : 'is-disabled'}`} aria-label={flipLabel} title={flipLabel} aria-disabled={!flipTo} onClick={flipKey}><span className=\"header-key-flip-icon\" aria-hidden=\"true\">⇄</span><span className=\"header-key-flip-label\">{flipText}</span></button>\n </div>,\n bars: barsSetting,\n staveScale: <label className=\"header-stave-scale\" title=\"Stave scale\">\n <span className=\"header-stave-scale-label\">Scale</span>\n <input className=\"header-stave-scale-input\" type=\"range\" min={staveScaleMin} max={STAVE_SCALE_MAX} step={STAVE_SCALE_STEP} value={staveScale} aria-label=\"Stave scale\" aria-valuetext={`${staveScalePercent}%`} onChange={event => draftStaveScale(Number(event.target.value))}\n ref={staveScaleInput} onPointerDown={() => { sliderPointerRef.current = true; window.clearTimeout(zoomCommitRef.current); }}\n onPointerUp={event => releaseStaveScale(event.currentTarget)} onPointerCancel={event => releaseStaveScale(event.currentTarget)}/>\n <output className=\"header-stave-scale-value\">{staveScalePercent}%</output>\n </label>,\n mixer: <button className=\"icon-button mixer-trigger\" aria-label=\"Track mixer\" title=\"Track mixer\" aria-haspopup=\"dialog\" aria-expanded={mixer} onClick={() => { setDrawer(false); setMoreOpen(false); setMixer(true); }}><SlidersHorizontal size={18}/><span className=\"mixer-trigger-label\">Track mixer</span></button>,\n };\n const renderControls = (tier: 'primary' | 'secondary') => HEADER_CONTROLS.filter(control => control.tier === tier && chrome[HEADER_CONTROL_GROUP[control.id]] && headerElements[control.id]).map(control => <div key={control.id} className={`header-control header-control-${control.id}`} data-header-control={control.id}>{headerElements[control.id]}</div>);\n const primaryControls = renderControls('primary');\n const secondaryControls = renderControls('secondary');\n\n const heightMode = height === 'fill' ? 'fill' : height ? 'fixed' : natural ? 'natural' : 'auto';\n const compactLabel = playing || loadingAudio ? 'Stop playback' : 'Play score';\n return <div ref={rootRef} className={`pepperscore ${className ?? ''}`.trim()} data-ps-height={heightMode} style={heightMode === 'fixed' ? { height } : undefined}\n tabIndex={0} role=\"region\" aria-label={ariaLabel || (loaded && score.title ? `Score: ${score.title}` : 'Score reader')} onKeyDown={onRootKeyDown}>\n <main className={`app-shell ${chrome.drawer ? '' : 'no-drawer'}`}>\n {chrome.header && <header className=\"topbar\" aria-label=\"Playback transport\">\n {chrome.openFile && <input ref={fileRef} type=\"file\" accept={SCORE_FILE_ACCEPT} hidden onChange={e => { readFile(e.target.files?.[0]); e.target.value = ''; }}/>}\n <div className=\"transport\">\n {primaryControls}\n {/* Secondary controls render once. CSS lays them out inline above MOBILE_HEADER_BREAKPOINT and as the\n More dropdown (toggle shown, panel display:none until data-open) at or below it, so SSR paints the right arrangement. */}\n {secondaryControls.length > 0 && <div className=\"header-more\" ref={moreRef} data-open={moreOpen ? 'true' : 'false'}>\n <button className={`icon-button header-more-toggle ${moreOpen ? 'is-open' : ''}`} aria-label=\"More controls\" title=\"More controls\" aria-expanded={moreOpen} aria-controls={panelId} onClick={() => setMoreOpen(open => !open)}><Ellipsis size={19}/></button>\n <div id={panelId} className=\"header-secondary-panel\" role=\"group\" aria-label=\"Secondary controls\">{secondaryControls}</div>\n </div>}\n </div>\n </header>}\n {/* Shown once a score has loaded: an empty or failed snippet has nothing to play. */}\n {chrome.compactPlay && loaded && <button type=\"button\" className={`ps-compact-play icon-button ${loadingAudio ? 'is-loading' : ''}`} aria-label={compactLabel} title={compactLabel} onClick={() => { if (playing || loadingAudio) stop(true); else void play(); }}>{playing || loadingAudio ? <Square size={15} fill=\"currentColor\"/> : <Play size={15} fill=\"currentColor\"/>}</button>}\n\n {chrome.mixer && mixer && <div className=\"mixer-backdrop\" onMouseDown={event => { if (event.target === event.currentTarget) setMixer(false); }}>\n <section ref={focusOnMount} tabIndex={-1} className=\"mixer-panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Track mixer\">\n <div className=\"mixer-heading\"><div><SlidersHorizontal size={18}/><h2>Track mixer</h2></div><button className=\"icon-button\" aria-label=\"Close track mixer\" onClick={() => setMixer(false)}><X size={19}/></button></div>\n <p>Choose each track’s sound and volume.</p>\n <div className=\"mixer-tracks\">{score.parts.map(part => <div className=\"mixer-track\" key={part.id}><img src={instrumentDetails(part.instrument).icon} alt=\"\"/><span className=\"mixer-track-name\">{part.name}{hiddenSet.has(part.id) && <small>Muted · hidden</small>}</span><button className=\"icon-button mixer-visibility-button\" aria-label={`${hiddenSet.has(part.id) ? 'Show' : 'Hide'} ${part.name}`} title={`${hiddenSet.has(part.id) ? 'Show' : 'Hide'} ${part.name}`} aria-pressed={!hiddenSet.has(part.id)} onClick={() => togglePart(part.id)} disabled={!hiddenSet.has(part.id) && visibleScore.parts.length <= 1}>{hiddenSet.has(part.id) ? <EyeOff size={17}/> : <Eye size={17}/>}</button><button className=\"mixer-voice-button\" aria-label={`Voice for ${part.name}`} onClick={() => openInstrumentPicker(part)}>{part.gmSoundfont ? gmSoundfontLabel(part.gmSoundfont) : instrumentDetails(part.instrument).label}<ChevronDown size={14}/></button><label className=\"mixer-volume\"><span>Volume</span><input type=\"range\" min=\"0\" max=\"100\" value={trackVolumes[part.id] ?? 100} aria-label={`Volume for ${part.name}`} onChange={event => setTrackVolumes(previous => ({ ...previous, [part.id]: Number(event.target.value) }))}/><output>{trackVolumes[part.id] ?? 100}%</output></label></div>)}</div>\n </section>\n </div>}\n\n {chrome.openFile && openDialog && <OpenScoreDialog onClose={() => setOpenDialog(false)} onOpenFile={file => void readFile(file)} onOpenAbc={text => void readAbc(text)} onBrowse={() => fileRef.current?.click()}/>}\n\n {chrome.partControls && pickerPart && <div className=\"instrument-picker-backdrop\" onMouseDown={event => { if (event.target === event.currentTarget) setPickerPartId(null); }}>\n <section ref={focusOnMount} tabIndex={-1} className=\"instrument-picker-panel\" role=\"dialog\" aria-modal=\"true\" aria-label={`Choose voice for ${pickerPart.name}`}>\n <div className=\"instrument-picker-heading\"><div><h2>{pickerPart.name}</h2><p>Choose a playback sound</p></div><button className=\"icon-button\" aria-label=\"Close voice picker\" onClick={() => setPickerPartId(null)}><X size={19}/></button></div>\n <div className=\"instrument-family-filters\" role=\"group\" aria-label=\"Instrument families\">{GM_FAMILIES.map(family => <button key={family} className={pickerFamily === family ? 'is-selected' : ''} aria-pressed={pickerFamily === family} onClick={() => { setPickerFamily(family); setPickerPage(0); }}>{family}</button>)}</div>\n <div className=\"instrument-picker-grid\">{pickerSounds.map(sound => <button key={sound.program ?? 'drum-kit'} className={playbackSound(pickerPart) === (sound.soundfont || 'drum-kit') ? 'is-selected' : ''} aria-pressed={playbackSound(pickerPart) === (sound.soundfont || 'drum-kit')} onClick={() => changeInstrument(pickerPart.id, sound)}><img src={sound.icon} alt=\"\"/><span>{sound.label}</span></button>)}</div>\n <div className=\"instrument-picker-pages\"><button aria-label=\"Previous instruments\" disabled={pickerPage === 0} onClick={() => setPickerPage(page => page - 1)}><ChevronLeft size={18}/></button><span>Page {pickerPage + 1} of {pickerPages}</span><button aria-label=\"Next instruments\" disabled={pickerPage + 1 >= pickerPages} onClick={() => setPickerPage(page => page + 1)}><ChevronRight size={18}/></button></div>\n </section>\n </div>}\n\n <section className={`reader-area ps-${prefs.mode} ${score.parts.length > 4 ? 'has-many-staves' : ''} ${chrome.zoom ? '' : 'no-page-controls'}`}>\n <div className=\"edge-fade edge-start\"/><div className=\"edge-fade edge-end\"/>\n <div className=\"score-viewport\" ref={viewportRef} onTouchStart={e => {\n if (chrome.zoom && score.parts.length > 4 && e.touches.length === 2) {\n const distance = Math.hypot(e.touches[0].clientX - e.touches[1].clientX, e.touches[0].clientY - e.touches[1].clientY);\n pinchRef.current = { distance, zoom: renderedZoomRef.current, nextZoom: renderedZoomRef.current };\n swipeRef.current = null;\n } else if (!pinchRef.current && e.touches.length === 1) swipeRef.current = { x: e.touches[0].clientX, y: e.touches[0].clientY };\n }} onTouchMove={e => {\n if (!pinchRef.current || e.touches.length !== 2) return;\n const distance = Math.hypot(e.touches[0].clientX - e.touches[1].clientX, e.touches[0].clientY - e.touches[1].clientY);\n pinchRef.current.nextZoom = clampStaveScale(pinchRef.current.zoom * distance / Math.max(1, pinchRef.current.distance), staveScaleMinRef.current);\n setZoomDraft(pinchRef.current.nextZoom);\n previewStaveScale(pinchRef.current.nextZoom);\n }} onTouchEnd={e => {\n if (pinchRef.current) {\n const nextZoom = pinchRef.current.nextZoom;\n pinchRef.current = null;\n commitStaveScale(nextZoom);\n swipeRef.current = null;\n return;\n }\n if (!swipeRef.current) return;\n const dx = e.changedTouches[0].clientX - swipeRef.current.x, dy = e.changedTouches[0].clientY - swipeRef.current.y;\n const delta = prefs.mode === 'landscape' ? dx : dy;\n if (Math.abs(delta) > 65) turn(delta < 0 ? 1 : -1);\n swipeRef.current = null;\n }} onTouchCancel={() => { if (pinchRef.current) { setZoomDraft(null); clearStaveScalePreview(); } pinchRef.current = null; swipeRef.current = null; }}>\n {loadingFont && <div className=\"font-load-progress\" role=\"status\" aria-label=\"Loading notation font\"/>}\n {painting && (loaded || ready) && <div className=\"score-loading\" role=\"status\" aria-label={painted ? 'Rendering score' : 'Preparing score'}><span className=\"score-loading-spinner\"/><span>{painted ? 'Rendering score' : 'Preparing score'}</span></div>}\n {loaded && <div ref={contentRef} className={`score-content ${painting || !painted ? 'is-painting' : ''}`} data-stave-scale={painted ? renderedZoom : undefined} style={{ '--landscape-meta-offset': prefs.chordSymbols ? '0px' : '35px', '--annotation-font': textFonts[prefs.annotationFont] || textFonts.Sans, '--score-text-font': textFonts[prefs.annotationFont] || textFonts.Sans, '--music-font': prefs.notationFont } as React.CSSProperties}>\n {(hasScoreText || hiddenIds.length > 0) && <div className=\"score-meta\">\n {score.title && <h1>{score.title}</h1>}\n {score.subtitle && <p className=\"score-subtitle\">{score.subtitle}</p>}\n {score.composer && <p className=\"score-composer\">{score.composer}</p>}\n {score.credits?.map((line, i) => <p className=\"score-credit\" key={`${line}-${i}`}>{line}</p>)}\n {hiddenIds.length > 0 && <div className=\"hidden-staves\" aria-label=\"Hidden staves\">{score.parts.filter(part => hiddenSet.has(part.id)).map(part => <button key={part.id} onClick={() => togglePart(part.id)} title={`Show ${part.name}`} aria-label={`Show ${part.name}`}><img src={instrumentDetails(part.instrument).icon} alt=\"\"/><EyeOff size={15}/><span>{part.name}</span></button>)}</div>}\n </div>}\n <div className=\"score-stage\">\n <div className=\"score-staves\" ref={canvasRef}/>\n {chrome.partControls && <div className=\"part-controls\" style={{ '--part-icon': `${controlMetrics.icon}px`, '--part-font': `${controlMetrics.font}px`, '--part-eye': `${controlMetrics.eye}px`, '--part-control-height': `${controlMetrics.height}px` } as React.CSSProperties}>{visibleScore.parts.map((part, index) => <div key={part.id} className=\"part-control\" style={{ top: `${staffCenters[part.id] ?? 86 + index * ((prefs.names || prefs.counts) ? 125 : 100)}px` }} title={`Sound for ${part.name}`}><button className=\"instrument-control\" aria-label={`Instrument for ${part.name}`} aria-haspopup=\"dialog\" onClick={() => openInstrumentPicker(part)}><img className=\"part-icon\" src={instrumentDetails(part.instrument).icon} alt=\"\"/></button><span className=\"part-name\" title={part.name}>{part.name}</span>{score.parts.length > 1 && <button className={`staff-eye staff-focus ${focusedId === part.id ? 'is-focused' : ''}`} aria-label={focusedId === part.id ? 'Show all staves' : `Focus on ${part.name}`} title={focusedId === part.id ? 'Show all staves' : `Focus on ${part.name}`} aria-pressed={focusedId === part.id} onClick={() => focusPart(part.id)}><Focus size={17}/></button>}{score.parts.length > 4 && <button className=\"staff-eye\" aria-label={`Hide ${part.name}`} title={`Hide ${part.name}`} onClick={() => togglePart(part.id)} disabled={visibleScore.parts.length <= 1}><Eye size={17}/></button>}</div>)}</div>}\n </div>\n </div>}\n </div>\n {chrome.zoom && <div className=\"page-controls\"><button aria-label=\"Previous view\" onClick={() => turn(-1)}><ChevronLeft size={18}/></button><span>{prefs.mode === 'portrait' ? 'SCROLL TO READ' : 'SWIPE TO READ'}</span><button aria-label=\"Next view\" onClick={() => turn(1)}><ChevronRight size={18}/></button></div>}\n </section>\n\n {chrome.drawer && <>\n <button className={`drawer-handle ${drawer ? 'is-open' : ''}`} onClick={() => setDrawer(!drawer)} aria-expanded={drawer}><span className=\"handle-grip\"/><span>{drawer ? 'Close options' : 'Options'}</span><ChevronDown size={16}/></button>\n {drawer && <div className=\"drawer-backdrop\" onClick={() => setDrawer(false)}/>}\n <aside className={`bottom-drawer ${drawer ? 'is-open' : ''}`} aria-hidden={!drawer}>\n <div className=\"drawer-top\"><div><div className=\"ps-eyebrow\">MAKE IT YOURS</div><h2>Reading options</h2></div><button className=\"icon-button\" aria-label=\"Close options\" onClick={() => setDrawer(false)}><X size={20}/></button></div>\n <div className=\"drawer-grid\">\n\n <div className=\"drawer-panel\"><h3><Settings2 size={17}/> Reading</h3><div className=\"font-choice\"><span>Notation font</span><div className=\"font-toggle\" role=\"group\" aria-label=\"Notation font\"><button className={prefs.notationFont === 'Bravura' ? 'is-selected' : ''} aria-pressed={prefs.notationFont === 'Bravura'} onClick={() => update({ notationFont: 'Bravura' })}>Bravura</button><button className={prefs.notationFont === 'Petaluma' ? 'is-selected' : ''} aria-pressed={prefs.notationFont === 'Petaluma'} onClick={() => update({ notationFont: 'Petaluma' })}>Petaluma</button></div></div><div className=\"font-choice\"><span>Stave text font</span><div className=\"font-toggle\" role=\"group\" aria-label=\"Stave text font\">{(['Sans', 'Serif', 'Mono'] as const).map(font => <button key={font} className={prefs.annotationFont === font ? 'is-selected' : ''} aria-pressed={prefs.annotationFont === font} onClick={() => update({ annotationFont: font })}>{font}</button>)}</div></div><label className=\"field-label\" htmlFor={overhangId}>Overhang <span>{prefs.overlap === 0 ? 'Off' : `${prefs.overlap} ${prefs.mode === 'portrait' ? (prefs.overlap === 1 ? 'system' : 'systems') : (prefs.overlap === 1 ? 'bar' : 'bars')}`}</span></label><input id={overhangId} className=\"ps-range\" type=\"range\" min=\"0\" max=\"3\" step=\"1\" value={prefs.overlap} onChange={e => update({ overlap: Number(e.target.value) })}/><div className=\"ps-switch-row\"><span>Note names</span><button className={`ps-switch ${prefs.names ? 'is-on' : ''}`} role=\"switch\" aria-label=\"Note names\" aria-checked={prefs.names} onClick={() => update({ names: !prefs.names })}/></div><div className=\"ps-switch-row\"><span>Chord symbols</span><button className={`ps-switch ${prefs.chordSymbols ? 'is-on' : ''}`} role=\"switch\" aria-label=\"Chord symbols\" aria-checked={prefs.chordSymbols} onClick={() => update({ chordSymbols: !prefs.chordSymbols })}/></div><label className=\"ps-switch-row inference-row\"><span>Infer chord symbols</span><input type=\"checkbox\" checked={prefs.inferChordSymbols} onChange={e => update({ inferChordSymbols: e.target.checked })}/></label><div className=\"ps-switch-row\"><span>Beat counts</span><button className={`ps-switch ${prefs.counts ? 'is-on' : ''}`} role=\"switch\" aria-label=\"Beat counts\" aria-checked={prefs.counts} onClick={() => update({ counts: !prefs.counts })}/></div><div className=\"ps-switch-row\"><span>Count subdivisions</span><button className={`ps-switch ${prefs.subdivisions ? 'is-on' : ''}`} role=\"switch\" aria-label=\"Count subdivisions\" aria-checked={prefs.subdivisions} onClick={() => update({ subdivisions: !prefs.subdivisions, counts: true })}/></div>{score.parts.length > 4 && <button className=\"text-action reset-staves\" onClick={resetStaves}><RotateCcw size={15}/> Reset score staves</button>}</div>\n <div className=\"drawer-panel abc-panel\"><h3><FileMusic size={17}/> ABC notation</h3><p>Paste ABC text here, or use the open button in the header for files and folders.</p><textarea value={abcDraft} onChange={e => setAbcDraft(e.target.value)} spellCheck={false} aria-label=\"ABC notation\"/><button className=\"primary-action\" onClick={() => void readAbc(abcDraft)}>View notation <ChevronRight size={17}/></button><button className=\"text-action\" onClick={loadSample}><FileMusic size={16}/> Open sample score</button>{lastFileInfo && <button className=\"text-action forget-last-file\" title={LAST_FILE_PRIVACY} onClick={forgetLast}><Trash2 size={15}/> Forget last opened file</button>}</div>\n <div className=\"drawer-panel pitch-panel\"><h3><Settings2 size={17}/> Pitch</h3><div className=\"pitch-options\"><div><span className=\"pitch-label\">Transpose score</span><div className=\"semitone-control\"><button aria-label=\"Transpose down a semitone\" disabled={prefs.semitones <= -12} onClick={() => transposeBy(-1)}><Minus size={16}/></button><output aria-live={drawer ? 'polite' : 'off'}>{prefs.semitones > 0 ? '+' : ''}{prefs.semitones} semitones</output><button aria-label=\"Transpose up a semitone\" disabled={prefs.semitones >= 12} onClick={() => transposeBy(1)}><Plus size={16}/></button><button className=\"pitch-reset\" aria-label=\"Reset transposition\" title=\"Reset transposition\" disabled={prefs.semitones === 0 && !prefs.keyFlip} onClick={() => changePitch({ semitones: 0, keyFlip: false })}><RotateCcw size={15}/></button></div></div><div className=\"pitch-key\"><span className=\"pitch-label\">Key</span><div className=\"pitch-key-control\"><output className=\"pitch-key-readout\" aria-live={drawer ? 'polite' : 'off'}>{readout.text}</output><button className={`pitch-key-flip ${flipTo ? '' : 'is-disabled'}`} aria-label={flipLabel} title={flipLabel} aria-disabled={!flipTo} onClick={flipKey}><span className=\"pitch-key-flip-icon\" aria-hidden=\"true\">⇄</span><span className=\"pitch-key-flip-label\">{flipText}</span></button></div></div>{!concertBasis && <div><span className=\"pitch-label\">Score view</span><div className=\"font-toggle pitch-view\" role=\"group\" aria-label=\"Score pitch view\"><button className={prefs.scorePitch === 'written' ? 'is-selected' : ''} aria-pressed={prefs.scorePitch === 'written'} onClick={() => changePitch({ scorePitch: 'written' })}>Transposing</button><button className={prefs.scorePitch === 'concert' ? 'is-selected' : ''} aria-pressed={prefs.scorePitch === 'concert'} onClick={() => changePitch({ scorePitch: 'concert' })}>Concert</button></div></div>}</div><p className=\"pitch-hint\">{concertBasis ? 'This score is written at concert pitch, so it is shown at concert pitch. Playback stays at concert pitch.' : hasTransposingParts ? 'Transposing shows written parts; Concert shows sounding pitches. Playback stays at concert pitch.' : 'This score has no instrument transposition data, so both views match.'}</p></div>\n </div>\n {error && <div className=\"ps-error\" role=\"alert\"><span className=\"ps-error-text\">{error}</span>{oomButton}</div>}\n <div className=\"drawer-foot\">SPACE / PAGE DOWN · next view PAGE UP · previous view <span>FluidR3 GM · CC BY 3.0; TimGM drums · GPL-2</span></div>\n </aside>\n </>}\n {!drawer && (notice || largeNotice || reopenOffer) && <div className=\"reader-notices\">\n {largeNotice && <div className=\"large-file-notice\" role=\"status\"><Hourglass className=\"large-file-notice-icon\" size={16}/><span className=\"large-file-notice-text\">{largeNotice}</span><button className=\"large-file-notice-dismiss\" onClick={() => setLargeNotice('')} aria-label=\"Dismiss large score notice\"><X size={16}/></button></div>}\n {chrome.openFile && reopenOffer && <div className=\"reopen-banner\" role=\"status\" aria-label=\"Reopen last file\">\n <History className=\"reopen-banner-icon\" size={16}/>\n <span className=\"reopen-banner-body\"><span className=\"reopen-banner-text\">Reopen <strong className=\"reopen-banner-name\">{reopenOffer.name}</strong>?</span><span className=\"reopen-banner-privacy\" title={LAST_FILE_PRIVACY}>Kept only on this device.</span></span>\n <span className=\"reopen-banner-actions\">\n <button className=\"reopen-banner-reopen\" onClick={() => void reopenLastFile()} aria-label={`Reopen ${reopenOffer.name}`}>Reopen</button>\n <button className=\"reopen-banner-later\" onClick={dismissReopen}>Not now</button>\n <button className=\"reopen-banner-forget\" onClick={forgetLast} aria-label={`Forget ${reopenOffer.name}`} title=\"Delete the copy kept on this device\">Forget</button>\n </span>\n </div>}\n {notice && <div className=\"playback-notice\" role=\"status\"><VolumeX className=\"playback-notice-icon\" size={16}/><span className=\"playback-notice-text\">{notice}</span><button className=\"playback-notice-dismiss\" onClick={() => setNotice('')} aria-label=\"Dismiss playback notice\"><X size={16}/></button></div>}\n </div>}\n {error && !drawer && <div className={`ps-toast ${oomButton ? 'is-out-of-memory' : ''}`} role=\"alert\"><span className=\"ps-toast-text\">{error}</span>{oomButton}<button className=\"ps-toast-dismiss\" onClick={() => setError('')} aria-label=\"Dismiss\"><X size={16}/></button></div>}\n </main>\n </div>;\n}\n","import './styles.css';\nimport PepperScore from './components/PepperScore';\nimport type { PepperScoreProps } from './components/PepperScore';\n\nexport { PepperScore };\nexport default PepperScore;\nexport type { PepperScoreProps, PepperScoreHandle, PepperScoreReadyInfo } from './components/PepperScore';\nexport type { ChromePreset, PepperScoreControls } from './lib/chrome';\nexport type { PepperScoreSettings } from './lib/prefs';\nexport type { SoundSource } from './lib/sounds';\nexport type { SoundPackName } from './lib/assets';\nexport { SOUNDS_VERSION, defaultAssetBaseUrl } from './lib/assets';\n/** @deprecated Use PepperScore. Kept for one release. */\nexport const Reader = PepperScore;\n/** @deprecated Use PepperScoreProps. Kept for one release. */\nexport type ReaderProps = PepperScoreProps;\n"],"mappings":";;;;;;AAAA,IAAAgC,KAAe,4lSCAfC,KAAe,g0TCAfC,KAAe,ijYCAfC,KAAe,2zUCAfC,KAAe,uyOCAfC,KAAe,wvNCAfC,KAAe,o1eCAfC,KAAe,6kOCAfC,KAAe,mhlBCAfC,KAAe,k2KCAfC,KAAe,0kWCAfC,KAAe,kjSCAfC,KAAe,mlHCAfC,IAAe,wqRCAfC,KAAe,s7VCAfC,KAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["__import_glob__0_0_","__import_glob__0_1_","__import_glob__0_2_","__import_glob__0_3_","__import_glob__0_4_","__import_glob__0_5_","__import_glob__0_6_","__import_glob__0_7_","__import_glob__0_8_","__import_glob__0_9_","__import_glob__0_10_","__import_glob__0_11_","__import_glob__0_12_","__import_glob__0_13_","__import_glob__0_14_","__import_glob__0_15_","manifest","children","empty","clamp","MB","LETTERS","NATURAL_PC","mod","parseXml","normalized","import.meta.ROLLDOWN_FILE_URL__qW_jskMFMLPjEZ3z72c7Q","import.meta.ROLLDOWN_FILE_URL_0pc1L3x1BPCEbbDBS1Y0dg","settle","done","_Fragment","_Fragment","alto_saxophone_default","bari_saxophone_default","bassguitar_default","cello_default","clarinet_default","double_bass_default","drum_kit_default","flute_default","guitar_default","microphone_default","piano_default","tenor_saxophone_default","trombone_default","trumpet_default","viola_default","violin_default","gm_soundfont_manifest_default","\"piano\"","\"guitar\"","\"bassguitar\"","\"flute\"","\"clarinet\"","\"trumpet\"","\"trombone\"","\"violin\"","\"viola\"","\"cello\"","\"microphone\"","\"program\"","\"soundfont\"","\"icon\"","\"localPack\"","\"family\"","\"id\"","\"label\"","iconUrls","GM_FAMILIES","iconFor","id","GM_SOUNDS","entry","gmSoundfontLabel","INSTRUMENTS","voice","instrumentForProgram","program","gmProgramForSoundfont","name","isGmSoundfont","word","instrumentDetails","item","ucfirst","semitones","pitch","s","step","octave","alter","midiPitch","names","altered","pc","midi","instrumentForName","n","exampleScore","notes","index","beat","chord","gcd","a","b","fraction","d","g","fromNumber","value","sign","x","h0","h1","k0","k1","i","h2","k2","maxDenominator","rest","parseFraction","text","rational","decimal","scale","addFraction","compareFraction","fractionValue","formatFraction","ZERO","XmlError","detail","offset","PREDEFINED","ILLEGAL_CHARS","isWhite","c","isNameStart","isNameChar","localNameOf","colon","validCodePoint","code","scanXml","bodyStart","entities","stack","root","rootClosed","sawDoctype","fail","at","decode","out","from","amp","raw","semi","ref","hex","digits","ch","normalizeLines","attributeValue","literal","readName","start","skipWhite","expect","quoted","quote","close","characterData","end","lines","doctype","handler","comment","processingInstruction","target","lt","next","open","attributes","selfClosing","white","attributeStart","attributeName","valueAt","other","XmlElement","parentElement","attribute","last","walk","element","XmlTreeBuilder","capture","parseXmlTree","builder","endingNumbers","result","range","token","number","navigationWord","words","isEmptyNavigation","nav","attachNavigation","part","score","navigation","measure","resolveCodaSigns","jump","likeChildren","el","likeFirst","musicXmlNavigationReader","SOUND","ending","divisions","cursor","barlines","duration","repeat","barline","times","diagnostics","directions","sounds","direction","explicit","sound","codaGlyph","types","type","segnoGlyph","hasCodaGlyph","musicXmlNavigation","measureCount","sourceMeasures","read","musicXmlTextNavigation","xml","meiNavigation","measures","FUNC","left","right","ancestor","numbers","marks","mark","inside","abcDecorationWord","decoration","FAMILIES","inventoryFromCounts","featureCounts","family","tags","total","tag","rootLocalName","count","countElements","local","children$1","node","child","empty$1","durationBeats","dur","dots","normalizedScore","p","m","playbackCollector","markDiagnostics","partPedals","current","visitNote","note","notations","silent","art","durationScale","velocityDelta","fermata","meaningful","state","damper","down","pedals","pedal","changes","pedalDiagnostics","readPlaybackMarks","collector","timewise","measureIndex","timewiseParts","parent","kind","done","error","timewiseMarks","parts","drum","position","head","GM_DRUM_NOTATION","DRUM_FALLBACK","drumNotation","staffLoc","encoder","decoder","xmlId","staffDefXmlId","partId","escape","sourceFeatureInventory","format","textOf","source","makeSourceDocument","bytes","args","original","engraving","inventory","document","IdentityBuilder","match","identity","sourceIds","durationPieces","values","beats","v","base","percussionPosition","notation","meiPitch","continuation","pieceIndex","accidental","tie","percussion","placement","meiEvent","lyric","layerXml","tokens","tupletKey","beamEndPending","closeTop","top","closeTuplet","closeBeam","rests","length","piece","segment","segments","gap","tuplet","written","inTuplet","key","pieces","scoreToMei","meter","staffDefs","jumpTarget","staves","incoming","sourceMeasure","nominal","absolute","measureStart","overlapStart","overlapEnd","layers","ends","preferred","layer","staffIndex","harmonies","tempo","reference","lastBeat","tstamp","startsRepeat","bars","sectionXml","endings","j","withEngravingDocument","engravingText","identityForScore","STAVE_SCALE_MIN","STAVE_SCALE_STEP","clampStaveScale","min","STAVE_SCALE_FLOOR","deviceClass","ENDLESS_STAVE_SCALE","minimumDefaultStaveScale","device","BARS_FIT_MAX_STAVE_SCALE","clampBarsPerLine","defaults","sanitizeSavedPrefs","_legacyZoom","saved","clamp$1","low","high","settingsToPrefs","settings","viewToMode","view","clampBpm","bpm","legacyStorageKey","prefix","hash","instruments","legacyInstruments","roundConstants","rotate","shift","Sha256","take","tail","y","sigma0","sigma1","e","f","h","sum1","choose","t1","t2","sha256Hex","fileSourceFor","textSource","validZoom","zoom","validSettingsAndParts","parseLegacyFileState","sha256","migrateFileState","legacy","parseFileState","buildFileState","hidden","hiddenIds","volumes","keyFlip","MB$1","MAX_SCORE_FILE_BYTES","MXL_MAX_SCORE_BYTES","formatMb","extractMxlScore","entries","listing","unzipSync","file","container","path","declared","strFromU8","files","LETTERS$1","NATURAL_PC$1","SHARP_ORDER","FLAT_ORDER","MAJOR_BY_FIFTHS","MINOR_BY_FIFTHS","DEFAULT_MAJOR_FIFTHS","SHARP_MAJOR_FIFTHS","mod$1","accidentalText","alterOf","char","accidentals","signatureAlter","fifths","keyFromFifths","tonic","mode","enharmonicFlip","chooseKey","majorPc","pitchClass","options","transposeInterval","delta","to","up","steps","size","simple","perfect","difference","quality","withOctave","spelled","spells","letterIndex","letterStep","distance","neighbour","spellPitch","context","diatonic","allowed","degree","letter","raised","flatSpelling","prev","sides","sharp","flat","spellChordSymbol","symbol","unicode","suffix","INSTRUMENT_SPELLING","INSTRUMENT_FAMILY","spellingProfileFor","LETTERS","NATURAL_PC","mod","parseInterval","intervalFifths","chromatic","transposeSpelled","interval","midiOf","foldFifths","viewKey","flip","staff","respellLine","single","NAME","alterOfText","sum","moveChordSymbol","move","moved","intervals","sourceTransposition","soundingMidi","viewInterval","transposition","movedByView","viewProfile","sameMidi","scoreForView","viewMoved","referencePlan","global","pitchView","measureKeys","order","line","tiedFrom","back","previous","pitchIndex","noteIndex","spellingSpecFor","staffOf","keys","measureKey","first","transposeReadout","spokenKey","musicXmlPlaybackMarks","ROADMAP_MAX_SEGMENTS","ROADMAP_MAX_REPLAY","measureLengths","max","edgeRepeats","edges","lengths","bar","units","cuts","cut","edge","inner","atStart","atEnd","points","unit","lastEndings","list","k","traverse","visits","trailingPass","jumped","codaJumped","repeatStack","lastRepeatEnd","spentImplicit","limit","segno","finalEnding","pass","taken","endingSkipped","after","pos","roadmapFromNavigation","visit","buildRoadmap","generatedSegments","roadmap","resolveRoadmap","message","version","starts","label","resolved","performed","EPS","FERMATA_HOLD","GRACE_BEATS","GRACE_TOTAL","dynamics","scoreOffsets","here","slices","occurrences","sameBar","nextBar","occurrence","tempoPoints","byBeat","offsets","old","tempoAt","point","directionVelocity","sourcePartId","dynamicPoints","groups","velocity","velocityFor","valueBeat","valueOwn","openWedges","completed","targetBeat","own","staffId","wedge","span","progress","documentXml","GRACE_FLOOR_SECONDS","buildBaseTimeline","partDiagnostics","full","exactLengths","initialBpm","unitsPerBeat","markFor","dynamicGroups","built","override","performedSlices","performedPedals","eventSource","events","positions","openTies","graceFloor","elapsed","slice","horizon","boundaries","baseAt","limited","secondsPerBeat","inSlice","fermataStarts","holdMap","seconds","holds","heldBefore","hold","inclusive","secondsAt","release","carried","positionBeats","sourceId","change","graceGroups","graceBeat","dynamicList","pedalSource","group","principal","opening","pitchMark","soundingEnd","tieKey","event","eventSources","applySustainPedal","timelineEnd","pieceEnd","deriveTimeline","visible","playbackScale","timeline","transposable","scaledEvent","playbackDuration","playbackPositionAt","positionAtSeconds","playbackEventsFrom","shifts","scaled","playbackMidis","partIds","registered","registerBaseTimeline","baseTimelineFor","known","resolve","spans","downAt","byKey","clamped","ratio","scoreBeat","active","latest","activeNoteIds","children","parseXml$1","doc","empty","parseMei","everything","all","defs","def","parseKey","sig","defKey","defMode","defMeter","meterNow","defaultKey","staffKeys","defaultMode","staffModes","measureState","openingMeter","openingKey","beatType","alteredByKey","accidValues","innerBarlines","clef","staffKey","bySourceId","layerIndex","eventIndex","form","actual","normal","beam","grace","noteEls","pitches","accidChild","gestural","shown","pitchKey","prior","parsed","harmony","targetStaff","stamp","targetStart","titles","title","subtitle","composer","openingDef","parseAbc","abcjs","tune","keyAccidentals","firstStaff","map","voiceIndex","pendingStart","openEnding","lastFilled","barlineCodas","pendingBarlineCoda","navigationWords","applyWord","leading","accidentalMap","triplet","tupletInfo","fromKey","chordSymbol","syllable","content","wasToCoda","pair","before","parseMidi","toneMidi","Midi","buffer","measureSize","ppq","t","track","ti","remaining","tieStop","tieStart","sounding","inForce","parsing","cancelImports","channel","runImport","worker","resolveHash","resolveResult","rejectHash","rejectResult","reject","stop","data","request","sizeKnown","importScoreFile","job","readOnMainThread","handled","importMusicXmlText","rewrap","binary","qualities","pitchName","inferChordSymbol","classes","bass","lowest","pattern","rootPitch","VerovioError","isSuperseded","isOutOfMemory","isRestarted","restarted","MIN_CHUNK_STAFF_MEASURES","chunkBudget","forceChunks","recycleHeapBytes","setting","reduceChunkSize","stopWorker","simulatedOom","takeSimulatedOom","armed","nextId","pending","getWorker","heap","idle","importsInFlight","currentChunked","baselines","outOfMemory","reason","body","transfer","revisions","nextRevision","verovioRevision","revision","BASELINE_LIMIT","RECYCLE_BEFORE_IMPORT_BYTES","channels","nextChannel","channelState","closed","publishChannels","openVerovioChannel","closeVerovioChannel","inUse","releaseUnused","adopt","prepareVerovio","cached","info","send","attempt","settled","verovioBaseline","importing","ticket","nextRenderTicket","withBaseline","run","missing","probeVerovio","renderTicket","renderVerovioPages","PETALUMA_OPTIONS","musicFontOptions","font","SVG","latestGeneration","liveResults","ENDLESS_SINGLE_SYSTEM_LIMIT","ENDLESS_CHUNK","ENDLESS_CHUNK_STAFF_MEASURES","endlessChunkBars","LANE_GAP","LANE_ROW","EAGER_STAFF_MEASURES","NEAR_SCREENS","KEEP_SCREENS","PAGE_BATCH","portraitMinimumBarWidth","busiest","lyrics","syllables","lyricBarWidth","SYSTEM_OVERHEAD","portraitBarLimit","width","minimumBar","autoBarsPerLine","systemMinimumWidth","barFloor","BAR_FIT_SLACK","barFitZoom","need","fits","viewportWidth","gutterAt","mid","parseXml","box","graphics","rect","rootInverse","svg","transform","staffNumbers","engraved","byPart","claimed","claim","unmappedParts","unclaimed","beatLabel","subdivisions","annotation","className","mapped","findNote","byId","related","SVG_ELEMENTS","SAFE_URL","sanitizeSvg","naturalWidthOf","naturalHeightOf","wraps","yieldTask","renderScore","generation","isCurrent","superseded","document_","measureTotal","endlessSingle","layoutGutter","firstSystemGutter","explicitBars","barsPerLine","barsFit","visibleParts","hiddenStaves","visibleIndex","annotated","showCounts","nameRows","showNames","laneRows","laneHeight","spacingStaff","showChordSymbols","inferChordSymbols","spelling","verovioOptions","natural","pageWidth","layoutAt","usableUnits","restUnits","maxBars","fullLine","short","shortOfLine","least","most","probe","layout","restOptions","fetchPages","pages","fitCap","shrinkZoom","heightFit","availableHeight","naturalHeight","eager","fetched","scroller","countOf","candidate","pageOf","system","systemFor","initialSystems","wanted","focus","sample","zoomGuess","firstIndex","lastIndex","page","firstSvg","fitted","shrink","systemCount","systemOfMeasure","textFont","parseSvg","viewBox","focusSystem","stash","slots","block","firstMeasure","slot","attach","fragment","measureIndexById","pointsById","measuresByIndex","measureGeometry","inverse","boxOf","measureElements","bottom","ordered","controls","control","band","nextTop","svgMeasureByIndex","measureRects","laneBottom","partIndex","svgMeasure","labelled","row","firstGeometry","firstBands","lined","staffNatural","centers","pitchNatural","center","widthLimitFor","gutter","scaleFor","estimate","place","height","keepPlace","oldSize","minLeft","above","record","blockTop","geometry","drawn","geometries","disposed","listeners","notifyQueued","notify","listener","alive","near","pumping","draw","reprobe","kept","supersededDraws","stalled","retryTimer","load","promise","pump","pendingSlots","observers","observeTimer","margin","screens","nearObserver","keepObserver","released","OBSERVE_BATCH","observeFrom","firstSystem","geometryOf","firstCenters","observer","ICON_RATIO","FONT_RATIO","ICON_MIN","ICON_MAX","FONT_MIN","FONT_MAX","EYE_MIN","EYE_MAX","PAD","GAP","NAME_EMS","clamp","partControlMetrics","stavePx","room","staffPitchPx","icon","eyeSize","buttons","fixed","maxGutter","HEADER_CONTROLS","HEADER_CONTROL_GROUP","resolveChrome","on","preset","transport","viewToggle","openFile","mixer","drawer","SCORE_STORE","settle$1","done$1","transaction","createScoreDb","dbName","maxRecords","debounceMs","fallbackPrefix","fallbackKey","pendingKey","legacyKey","storage","factory","db","readLocal","readLegacy","writeLocal","store","records","localKeys","hashes","readPending","dropPending","withPending","stored","queue","writeDb","excess","timer","flushing","flushNow","batch","flush","queued","updatedAt","sampleSource","LAST_FILE_STORE","INFO_KEY","BYTES_KEY","settle","isInfo","infoOf","isSameFile","lastFileToFile","disabled","createLastFileStore","stores","none","readerStorage","ns","prefsKey","dismissedKey","prefs","shared","getSharedAudio","master","RESUME_TIMEOUT_MS","resumeAudio","owner","claimPlayback","releasePlayback","who","MB","LARGE_FILE_BYTES","LARGE_SCORE_STAFF_MEASURES","LARGE_FILE_BYTES_OVERRIDE_KEY","DESKTOP_SECONDS_PER_MB","OPEN_BASE_SECONDS","PHONE_SLOWDOWN","BYTES_PER_STAFF_MEASURE","largeFileBytes","isLargeFile","staffMeasures","isLargeScore","estimateOpenSeconds","mb","factor","phone","roundedLow","largeScoreMessage","cells","TXT_SNIFF_BYTES","EXTENSION_FORMATS","scoreFormatOf","looksLikeAbc","entryFile","readBatch","reader","trimPath","keepTxt","Collector","fromFolder","inFolder","depth","collectDroppedScoreFiles","systemPages","systems","viewHeight","topOf","pad","tallOverlap","overlap","pageStarts","turnTarget","epsilon","pageOfSystem","MEDIA_EXTENSIONS","remoteFileName","url","contentType","extension","fetchScoreFile","link","response","signal","tooLarge","blob","FORMATS","TIP","NOT_ABC","hasFiles","FOCUSABLE","OpenScoreDialog","headingId","useId","tipId","panelRef","useRef","textRef","dragDepth","abc","setAbc","useState","dragging","setDragging","scanning","setScanning","setMessage","choices","setChoices","truncated","setTruncated","useEffect","opener","onClose","focusable","onOpenFile","candidates","unsupported","folder","scan","work","submitAbc","onOpenAbc","dragProps","messageIsHint","FolderOpen","X","ChevronLeft","choice","FileMusic","Fragment","Upload","onBrowse","SOUNDS_VERSION","defaultAssetBaseUrl","pack","pageBase","resolveAssetBase","assetUrl","packInfo","loadPackInfo","json","warnedBases","warnAssetBase","what","BUILTIN_FLUIDR3","BUILTIN_DRUMS","BUILTIN_SF2","claims","fallbackSf2Url","planSound","sources","fluidr3","planKey","plan","loadPlayers","loadFluidPlayer","loadSf2Player","loadNoteFilePlayer","addDrumFallback","kit","players","player","drums","fallbackSf2","MUSIC_FONTS","ensureMusicFonts","style","onError","families","failed","face","keyName","clampSemitones","sampleScore","textFonts","sampleAbc","playbackSound","soundRequest","audioKey","SILENT_PLAYBACK_NOTICE","maxControlGutter","STAVE_SCALE_COMMIT_MS","SCORE_RECORD_TIMEOUT_MS","readScoreRecord","scoreDb","FOLLOW_SUSPEND_MS","SCROLL_SETTLE_MS","OOM_GUIDANCE","RENDERER_RESTARTED","RESTART_REDRAWS","SUPERSEDED_REDRAW_MS","SUPERSEDED_REDRAWS","LAST_FILE_PRIVACY","scrollBehavior","flag","PepperScore","chrome","useMemo","persist","settingsKey","hostPrefs","hostPrefsRef","callbacks","storageRef","setScore","scoreRevision","setScoreRevision","setPrefs","setSource","setHiddenIds","trackVolumes","setTrackVolumes","setDrawer","setMixer","openDialog","setOpenDialog","pickerPartId","setPickerPartId","pickerFamily","setPickerFamily","pickerPage","setPickerPage","abcDraft","setAbcDraft","setError","notice","setNotice","largeNotice","setLargeNotice","largeNoticeArmedRef","oomRetry","setOomRetry","lastFileRef","lastFileInfo","setLastFileInfo","reopenOffer","setReopenOffer","playing","setPlaying","loadingAudio","setLoadingAudio","loadingFont","setLoadingFont","painted","setPainted","painting","setPainting","resizeTick","setResizeTick","layoutTick","setLayoutTick","setActive","activeNotes","setActiveNotes","setPosition","ready","setReady","loaded","setLoaded","staffCenters","setStaffCenters","controlMetrics","setControlMetrics","zoomDraft","setZoomDraft","zoomCommitRef","renderedZoom","setRenderedZoom","renderedZoomRef","prefsZoomRef","staveScaleMinRef","savedViewRef","quietRenderRef","zoomAnchorRef","previewOriginRef","sliderPointerRef","pendingZoomRef","staveScaleChangeRef","staveScaleInputRef","moreOpen","setMoreOpen","moreRef","rootRef","uid","panelId","overhangId","scoreWidth","setScoreWidth","fileRef","viewportRef","canvasRef","renderRef","audioRef","playRef","scheduledStopsRef","playRunRef","importRunRef","renderRunRef","swipeRef","pinchRef","contentRef","hasPaintedRef","modeRef","overlapRef","pagesRef","pageTailRef","scrollTargetRef","userScrollAtRef","assetBase","assetBaseUrl","soundPack","channelRef","restartRedrawsRef","supersededRedrawsRef","readyRevisionRef","hiddenSet","visibleScore","audio","gain","concertBasis","scorePitch","displayScore","readout","hasTransposingParts","timelineRef","timelineKey","visibleKey","timelineOf","useCallback","loadTimeline","hasSource","musicXml","scoreUrl","offerCancelled","cancelled","src","loadScore","_zoom","persistPending","update","patch","stopRef","playbackOwner","reset","changePitch","transposeBy","restored","nextSource","host","hostResets","readMusicXml","startOpening","prepareEngraving","showError","retry","fallback","readFile","largeBytes","nextScore","readUrl","readAbc","changed","retryOutOfMemory","reopenLastFile","dismissReopen","forgetLast","loadSample","togglePart","focusedId","focusPart","resetStaves","viewportCentre","viewport","previewStaveScale","centre","draft","clearStaveScalePreview","captureZoomAnchor","best","clamp01","restoreZoomAnchor","anchor","share","dx","dy","commitStaveScale","draftStaveScale","input","releaseStaveScale","onStaveScaleChange","staveScaleInput","outside","autoFocus","focusOnMount","overlaysRef","overlays","was","refreshPagesRef","canvas","frame","quiet","metricsFor","metrics","metaHeight","requested","refreshPages","delay","systemSpans","blocks","origin","lastStart","scrollViewport","pendingScroll","turn","manual","scrollbar","landed","onRootKeyDown","measureCursor","measureCursorKey","pendingSystem","ensureAudio","sharedAudio","plans","soundSources","builtinFailed","matching","destination","builtin","used","play","now","secondsStart","started","nextEvent","schedule","time","tick","wasPlayingRef","busyRef","latestPlayRef","changePitchRef","useImperativeHandle","openInstrumentPicker","currentSound","selected","changeInstrument","pickerPart","familySounds","pickerPages","pickerSounds","hasScoreText","barsLimit","barsDisabled","barsSetting","oomButton","staveScale","staveScaleMin","staveScalePercent","flipTo","flipLabel","flipText","flipKey","transposeTitle","headerElements","Square","jsx","Pause","Play","Minus","Plus","SlidersHorizontal","renderControls","tier","primaryControls","secondaryControls","heightMode","compactLabel","compactPlay","ariaLabel","Ellipsis","EyeOff","Eye","ChevronDown","ChevronRight","nextZoom","Focus","Settings2","RotateCcw","Trash2","Hourglass","History","VolumeX","src_default","Reader"],"sources":["../src/icons/alto-saxophone.svg?url","../src/icons/bari-saxophone.svg?url","../src/icons/bassguitar.svg?url","../src/icons/cello.svg?url","../src/icons/clarinet.svg?url","../src/icons/double-bass.svg?url","../src/icons/drum-kit.svg?url","../src/icons/flute.svg?url","../src/icons/guitar.svg?url","../src/icons/microphone.svg?url","../src/icons/piano.svg?url","../src/icons/tenor-saxophone.svg?url","../src/icons/trombone.svg?url","../src/icons/trumpet.svg?url","../src/icons/viola.svg?url","../src/icons/violin.svg?url","../src/lib/gm-soundfont-manifest.json","../src/lib/score.ts","../src/lib/playback/fraction.ts","../src/lib/notation/xml-stream.ts","../src/lib/notation/navigation.ts","../src/lib/notation/musicxml-source.ts","../src/lib/notation/drum-map.ts","../src/lib/notation/document.ts","../src/lib/stave-scale.ts","../src/lib/prefs.ts","../src/lib/file-state.ts","../src/lib/mxl.ts","../src/lib/spelling.ts","../src/lib/notation/respell.ts","../src/lib/transpose.ts","../src/lib/playback/source-marks.ts","../src/lib/playback/roadmap.ts","../src/lib/playback/timeline.ts","../src/lib/import.ts","../src/lib/chords.ts","../src/lib/verovio-runtime.ts","../src/lib/music-fonts.ts","../src/lib/render.ts","../src/lib/part-controls.ts","../src/lib/header-controls.ts","../src/lib/chrome.ts","../src/lib/score-db.ts","../src/lib/last-file.ts","../src/lib/storage.ts","../src/lib/audio-engine.ts","../src/lib/large-file.ts","../src/lib/score-files.ts","../src/lib/paging.ts","../src/lib/remote-score.ts","../src/components/OpenScoreDialog.tsx","../src/lib/assets.ts","../src/lib/sounds.ts","../src/lib/sound-players.ts","../src/lib/asset-fonts.ts","../src/components/PepperScore.tsx","../src/index.ts"],"sourcesContent":["export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M1315%204506%20c-147%20-36%20-155%20-40%20-155%20-66%200%20-23%2042%20-46%20207%20-114%20132%20-54%20251%20-88%20296%20-85%2039%203%20130%20-27%20298%20-97%20210%20-88%20274%20-133%20315%20-219%2029%20-61%2030%20-86%204%20-110%20-29%20-26%20-26%20-63%206%20-75%2037%20-15%2030%20-54%20-11%20-58%20-65%20-8%20-66%20-20%20-31%20-341%2021%20-196%2025%20-216%2046%20-233%2012%20-10%2035%20-18%2050%20-18%2027%200%2029%20-3%2034%20-52%2011%20-92%2065%20-659%2074%20-761%20l8%20-98%20-35%20-15%20c-45%20-19%20-51%20-29%20-51%20-84%200%20-76%2032%20-354%2042%20-367%206%20-7%2028%20-13%2049%20-13%2047%200%2042%2016%2064%20-235%208%20-104%2018%20-208%2021%20-230%20l6%20-40%20-51%20-22%20c-47%20-20%20-51%20-24%20-51%20-55%200%20-53%2066%20-319%2081%20-329%208%20-5%2043%20-9%2079%20-9%20l65%20-1%2036%20-48%20c43%20-56%20126%20-114%20207%20-143%2075%20-28%20274%20-31%20371%20-5%20181%2048%20308%20182%20357%20377%2015%2059%2015%2087%203%20310%20-19%20330%20-17%20589%205%20709%2022%20125%2068%20234%20122%20287%2042%2042%2042%2042%20101%2037%2055%20-5%2062%20-3%2077%2018%2025%2036%2020%2082%20-11%20113%20-32%2033%20-574%20370%20-681%20425%20-55%2028%20-93%2027%20-122%20-4%20-34%20-36%20-31%20-78%209%20-119%20l32%20-33%20-35%20-106%20c-101%20-302%20-105%20-646%20-14%20-1295%2018%20-128%2019%20-156%208%20-176%20-7%20-14%20-10%20-34%20-7%20-45%204%20-17%200%20-21%20-19%20-21%20-14%200%20-38%207%20-54%2015%20-51%2026%20-62%20122%20-28%20235%2011%2038%2017%2044%2036%2042%2028%20-4%2028%20-1%20-3%20213%20-13%2093%20-49%20348%20-80%20565%20l-55%20395%20-30%2025%20c-17%2014%20-30%2033%20-30%2043%200%2027%20-30%2074%20-57%2088%20-36%2019%20-40%2068%20-9%20121%2014%2025%2026%2057%2026%2072%200%2035%20-23%2079%20-53%20103%20-39%2030%20-42%2059%20-13%2094%2046%2055%2025%20148%20-41%20183%20-27%2014%20-29%2018%20-67%20247%20-22%20129%20-47%20270%20-56%20313%20-17%2077%20-17%2081%201%20110%2029%2047%2026%20139%20-7%20204%20-60%20121%20-251%20236%20-486%20292%20-108%2026%20-128%2022%20-128%20-31%200%20-16%20-4%20-29%20-8%20-29%20-21%200%20-216%2071%20-283%20103%20-76%2036%20-199%2077%20-228%2076%20-9%200%20-75%20-15%20-146%20-33z%20m256%20-61%20c50%20-19%2094%20-37%2099%20-40%209%20-5%20-7%20-85%20-19%20-98%20-4%20-4%20-29%20-3%20-56%203%20-55%2012%20-315%20112%20-315%20121%200%204%20154%2043%20193%2048%204%201%2048%20-15%2098%20-34z%20m568%20-96%20c128%20-34%20277%20-113%20348%20-184%2062%20-62%2093%20-125%2079%20-161%20-5%20-13%20-13%20-5%20-32%2035%20-41%2082%20-113%20153%20-201%20199%20-43%2022%20-87%2042%20-98%2045%20-135%2038%20-195%2060%20-195%2073%200%2018%2010%2018%2099%20-7z%20m-271%20-23%20c59%20-19%20166%20-50%20237%20-71%20181%20-51%20255%20-86%20315%20-152%2069%20-75%20111%20-194%2078%20-220%20-21%20-16%20-125%20-52%20-132%20-46%20-3%204%20-6%2018%20-6%2032%20-1%2070%20-67%20165%20-159%20225%20-86%2057%20-307%20156%20-425%20190%20-41%2012%20-54%2031%20-42%2062%207%2019%2012%2019%20134%20-20z%20m666%20-515%20c6%20-9%2057%20-293%2082%20-456%20l13%20-90%20-29%20-23%20c-36%20-28%20-52%20-79%20-39%20-126%2011%20-39%2060%20-86%2090%20-86%2029%200%2023%20-33%20-9%20-51%20-90%20-51%20-66%20-189%2040%20-224%2046%20-16%2049%20-47%206%20-73%20-43%20-27%20-59%20-55%20-60%20-101%20-1%20-56%2027%20-100%2076%20-122%2041%20-18%2044%20-21%2050%20-71%204%20-29%2010%20-63%2013%20-75%204%20-19%201%20-23%20-17%20-23%20-12%200%20-37%20-15%20-56%20-34%20-28%20-28%20-34%20-42%20-34%20-75%200%20-80%2058%20-140%20121%20-127%2037%207%2041%20-19%205%20-28%20-37%20-9%20-84%20-53%20-91%20-85%20-7%20-34%2013%20-88%2043%20-114%2011%20-10%2039%20-21%2061%20-24%2030%20-4%2041%20-10%2041%20-23%200%20-10%20-10%20-20%20-23%20-24%20-32%20-8%20-74%20-51%20-80%20-82%20-13%20-72%2044%20-144%20114%20-144%2032%200%2039%20-4%2039%20-19%200%20-13%20-9%20-21%20-30%20-26%20-36%20-8%20-76%20-53%20-89%20-100%20-25%20-90%2060%20-196%20146%20-182%2033%206%2033%206%2033%20-36%201%20-95%2063%20-164%20158%20-175%2035%20-4%2052%20-12%2070%20-34%2048%20-57%20132%20-77%20201%20-48%2095%2039%20100%20214%208%20270%20-35%2022%20-115%2027%20-147%2010%20-24%20-13%20-28%20-5%20-36%2066%20l-7%2059%2023%20-20%20c17%20-16%2036%20-20%2089%20-20%2059%200%2073%204%20104%2028%2088%2067%2099%20188%2026%20272%20-52%2059%20-147%2069%20-233%2025%20-26%20-13%20-38%20-15%20-41%20-7%20-7%2022%20-10%20107%20-4%20107%204%200%2023%20-7%2042%20-15%2051%20-21%20135%20-19%20173%204%2064%2039%2094%20161%2058%20237%20-34%2071%20-115%20112%20-185%2094%20-20%20-6%20-53%20-21%20-73%20-35%20-20%20-14%20-40%20-25%20-43%20-25%20-11%200%206%20325%2022%20420%2012%2073%2066%20267%2080%20288%202%202%20522%20-304%20534%20-314%202%20-2%20-7%20-13%20-21%20-24%20-63%20-49%20-128%20-190%20-156%20-335%20-21%20-112%20-22%20-446%20-3%20-740%2011%20-174%2011%20-209%20-2%20-271%20-28%20-132%20-99%20-235%20-202%20-294%20-56%20-32%20-172%20-64%20-262%20-74%20-59%20-6%20-73%208%20-19%2018%2048%209%2082%2039%20101%2091%2026%2066%2014%20126%20-35%20179%20l-39%2041%20-76%200%20c-75%200%20-77%20-1%20-110%20-37%20-40%20-43%20-60%20-103%20-51%20-150%209%20-50%2042%20-97%2079%20-113%2025%20-11%2027%20-14%2011%20-15%20-37%200%20-148%2063%20-200%20114%20-97%2098%20-148%20215%20-164%20383%20-5%2059%20-17%20178%20-25%20263%20-28%20287%20-76%20803%20-95%201025%20-11%20121%20-27%20285%20-35%20365%20-8%2080%20-24%20242%20-35%20360%20-11%20118%20-29%20307%20-40%20419%20-10%20113%20-18%20206%20-17%20207%201%201%2025%209%2052%2018%2028%209%2057%2021%2065%2026%2019%2012%2037%2013%2044%201z%20m-209%20-263%20c3%20-40%2013%20-142%2022%20-227%2014%20-148%2011%20-191%20-14%20-159%20-5%207%20-18%20103%20-27%20213%20-10%20110%20-20%20210%20-23%20223%20-4%2017%20-1%2022%2015%2022%2018%200%2021%20-9%2027%20-72z%20m395%20-380%20c14%20-26%2014%20-29%20-12%20-54%20-20%20-21%20-32%20-25%20-52%20-20%20-65%2016%20-50%20111%2017%20104%2022%20-2%2036%20-11%2047%20-30z%20m28%20-250%20c17%20-17%2015%20-64%20-4%20-82%20-22%20-23%20-71%20-20%20-84%203%20-14%2026%20-13%2064%202%2079%207%207%2026%2012%2043%2012%2017%200%2036%20-5%2043%20-12z%20m650%20-210%20c396%20-242%20507%20-313%20510%20-330%202%20-12%20-3%20-18%20-13%20-18%20-19%200%20-618%20356%20-677%20402%20-40%2031%20-50%2058%20-22%2058%209%200%20100%20-51%20202%20-112z%20m-602%20-103%20c22%20-34%2012%20-69%20-26%20-85%20-60%20-25%20-107%2043%20-63%2092%2024%2027%2069%2023%2089%20-7z%20m84%20-186%20c5%20-35%2019%20-125%2030%20-199%2028%20-180%2055%20-377%2080%20-573%2012%20-89%2024%20-173%2027%20-186%20l6%20-25%20-33%2024%20-33%2023%207%20102%20c7%20102%207%20102%20-21%20135%20-30%2036%20-35%2086%20-18%20176%206%2036%203%2050%20-20%2093%20-26%2047%20-27%2055%20-21%20128%206%2070%205%2083%20-17%20123%20-13%2025%20-29%2082%20-36%20129%20-12%2084%20-12%2085%2011%20102%2012%2010%2024%2016%2026%2014%202%20-1%207%20-31%2012%20-66z%20m-82%20-205%20c24%20-17%2030%20-62%2010%20-82%20-7%20-7%20-24%20-12%20-38%20-12%20-33%200%20-50%2017%20-50%2051%200%2024%2030%2059%2050%2059%203%200%2016%20-7%2028%20-16z%20m-318%20-283%20c13%20-136%2013%20-164%202%20-169%20-7%20-2%20-17%20-1%20-21%204%20-7%207%20-31%20257%20-31%20319%200%2010%206%2015%2017%2013%2015%20-3%2020%20-27%2033%20-167z%20m358%2023%20c30%20-21%2029%20-59%20-3%20-80%20-23%20-15%20-27%20-15%20-50%200%20-32%2021%20-33%2059%20-3%2080%2012%209%2025%2016%2028%2016%203%200%2016%20-7%2028%20-16z%20m518%20-28%20c28%20-28%2034%20-42%2034%20-76%200%20-74%20-43%20-120%20-111%20-120%20-67%200%20-119%2049%20-119%20113%200%2049%2013%2073%2053%2097%2051%2032%20103%2026%20143%20-14z%20m-465%20-245%20c20%20-16%2022%20-23%2014%20-47%20-14%20-39%20-57%20-54%20-85%20-29%20-26%2024%20-26%2060%202%2079%2029%2021%2041%2020%2069%20-3z%20m480%20-127%20c32%20-16%2059%20-66%2059%20-109%200%20-104%20-144%20-151%20-210%20-68%20-49%2062%20-33%20143%2034%20174%2050%2023%2078%2024%20117%203z%20m-417%20-155%20c32%20-38%2033%20-70%204%20-103%20-37%20-40%20-64%20-42%20-98%20-7%20-40%2039%20-41%2091%20-4%20120%2037%2029%2068%2026%2098%20-10z%20m415%20-283%20c12%20-13%2025%20-42%2028%20-63%205%20-35%202%20-42%20-27%20-66%20-37%20-32%20-73%20-34%20-116%20-8%20-29%2018%20-63%2075%20-51%2087%203%203%2023%20-6%2045%20-21%2066%20-44%20105%201%2040%2046%20-18%2012%20-35%2024%20-38%2026%20-10%209%2027%2023%2061%2023%2025%200%2042%20-7%2058%20-24z%20m-804%20-53%20c6%20-49%2032%20-138%2060%20-205%206%20-15%202%20-18%20-24%20-18%20-17%200%20-31%202%20-31%204%200%203%20-13%2062%20-29%20132%20-17%2070%20-28%20131%20-25%20136%203%204%2013%208%2023%208%2015%200%2020%20-11%2026%20-57z%20m561%20-204%20c23%20-24%2029%20-39%2029%20-74%200%20-57%20-27%20-85%20-87%20-92%20-56%20-7%20-81%206%20-103%2053%20-14%2031%20-15%2043%20-6%2075%2014%2048%2044%2069%2096%2069%2033%200%2047%20-6%2071%20-31z'/%3e%3cpath%20d='M2435%203470%20c-4%20-12%203%20-112%2015%20-223%2011%20-111%2030%20-285%2040%20-387%2011%20-102%2031%20-288%2045%20-415%2013%20-126%2027%20-272%2031%20-323%205%20-61%2012%20-99%2022%20-108%2029%20-30%2037%20-10%2035%2087%20-1%2088%20-10%20183%20-83%20869%20-16%20151%20-34%20324%20-40%20385%20-6%2060%20-16%20115%20-22%20122%20-16%2019%20-36%2016%20-43%20-7z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M1820%204529%20c-116%20-11%20-122%20-13%20-118%20-41%202%20-14%2043%20-49%20128%20-109%20102%20-71%20144%20-94%20225%20-122%2055%20-19%20120%20-37%20144%20-40%2059%20-7%20183%20-70%20216%20-109%2036%20-43%2031%20-76%20-32%20-215%20-74%20-161%20-87%20-206%20-87%20-298%201%20-100%2028%20-167%2091%20-225%20l44%20-41%20-172%20-342%20c-94%20-188%20-175%20-346%20-180%20-351%20-4%20-5%20-32%20-9%20-61%20-10%20l-53%20-1%20-82%20-165%20c-45%20-91%20-82%20-172%20-83%20-180%200%20-8%2014%20-27%2032%20-42%20l33%20-27%20-163%20-323%20-162%20-323%20-62%20-2%20c-35%20-1%20-67%20-8%20-74%20-15%20-14%20-16%20-112%20-264%20-120%20-307%20-8%20-38%204%20-53%2067%20-88%2047%20-27%2048%20-29%2054%20-83%2016%20-140%2070%20-253%20162%20-341%20117%20-111%20254%20-165%20418%20-163%20173%202%20291%2052%20415%20174%2083%2082%20141%20177%20287%20465%20120%20238%20259%20497%20346%20645%20166%20284%20329%20460%20499%20540%2080%2038%20129%2039%20161%204%2035%20-38%20106%20-45%20137%20-14%2042%2042%2031%2072%20-246%20637%20-153%20315%20-159%20322%20-226%20308%20-53%20-12%20-72%20-81%20-43%20-156%204%20-12%20-35%20-52%20-138%20-142%20-169%20-148%20-245%20-227%20-339%20-354%20-77%20-104%20-188%20-284%20-244%20-395%20-20%20-40%20-52%20-90%20-70%20-111%20-19%20-20%20-34%20-48%20-34%20-61%200%20-14%20-24%20-73%20-53%20-133%20-30%20-59%20-62%20-130%20-73%20-156%20-16%20-41%20-84%20-114%20-84%20-90%200%204%2040%2091%2089%20193%20148%20307%20221%20460%20263%20555%2022%2050%2066%20149%2099%20220%2033%2072%2059%20139%2059%20151%200%2011%20-11%2030%20-23%2042%20-15%2014%20-24%2035%20-25%2056%20-1%2018%20-6%2045%20-11%2059%20-14%2037%20-5%2054%2034%2067%2019%206%2048%2027%2065%2046%2024%2028%2030%2043%2030%2082%20l0%2048%2082%2012%20c140%2020%20241%2085%20316%20202%2035%2055%20221%20432%20268%20543%2036%2084%2046%20149%2034%20220%20-42%20261%20-354%20373%20-553%20197%20-47%20-40%20-87%20-109%20-217%20-370%20-57%20-113%20-105%20-207%20-107%20-209%20-2%20-3%20-10%202%20-18%2010%20-12%2012%20-12%2022%201%2069%2022%2079%2015%20222%20-14%20276%20-41%2080%20-105%20120%20-294%20185%20-51%2018%20-103%2040%20-115%2050%20-13%209%20-70%2038%20-128%2063%20-115%2050%20-120%2051%20-295%2035z%20m280%20-94%20c47%20-21%2089%20-41%2093%20-45%2011%20-10%20-30%20-100%20-45%20-100%20-24%201%20-131%2040%20-167%2061%20-20%2012%20-65%2042%20-101%2068%20l-65%2046%2060%206%20c96%2010%20135%204%20225%20-36z%20m1249%20-18%20c54%20-25%20101%20-71%20127%20-123%2014%20-29%2019%20-60%2019%20-124%20l0%20-85%20-102%20-215%20c-186%20-394%20-230%20-460%20-340%20-515%20-60%20-31%20-203%20-49%20-203%20-26%200%206%2012%2011%2026%2011%2070%200%20143%2079%20130%20141%20-3%2016%20-1%2029%204%2029%2023%200%2082%2067%20108%20123%20219%20465%20232%20495%20232%20534%200%2056%20-35%2093%20-88%2093%20-23%200%20-49%20-7%20-61%20-17%20-11%20-10%20-80%20-146%20-152%20-303%20-72%20-157%20-140%20-297%20-151%20-312%20-11%20-16%20-29%20-28%20-41%20-28%20-27%200%20-83%20-33%20-95%20-57%20-10%20-19%20-15%20-52%20-13%20-90%201%20-12%2012%20-35%2026%20-52%2036%20-42%2020%20-67%20-47%20-73%20-109%20-11%20-153%20-123%20-81%20-208%2013%20-16%2022%20-34%2018%20-40%20-3%20-5%20-29%20-10%20-57%20-10%20-44%200%20-54%20-4%20-84%20-34%20-30%20-30%20-34%20-41%20-34%20-84%200%20-37%207%20-59%2026%20-88%2025%20-36%2025%20-40%2011%20-64%20-13%20-20%20-26%20-26%20-72%20-31%20-64%20-7%20-98%20-32%20-116%20-87%20-15%20-44%202%20-105%2038%20-138%2026%20-24%2026%20-25%2011%20-58%20-15%20-31%20-21%20-34%20-73%20-38%20-68%20-6%20-105%20-31%20-124%20-84%20-19%20-53%20-8%20-105%2031%20-150%2027%20-30%2029%20-38%2020%20-59%20-10%20-22%20-16%20-24%20-59%20-19%20-118%2013%20-202%20-106%20-143%20-201%2011%20-18%2032%20-40%2045%20-49%2029%20-19%2031%20-33%2010%20-62%20-13%20-19%20-19%20-20%20-54%20-11%20-51%2014%20-122%20-12%20-152%20-55%20-48%20-67%20-30%20-167%2037%20-209%2019%20-11%2034%20-24%2034%20-28%200%20-5%20-20%20-51%20-44%20-102%20-57%20-121%20-86%20-250%20-65%20-294%2026%20-55%20114%20-96%20174%20-81%2070%2018%20143%20132%20245%20384%20l34%2082%2043%20-49%20c26%20-29%2058%20-54%2079%20-61%2072%20-24%20169%2011%20214%2077%2021%2030%2025%2048%2025%20107%200%2061%20-4%2077%20-28%20112%20-40%2060%20-96%2087%20-163%2082%20-30%20-3%20-54%20-3%20-54%20-1%200%202%2014%2034%2031%2071%2017%2037%2038%2082%2046%20101%20l15%2035%2026%20-50%20c34%20-63%2091%20-94%20172%20-94%2070%200%20118%2025%20147%2076%2047%2082%2038%20181%20-21%20240%20-36%2036%20-132%2070%20-172%2060%20-13%20-4%20-24%20-3%20-24%200%200%204%2023%2050%2051%20103%2094%20176%20224%20361%20342%20488%2062%2066%20300%20273%20314%20273%205%200%2026%20-40%2047%20-88%2022%20-48%2086%20-181%20143%20-295%2057%20-115%20103%20-211%20103%20-213%200%20-2%20-11%20-4%20-25%20-4%20-74%200%20-226%20-91%20-348%20-209%20-165%20-159%20-279%20-343%20-592%20-951%20-205%20-400%20-235%20-449%20-320%20-535%20-77%20-77%20-160%20-124%20-256%20-145%20-73%20-16%20-227%20-8%20-299%2016%20l-55%2018%2046%207%20c122%2019%20186%20108%20160%20223%20-33%20142%20-170%20190%20-295%20103%20-54%20-38%20-81%20-137%20-55%20-204%20l10%20-28%20-31%2030%20c-17%2017%20-48%2063%20-68%20103%20-33%2069%20-36%2081%20-40%20185%20-6%20173%204%20202%20195%20582%2091%20182%20201%20398%20244%20480%20149%20287%20431%20844%20760%201503%20182%20365%20345%20679%20362%20698%2077%2088%20205%20113%20316%2061z%20m-988%20-103%20c124%20-43%20155%20-58%20192%20-93%2040%20-36%2056%20-70%2063%20-133%209%20-75%20-8%20-142%20-66%20-268%20-75%20-161%20-89%20-247%20-51%20-318%209%20-18%208%20-29%20-9%20-61%20-11%20-22%20-24%20-42%20-29%20-45%20-14%20-9%20-77%2067%20-91%20109%20-22%2068%20-9%20178%2035%20275%20109%20245%20120%20283%2091%20339%20-8%2015%20-31%2040%20-50%2055%20-38%2029%20-173%2096%20-193%2096%20-19%200%20-23%2016%20-12%2049%206%2017%2012%2031%2014%2031%202%200%2050%20-16%20106%20-36z%20m922%20-135%20c6%20-10%20-10%20-54%20-54%20-149%20-34%20-74%20-88%20-195%20-120%20-269%20-56%20-128%20-97%20-191%20-125%20-191%20-28%200%20-22%2025%2037%20152%2034%2073%2095%20205%20135%20292%2041%2087%2079%20165%2085%20173%2014%2016%2029%2013%2042%20-8z%20m-644%20-393%20c10%20-11%201%20-37%20-41%20-123%20-40%20-81%20-54%20-102%20-56%20-84%20-5%2032%2012%2095%2043%20164%2028%2060%2035%2066%2054%2043z%20m283%20-263%20c26%20-23%2024%20-78%20-4%20-97%20-46%20-33%20-108%20-7%20-108%2045%200%2057%2070%2090%20112%2052z%20m-157%20-263%20c36%20-14%2049%20-53%2030%20-90%20-20%20-39%20-59%20-49%20-93%20-23%20-54%2040%20-35%20116%2030%20122%204%201%2018%20-3%2033%20-9z%20m633%20-3%20c6%20-7%2034%20-64%2062%20-127%2029%20-63%20115%20-242%20191%20-397%2076%20-155%20139%20-289%20139%20-298%200%20-29%20-30%20-15%20-57%2028%20-44%2069%20-255%20492%20-310%20622%20-59%20141%20-71%20185%20-50%20185%208%200%2019%20-6%2025%20-13z%20m-734%20-269%20c34%20-49%208%20-108%20-47%20-108%20-17%200%20-39%207%20-49%2017%20-22%2020%20-24%2076%20-2%2097%2024%2024%2080%2020%2098%20-6z%20m56%20-142%20c0%20-2%20-14%20-35%20-31%20-73%20-17%20-37%20-59%20-133%20-94%20-213%20-34%20-80%20-98%20-217%20-140%20-305%20-115%20-237%20-332%20-701%20-339%20-723%20-7%20-22%2016%20-47%2037%20-39%207%202%2034%2048%2062%20101%2027%2053%2051%2096%2055%2096%203%200%204%20-24%204%20-52%20-1%20-55%20-54%20-188%20-150%20-379%20-59%20-119%20-86%20-149%20-133%20-149%20-106%200%20-109%2091%20-9%20300%2042%2089%2055%20109%2086%20125%2026%2014%2045%2036%2064%2075%2024%2049%2026%2060%2017%2095%20-14%2056%2021%20138%2071%20163%2019%209%2045%2033%2058%2052%2020%2030%2023%2043%2018%2090%20-9%2081%20-9%2084%2011%20125%2013%2027%2028%2041%2056%2050%2053%2018%2065%2030%2084%2091%2015%2049%2015%2056%200%2095%20-15%2039%20-15%2043%205%2085%2013%2028%2027%2044%2038%2044%2024%200%2077%2045%2095%2081%2019%2037%2019%2099%200%20126%20-14%2020%20-14%2026%204%2062%2016%2030%2028%2040%2055%2045%2019%204%2039%2013%2046%2021%2011%2014%2030%2020%2030%2011z%20m-203%20-158%20c29%20-27%2029%20-65%201%20-95%20-43%20-46%20-128%20-14%20-128%2049%200%2062%2079%2091%20127%2046z%20m-482%20-133%20c-1%20-17%20-139%20-285%20-148%20-285%20-23%200%20-11%2040%2049%20164%2049%2098%2072%20136%2083%20134%209%20-2%2016%20-8%2016%20-13z%20m314%20-170%20c31%20-16%2041%20-33%2041%20-74%200%20-45%20-26%20-71%20-71%20-71%20-55%200%20-81%2028%20-77%2083%203%2037%207%2044%2038%2059%2042%2021%2035%2021%2069%203z%20m399%20-246%20c74%20-36%2099%20-100%2067%20-175%20-36%20-86%20-186%20-89%20-230%20-4%20-18%2034%20-20%20116%20-3%20126%206%204%2017%20-1%2025%20-12%2029%20-41%2043%20-54%2058%20-54%2028%200%2029%2032%202%2080%20-15%2026%20-24%2050%20-20%2054%2013%2012%2057%206%20101%20-15z%20m-554%20-70%20c35%20-16%2052%20-61%2037%20-98%20-12%20-27%20-47%20-51%20-76%20-51%20-7%200%20-27%2012%20-44%2026%20-39%2033%20-41%2074%20-6%20109%2026%2027%2051%2031%2089%2014z%20m-145%20-329%20c10%20-5%2024%20-23%2031%20-40%2033%20-80%20-73%20-148%20-135%20-85%20-67%2066%2020%20171%20104%20125z%20m516%20-51%20c62%20-55%2068%20-138%2013%20-196%20-59%20-63%20-171%20-42%20-208%2039%20-22%2048%20-24%2066%20-10%2088%208%2012%2015%209%2045%20-20%2028%20-27%2039%20-32%2052%20-24%2030%2019%2026%2034%20-18%2075%20-42%2039%20-43%2041%20-25%2055%2011%208%2041%2014%2068%2014%2039%200%2054%20-6%2083%20-31z%20m-1065%20-187%20c0%20-4%20-16%20-47%20-36%20-95%20-19%20-48%20-40%20-116%20-46%20-150%20-7%20-34%20-13%20-63%20-14%20-65%20-6%20-9%20-54%2032%20-54%2046%200%209%2020%2066%2044%20127%2024%2060%2046%20118%2049%20128%206%2017%2057%2025%2057%209z%20m349%20-540%20c56%20-41%2060%20-141%208%20-190%20-35%20-33%20-104%20-38%20-145%20-12%20-80%2050%20-73%20184%2012%20221%2031%2013%2095%203%20125%20-19z'/%3e%3cpath%20d='M2838%203927%20c-8%20-12%20-22%20-42%20-32%20-67%20-10%20-25%20-97%20-202%20-194%20-395%20-292%20-577%20-485%20-982%20-478%20-1000%2017%20-44%2044%20-4%20168%20245%20489%20980%20590%201189%20584%201208%20-10%2030%20-32%2034%20-48%209z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4051%204519%20c-24%20-22%20-51%20-77%20-51%20-103%200%20-7%209%20-24%2019%20-37%2015%20-19%2029%20-24%2063%20-24%2023%200%2045%20-4%2047%20-10%202%20-5%20-27%20-27%20-64%20-47%20-63%20-35%20-69%20-37%20-81%20-20%20-8%2010%20-9%2021%20-3%2027%2017%2018%209%2065%20-16%2090%20-18%2019%20-35%2025%20-69%2025%20-64%200%20-106%20-38%20-113%20-100%20-6%20-62%2012%20-85%2068%20-85%2023%200%2044%20-5%2046%20-11%202%20-7%20-26%20-29%20-63%20-49%20-76%20-43%20-88%20-38%20-78%2033%205%2036%203%2047%20-17%2068%20-18%2019%20-32%2024%20-74%2024%20-72%200%20-115%20-41%20-115%20-111%200%20-48%2028%20-73%2082%20-74%2050%200%2059%20-18%2018%20-35%20-17%20-7%20-42%20-26%20-55%20-42%20-23%20-27%20-25%20-36%20-22%20-124%20l2%20-95%20-150%20-147%20c-368%20-361%20-1122%20-1073%20-1140%20-1078%20-59%20-15%20-108%2039%20-107%20119%201%2063%2017%20102%2073%20182%2051%2073%2089%20151%2089%20185%200%2038%20-36%2090%20-75%20106%20-46%2019%20-101%2018%20-167%20-4%20-160%20-53%20-305%20-197%20-404%20-400%20-25%20-53%20-68%20-143%20-96%20-199%20-57%20-119%20-119%20-188%20-205%20-228%20-31%20-15%20-125%20-50%20-208%20-77%20-82%20-27%20-184%20-67%20-226%20-89%20-185%20-96%20-315%20-261%20-355%20-451%20-39%20-181%2026%20-396%20183%20-606%2080%20-106%20291%20-317%20392%20-391%20100%20-74%20222%20-134%20311%20-155%2080%20-19%20238%20-20%20305%20-2%20126%2033%20255%20128%20335%20246%2080%20117%20125%20228%20175%20429%2045%20178%2067%20204%20246%20275%20169%2068%20278%20156%20334%20270%2069%20142%2022%20286%20-94%20286%20-19%200%20-74%20-18%20-123%20-41%20-89%20-41%20-161%20-53%20-216%20-35%20-26%209%20-52%2054%20-52%2091%200%2029%20113%20154%20475%20525%20116%20119%20369%20381%20563%20583%20195%20202%20364%20375%20377%20383%2016%2010%2046%2015%2087%2015%2035%200%2079%204%2099%209%2054%2015%20109%2078%20174%20201%2072%20136%20106%20169%20176%20169%20215%200%20273%20304%2076%20399%20-50%2024%20-120%2027%20-157%206%20-14%20-8%20-33%20-14%20-42%20-15%20-22%200%20-32%2034%20-16%2059%2017%2027%200%2072%20-32%2088%20-40%2020%20-103%2016%20-129%20-8z%20m100%20-39%20c17%20-10%2018%20-13%204%20-34%20-8%20-12%20-13%20-25%20-10%20-28%203%20-2%20-15%20-5%20-40%20-5%20-37%200%20-45%204%20-45%2019%200%2022%2034%2058%2056%2058%208%200%2024%20-5%2035%20-10z%20m-231%20-120%20c16%20-8%2017%20-14%208%20-38%20-10%20-25%20-16%20-29%20-55%20-29%20-49%200%20-54%2011%20-22%2051%2022%2028%2039%2032%2069%2016z%20m495%20-35%20c86%20-50%2098%20-165%2025%20-237%20-34%20-34%20-43%20-38%20-89%20-38%20-104%200%20-145%20-36%20-234%20-209%20-31%20-58%20-69%20-119%20-86%20-135%20-28%20-27%20-39%20-30%20-125%20-36%20-52%20-3%20-101%20-12%20-109%20-19%20-12%20-9%20-17%20-9%20-22%200%20-5%207%2089%20106%20249%20263%20272%20268%20284%20285%20234%20320%20-32%2023%20-54%2020%20-77%20-10%20-26%20-34%20-26%20-49%200%20-75%20l22%20-22%20-228%20-225%20c-198%20-195%20-229%20-222%20-241%20-210%20-13%2013%203%2034%20124%20164%2076%2082%20153%20164%20171%20181%2038%2038%2037%2058%20-2%2087%20-26%2019%20-30%2019%20-55%205%20-33%20-18%20-42%20-68%20-16%20-93%2019%20-19%2031%20-4%20-185%20-228%20-70%20-72%20-91%20-85%20-91%20-54%200%206%2034%2054%2075%20106%2041%2052%2075%20101%2075%20109%200%2047%20-77%2069%20-104%2029%20-21%20-30%20-20%20-55%203%20-75%2019%20-15%2018%20-18%20-27%20-79%20-26%20-35%20-52%20-63%20-58%20-64%20-6%200%20-9%2037%20-8%20107%202%2097%204%20109%2024%20125%2023%2019%20233%20130%20495%20262%20167%2085%20195%2090%20260%2051z%20m-715%20-85%20c12%20-7%2012%20-12%202%20-22%20-6%20-6%20-12%20-20%20-12%20-30%200%20-16%20-3%20-17%20-20%20-8%20-14%208%20-25%207%20-39%20-2%20-29%20-18%20-37%20-3%20-18%2037%2013%2028%2023%2035%2044%2035%2016%200%2035%20-5%2043%20-10z%20m538%20-52%20c-3%20-7%20-11%20-13%20-18%20-13%20-7%200%20-15%206%20-17%2013%20-3%207%204%2012%2017%2012%2013%200%2020%20-5%2018%20-12z%20m-225%20-113%20c1%20-5%20-6%20-11%20-15%20-13%20-11%20-2%20-18%203%20-18%2013%200%2017%2030%2018%2033%200z%20m-225%20-113%20c2%20-7%20-6%20-12%20-17%20-12%20-21%200%20-27%2011%20-14%2024%209%209%2026%202%2031%20-12z%20m-568%20-603%20c-901%20-890%20-1160%20-1140%20-1170%20-1134%20-5%203%20-10%2012%20-10%2018%200%207%2071%2079%20158%20161%2086%2082%20274%20263%20417%20401%20596%20577%20981%20944%20990%20944%206%200%20-168%20-175%20-385%20-390z%20m430%20349%20c0%20-7%20-168%20-181%20-373%20-387%20-206%20-207%20-550%20-554%20-765%20-771%20l-391%20-395%20-21%2020%20-20%2021%2097%2094%20c134%20129%201067%201044%201283%201257%2096%2095%20178%20173%20183%20173%204%200%207%20-5%207%20-12z%20m50%20-35%20c0%20-4%20-44%20-52%20-97%20-107%20-54%20-56%20-154%20-159%20-223%20-231%20-412%20-426%20-839%20-866%20-1009%20-1037%20-186%20-188%20-196%20-197%20-214%20-181%20-17%2016%2018%2053%20755%20790%20425%20425%20776%20773%20780%20773%205%200%208%20-3%208%20-7z%20m-177%20-270%20c-121%20-126%20-316%20-330%20-434%20-454%20-118%20-125%20-309%20-325%20-424%20-445%20-116%20-121%20-261%20-273%20-323%20-339%20-104%20-111%20-113%20-118%20-129%20-103%20-15%2016%20-2%2031%20193%20230%20115%20117%20310%20316%20434%20443%20283%20289%20690%20704%20797%20812%2044%2046%2087%2083%2093%2083%207%200%20-86%20-102%20-207%20-227z%20m-1289%20-273%20c14%20-5%2030%20-18%2036%20-30%2014%20-25%20-9%20-80%20-70%20-170%20-77%20-114%20-100%20-195%20-80%20-280%2012%20-51%2064%20-110%2095%20-110%208%200%2015%20-4%2015%20-8%200%20-11%20-69%20-77%20-74%20-71%20-2%202%20-11%2018%20-20%2036%20-34%2067%20-93%2064%20-138%20-5%20-84%20-128%20-105%20-155%20-160%20-198%20-33%20-26%20-128%20-80%20-210%20-121%20-166%20-82%20-228%20-131%20-264%20-208%20-41%20-87%20-28%20-166%2041%20-250%20l34%20-42%20-144%20-143%20-143%20-143%20-27%2021%20c-34%2027%20-40%2024%20-129%20-67%20-67%20-67%20-69%20-71%20-56%20-96%2019%20-36%20275%20-285%20293%20-285%2016%200%2057%2030%20120%2089%2056%2052%2060%2064%2036%2095%20l-21%2026%2031%2038%20c16%2020%2080%2087%20141%20147%20l112%20110%2059%20-65%20c76%20-83%2093%20-120%2093%20-195%200%20-69%20-16%20-106%20-76%20-171%20-54%20-58%20-107%20-88%20-214%20-118%20-99%20-28%20-130%20-52%20-119%20-95%2021%20-85%20177%20-144%20319%20-121%2092%2015%20179%2061%20250%20132%2092%2094%20148%20210%20222%20460%2019%2068%2045%20145%2056%20171%2029%2067%2092%20119%20185%20152%20111%2039%20226%20101%20274%20147%2045%2044%2092%20135%2087%20169%20-7%2046%20-32%2047%20-115%204%20-71%20-36%20-85%20-40%20-153%20-40%20-85%200%20-133%2020%20-188%2076%20-36%2037%20-38%2046%20-16%2074%2016%2020%2016%2020%2027%201%2028%20-46%2071%20-86%20104%20-97%2059%20-19%20147%20-4%20240%2041%2084%2041%2099%2045%20128%2034%2020%20-8%2045%20-56%2045%20-88%200%20-48%20-41%20-135%20-88%20-187%20-60%20-67%20-119%20-104%20-259%20-164%20-185%20-78%20-219%20-120%20-277%20-333%20-65%20-241%20-131%20-376%20-235%20-479%20-100%20-99%20-207%20-143%20-346%20-143%20-199%201%20-375%2088%20-597%20299%20-369%20349%20-481%20666%20-335%20946%2019%2036%2063%2092%20112%20141%2096%2096%20157%20130%20365%20199%20326%20109%20358%20137%20511%20450%20139%20284%20246%20404%20406%20455%2068%2022%2083%2023%20117%2010z%20m-121%20-658%20l20%20-34%20-82%20-82%20c-74%20-75%20-81%20-85%20-81%20-121%200%20-38%20-6%20-45%20-112%20-146%20l-113%20-106%20-39%2033%20c-39%2033%20-39%2033%20-68%2016%20-17%20-9%20-43%20-32%20-59%20-50%20-32%20-36%20-30%20-52%2017%20-102%20l24%20-26%20-75%20-74%20c-85%20-84%20-86%20-84%20-139%20-11%20-26%2036%20-31%2051%20-30%2099%200%2067%2017%20103%2072%20158%2042%2040%2084%2064%20235%20133%20157%2071%20253%20153%20312%20263%2037%2070%2055%2089%2079%2086%2011%20-2%2029%20-18%2039%20-36z%20m-89%20-314%20c9%20-15%20-6%20-35%20-101%20-130%20l-113%20-113%20-22%2023%20-23%2022%20110%20110%20c61%2061%20116%20109%20124%20108%208%20-2%2019%20-11%2025%20-20z%20m61%20-58%20c15%20-17%2016%20-22%205%20-37%20-19%20-26%20-214%20-213%20-221%20-213%20-4%200%20-14%2012%20-24%2026%20l-17%2027%20108%20108%20c60%2060%20114%20109%20120%20109%206%200%2019%20-9%2029%20-20z%20m65%20-77%20c0%20-8%20-74%20-90%20-164%20-181%20-133%20-134%20-167%20-165%20-177%20-154%20-11%2010%20-4%2021%2034%2060%2026%2026%2047%2054%2047%2062%200%208%2053%2067%20117%20132%2090%2090%20120%20115%20130%20106%207%20-6%2013%20-17%2013%20-25z%20m86%20-37%20c22%20-1%2039%20-11%2063%20-38%2018%20-21%2058%20-50%2089%20-65%2047%20-23%2070%20-28%20133%20-28%2069%200%2084%204%20148%2038%2040%2020%2074%2037%2076%2037%2011%200%204%20-33%20-14%20-69%20-42%20-81%20-130%20-142%20-293%20-201%20-106%20-38%20-166%20-77%20-203%20-130%20-17%20-25%20-47%20-103%20-75%20-198%20-66%20-218%20-104%20-313%20-164%20-401%20-93%20-136%20-197%20-194%20-351%20-195%20-103%200%20-171%2023%20-201%2069%20-25%2039%20-10%2054%2073%2075%2098%2025%20167%2063%20228%20124%2069%2069%2095%20125%2095%20205%200%2079%20-15%20110%20-97%20206%20-62%2074%20-64%2077%20-47%2096%2017%2018%2018%2018%2060%20-21%2024%20-22%2049%20-40%2055%20-40%2022%200%2099%2071%20105%2096%205%2021%20-1%2034%20-37%2070%20l-43%2044%20169%20170%20c121%20121%20174%20168%20185%20163%208%20-4%2029%20-7%2046%20-7z%20m-545%20-15%20l24%20-20%20-32%20-33%20-33%20-33%20-27%2028%20-28%2028%2028%2025%20c34%2029%2038%2029%2068%205z%20m49%20-116%20l-34%20-35%20-20%2020%20-20%2020%2034%2035%2034%2035%2020%20-20%2020%20-20%20-34%20-35z%20m85%20-15%20c17%20-19%2017%20-21%20-11%20-52%20-16%20-18%20-55%20-57%20-87%20-87%20l-58%20-55%20-22%2022%20-22%2022%2039%2036%20c37%2034%2040%2035%2053%2018%209%20-13%2016%20-15%2024%20-7%207%207%206%2015%20-5%2026%20-21%2021%20-21%2021%2015%2062%2036%2040%2049%2043%2074%2015z%20m-204%20-79%20c-21%20-25%20-42%20-56%20-45%20-67%20-4%20-12%20-15%20-29%20-26%20-39%20-19%20-17%20-21%20-17%20-40%200%20-11%2010%20-20%2023%20-20%2029%200%206%2032%2041%2072%2078%2054%2050%2076%2064%2085%2056%2010%20-8%204%20-21%20-26%20-57z%20m151%20-96%20c10%20-23%208%20-29%20-15%20-52%20-26%20-26%20-27%20-26%20-46%20-9%20-21%2019%20-21%2019%207%2052%2033%2040%2039%2041%2054%209z%20m-287%20-35%20c19%20-21%2017%20-23%20-125%20-165%20l-145%20-145%20-25%2025%20-25%2026%20140%20139%20c77%2077%20145%20139%20151%20140%206%200%2019%20-9%2029%20-20z%20m133%20-3%20l22%20-24%20-20%20-18%20c-19%20-17%20-21%20-17%20-40%200%20-29%2026%20-26%2065%205%2065%206%200%2021%20-10%2033%20-23z%20m227%20-37%20l29%20-30%20-31%20-31%20-30%20-31%20-34%2030%20-34%2031%2029%2030%20c17%2017%2033%2031%2036%2031%203%200%2019%20-14%2035%20-30z%20m-295%20-25%20l23%20-25%20-128%20-132%20c-71%20-73%20-135%20-139%20-142%20-147%20-11%20-13%20-16%20-12%20-38%209%20-14%2013%20-25%2027%20-25%2032%200%2010%20270%20288%20280%20288%204%200%2017%20-11%2030%20-25z%20m125%20-35%20l-19%20-21%20-20%2020%20c-19%2020%20-19%2021%20-1%2041%20l19%2021%2020%20-20%20c19%20-20%2019%20-21%201%20-41z%20m-60%20-30%20c19%20-21%2017%20-22%20-120%20-160%20-77%20-77%20-145%20-140%20-151%20-140%20-6%200%20-17%207%20-24%2015%20-10%2012%2011%2039%20126%20160%2076%2080%20141%20145%20144%20145%204%200%2015%20-9%2025%20-20z%20m-504%20-142%20c1%20-7%201%20-19%200%20-25%20-1%20-7%206%20-13%2015%20-13%2010%200%2026%20-8%2036%20-17%2018%20-16%2018%20-17%20-8%20-44%20-37%20-38%20-21%20-59%2017%20-23%20l29%2028%2026%20-25%2025%20-26%20-27%20-32%20c-34%20-41%20-23%20-53%2016%20-16%20l30%2029%2025%20-24%20c17%20-16%2022%20-27%2015%20-35%20-12%20-15%20-3%20-25%2016%20-18%2027%2010%2012%20-12%20-38%20-56%20l-49%20-45%20-124%20124%20-125%20125%2052%2052%20c54%2054%2067%2062%2069%2041z'/%3e%3cpath%20d='M1914%201153%20c-26%20-18%20-35%20-53%20-22%20-81%2011%20-23%2020%20-27%2053%20-27%2032%200%2042%205%2054%2027%2014%2025%2014%2029%20-5%2055%20-21%2028%20-59%2040%20-80%2026z%20m46%20-59%20c0%20-14%20-21%20-19%20-33%20-7%20-9%209%2013%2034%2024%2027%205%20-3%209%20-12%209%20-20z'/%3e%3cpath%20d='M1762%20944%20c-27%20-19%20-29%20-64%20-4%20-87%2058%20-53%20137%2028%2082%2083%20-24%2024%20-48%2025%20-78%204z%20m54%20-35%20c10%20-17%20-13%20-36%20-27%20-22%20-12%2012%20-4%2033%2011%2033%205%200%2012%20-5%2016%20-11z'/%3e%3cpath%20d='M1563%20859%20c-29%20-11%20-41%20-55%20-20%20-76%2019%20-19%2066%20-20%2078%20-2%2026%2040%20-15%2095%20-58%2078z%20m32%20-49%20c-3%20-5%20-10%20-10%20-16%20-10%20-5%200%20-9%205%20-9%2010%200%206%207%2010%2016%2010%208%200%2012%20-4%209%20-10z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4260%204540%20c-8%20-5%20-36%20-10%20-61%20-10%20-79%200%20-129%20-57%20-129%20-149%200%20-44%20-3%20-52%20-31%20-71%20-29%20-21%20-31%20-21%20-50%20-5%20-12%2011%20-19%2031%20-19%2052%200%2045%20-14%2069%20-50%2088%20-66%2034%20-120%205%20-120%20-64%200%20-51%2030%20-88%2078%20-97%2039%20-7%2072%20-29%2072%20-48%20-1%20-6%20-20%20-28%20-44%20-48%20-41%20-35%20-44%20-36%20-65%20-21%20-17%2011%20-21%2022%20-17%2038%2013%2051%20-44%20115%20-102%20115%20-36%200%20-72%20-43%20-72%20-85%200%20-44%2045%20-95%2083%20-95%2014%200%2035%20-8%2047%20-18%20l23%20-19%20-30%20-44%20c-29%20-42%20-554%20-559%20-568%20-559%20-3%200%20-27%2014%20-51%2031%20-167%20114%20-404%20166%20-567%20124%20-171%20-44%20-286%20-144%20-404%20-347%20-43%20-75%20-89%20-124%20-155%20-163%20-47%20-29%20-50%20-73%20-9%20-121%2025%20-27%2031%20-44%2031%20-78%200%20-118%20-217%20-317%20-364%20-333%20-79%20-9%20-116%204%20-168%2059%20-63%2066%20-84%2062%20-129%20-23%20-39%20-72%20-55%20-84%20-206%20-156%20-217%20-102%20-347%20-222%20-439%20-405%20-49%20-97%20-67%20-183%20-67%20-313%201%20-235%2095%20-441%20313%20-683%20l92%20-103%20-34%20-39%20c-18%20-21%20-88%20-98%20-156%20-170%20-67%20-73%20-122%20-140%20-122%20-149%200%20-20%2019%20-41%2037%20-41%207%200%2085%2078%20174%20174%20l161%20174%20104%20-78%20c266%20-201%20522%20-290%20743%20-260%20303%2041%20497%20224%20641%20605%2036%2094%2082%20153%20146%20186%2054%2029%2051%2055%20-15%20119%20-76%2072%20-90%20115%20-67%20209%2020%2081%2077%20169%20160%20250%2095%2091%20149%20104%20209%2051%2058%20-51%2097%20-38%20132%2045%2022%2055%2056%2088%20154%20152%20179%20116%20282%20267%20311%20456%2026%20172%20-22%20334%20-160%20549%20l-40%2060%2019%2027%20c11%2014%2090%20109%20177%20211%2086%20102%20189%20222%20228%20268%2043%2050%2077%2082%2089%2082%2011%200%2034%2016%2053%2037%2028%2030%2036%2034%2049%2023%208%20-7%2015%20-28%2015%20-48%200%20-80%20102%20-125%20149%20-66%2030%2038%2027%2080%20-8%20115%20-17%2016%20-40%2029%20-54%2029%20-13%200%20-36%209%20-51%2021%20l-26%2021%2036%2044%2037%2045%2023%20-22%20c15%20-14%2024%20-34%2024%20-51%200%20-40%2015%20-65%2050%20-83%2039%20-20%2062%20-19%2092%205%2066%2051%2025%20160%20-60%20160%20-17%200%20-38%2010%20-52%2025%20-32%2034%20-14%2055%2048%2055%2085%200%20130%2049%20131%20145%200%2017%203%2049%207%2072%205%2038%202%2047%20-26%2083%20-49%2061%20-110%2086%20-150%2060z%20m88%20-87%20c35%20-26%2042%20-62%2017%20-83%20-12%20-10%20-14%20-24%20-9%20-55%207%20-51%20-14%20-80%20-53%20-70%20-13%203%20-31%201%20-41%20-4%20-13%20-7%20-30%203%20-75%2043%20l-58%2052%207%2052%20c9%2071%2024%2090%2058%2074%2022%20-10%2032%20-9%2063%208%2039%2020%2040%2020%2091%20-17z%20m-443%20-83%20c0%20-22%20-39%20-19%20-43%203%20-3%2015%201%2018%2020%2015%2012%20-2%2023%20-10%2023%20-18z%20m275%20-170%20c0%20-3%20-50%20-63%20-111%20-134%20l-112%20-128%20-53%2053%20c-46%2046%20-51%2054%20-40%2070%207%2010%2063%2063%20126%20119%20l113%20101%2039%20-38%20c21%20-20%2038%20-40%2038%20-43z%20m-420%2024%20c0%20-21%20-21%20-27%20-38%20-11%20-13%2013%20-13%2019%20-2%2032%2010%2012%2016%2013%2026%204%208%20-6%2014%20-17%2014%20-25z%20m570%20-220%20c0%20-19%20-39%20-18%20-47%202%20-3%209%200%2020%208%2024%2015%2010%2039%20-6%2039%20-26z%20m-625%20-126%20c-121%20-127%20-542%20-555%20-922%20-938%20-313%20-315%20-344%20-343%20-358%20-329%20-15%2015%2043%2074%20665%20683%20375%20366%20685%20666%20688%20666%203%200%20-30%20-37%20-73%20-82z%20m104%2045%20c-20%20-21%20-175%20-186%20-345%20-368%20-468%20-500%20-929%20-988%20-947%20-1004%20-14%20-11%20-20%20-11%20-32%20-1%20-9%207%20-15%2019%20-13%2025%202%207%20251%20264%20553%20570%20303%20307%20606%20616%20674%20687%2068%2070%20128%20128%20134%20128%206%200%20-5%20-17%20-24%20-37z%20m50%20-10%20c-7%20-10%20-52%20-60%20-99%20-112%20-47%20-52%20-107%20-119%20-135%20-151%20-27%20-31%20-131%20-146%20-230%20-256%20-99%20-109%20-261%20-289%20-360%20-399%20-456%20-507%20-464%20-516%20-485%20-502%20-11%206%20-20%2016%20-20%2020%200%2010%2056%2070%20846%20907%20142%20151%20309%20327%20369%20392%2061%2064%20114%20117%20119%20117%205%201%202%20-7%20-5%20-16z%20m25%20-24%20c-4%20-6%20-173%20-205%20-377%20-443%20-204%20-237%20-486%20-565%20-626%20-729%20-253%20-294%20-256%20-297%20-275%20-278%20-19%2019%20-19%2020%2025%2068%20200%20221%20975%201082%201098%201220%20142%20159%20174%20192%20155%20162z%20m306%20-4%20c10%20-12%2010%20-19%202%20-27%20-15%20-15%20-48%2014%20-38%2031%2010%2015%2021%2014%2036%20-4z%20m-1270%20-311%20c77%20-26%20210%20-94%20227%20-117%207%20-9%20-106%20-125%20-404%20-416%20-227%20-222%20-413%20-409%20-413%20-414%200%20-6%2012%20-24%2027%20-39%20l27%20-29%20-157%20-156%20-156%20-157%20-29%2027%20c-53%2051%20-97%20-1%20-46%20-54%20l28%20-29%20-20%20-22%20c-70%20-79%20-166%20-192%20-208%20-245%20l-49%20-62%20-25%2019%20c-13%2011%20-33%2020%20-43%2020%20-28%200%20-73%20-67%20-152%20-222%20-91%20-180%20-149%20-256%20-327%20-433%20l-141%20-140%20-36%2040%20c-132%20148%20-228%20319%20-264%20470%20-17%2073%20-20%20110%20-16%20195%208%20168%2059%20293%20175%20420%2076%2085%20136%20126%20306%20210%20150%2075%20181%2099%20225%20177%208%2015%2013%2013%2044%20-14%2050%20-43%2096%20-56%20186%20-51%2064%204%2088%2011%20151%2043%20138%2072%20290%20256%20290%20349%200%2036%20-30%20105%20-53%20125%20-15%2012%20-13%2016%2025%2040%2055%2035%2097%2083%20146%20168%2096%20163%20158%20228%20277%20284%20115%2054%20265%2059%20405%2013z%20m600%20-519%20c61%20-122%2080%20-194%2080%20-305%200%20-67%20-6%20-102%20-28%20-166%20-48%20-137%20-118%20-220%20-269%20-322%20-95%20-64%20-135%20-104%20-161%20-162%20-9%20-19%20-17%20-36%20-18%20-38%20-1%20-2%20-19%209%20-40%2023%20-33%2023%20-47%2026%20-95%2023%20-47%20-3%20-66%20-11%20-122%20-51%20-118%20-85%20-200%20-199%20-233%20-327%20-27%20-108%20-8%20-186%2064%20-256%2026%20-26%2033%20-38%2023%20-42%20-26%20-9%20-92%20-76%20-111%20-111%20-10%20-20%20-34%20-77%20-53%20-127%20-69%20-179%20-130%20-277%20-230%20-371%20-131%20-122%20-276%20-171%20-477%20-160%20-143%208%20-256%2047%20-418%20145%20-75%2045%20-182%20120%20-182%20128%200%207%20207%20268%20254%20321%2058%2064%20163%20144%20281%20213%20121%2071%20183%20117%20190%20141%205%2015%20-1%2029%20-21%2050%20l-28%2029%20124%20127%20c68%2071%20136%20141%20151%20158%20l28%2029%2024%20-22%20c27%20-26%2050%20-28%2067%20-7%2011%2013%208%2021%20-18%2048%20l-32%2033%2047%2054%20c26%2030%2092%20106%20146%20168%20l99%20112%2030%20-25%20c16%20-14%2033%20-25%2038%20-25%205%200%20105%20112%20222%20248%20117%20136%20290%20336%20383%20444%20l170%20196%2032%20-36%20c18%20-20%2055%20-82%2083%20-137z%20m-1140%20-602%20c-247%20-265%20-249%20-267%20-271%20-247%20-20%2018%20-18%2020%20138%20176%20138%20138%20159%20156%20172%20143%2013%20-12%208%20-22%20-39%20-72z%20m95%2024%20c17%20-13%209%20-23%20-95%20-138%20-62%20-68%20-131%20-144%20-153%20-168%20l-39%20-43%20-21%2020%20-20%2021%20149%20159%20c82%2088%20152%20160%20155%20161%203%201%2013%20-5%2024%20-12z%20m39%20-100%20c-108%20-127%20-258%20-297%20-262%20-297%20-3%200%20-14%207%20-24%2016%20-17%2016%20-15%2020%2045%2087%2034%2039%20102%20113%20151%20164%2079%2083%2091%2092%20104%2079%2013%20-13%2011%20-19%20-14%20-49z%20m-442%20-252%20c-4%20-6%20-68%20-80%20-142%20-163%20-101%20-112%20-138%20-148%20-147%20-140%20-7%206%20-13%2014%20-13%2019%200%2010%2079%20109%20187%20232%2081%2094%2086%2097%20104%2081%2010%20-9%2015%20-22%2011%20-29z%20m68%20-48%20c0%20-16%20-281%20-307%20-296%20-307%20-41%200%20-18%2038%20117%20189%20135%20151%20144%20159%20161%20144%2010%20-9%2018%20-20%2018%20-26z%20m32%20-94%20c-17%20-21%20-83%20-90%20-146%20-153%20-93%20-92%20-119%20-113%20-132%20-105%20-8%206%20-16%2014%20-16%2019%200%204%2064%2077%20143%20162%20141%20150%20144%20153%20163%20134%2019%20-18%2018%20-19%20-12%20-57z%20m-381%20-265%20c54%20-51%2099%20-96%2099%20-99%200%20-4%20-32%20-27%20-71%20-51%20-266%20-162%20-341%20-230%20-526%20-471%20-42%20-54%20-83%20-102%20-93%20-107%20-13%20-7%20-24%20-1%20-48%2023%20-18%2018%20-32%2039%20-32%2046%200%207%2067%2081%20148%20165%20175%20179%20232%20257%20317%20429%2065%20132%2081%20157%2097%20157%205%200%2054%20-41%20109%20-92z'/%3e%3cpath%20d='M2027%202589%20c-21%20-11%20-92%20-72%20-159%20-136%20-149%20-141%20-213%20-176%20-263%20-139%20-18%2013%20-18%2014%203%2020%2045%2015%2052%2075%2011%2097%20-28%2014%20-57%202%20-74%20-31%20-19%20-37%20-19%20-65%201%20-100%2022%20-36%2064%20-60%20106%20-60%2067%200%20134%2044%20269%20175%20125%20122%20181%20161%20213%20149%2022%20-9%2020%20-24%20-4%20-24%20-23%200%20-38%20-45%20-23%20-69%2014%20-22%2057%20-25%2077%20-6%2025%2025%2021%2087%20-9%20119%20-30%2032%20-92%2035%20-148%205z'/%3e%3cpath%20d='M2508%202189%20c-32%20-18%20-41%20-48%20-23%20-75%2020%20-32%2064%20-30%2081%203%2014%2029%2024%2019%2024%20-22%200%20-39%20-39%20-101%20-141%20-227%20-96%20-117%20-129%20-183%20-129%20-255%200%20-44%205%20-58%2028%20-85%2025%20-27%2036%20-31%2077%20-31%2040%200%2052%204%2072%2027%2030%2035%2030%2071%20-1%2091%20-31%2021%20-63%206%20-72%20-33%20-3%20-15%20-7%20-31%20-8%20-36%20-5%20-22%20-36%2029%20-36%2060%200%2048%2036%20113%20125%20224%20153%20192%20176%20311%2069%20356%20-39%2016%20-43%2017%20-66%203z'/%3e%3cpath%20d='M4353%203208%20c-24%20-27%20-120%20-155%20-190%20-253%20-59%20-84%20-234%20-326%20-523%20-725%20-646%20-892%20-1160%20-1619%20-1160%20-1639%200%20-15%2027%20-31%2043%20-25%209%203%2032%2030%2053%2060%2021%2030%2042%2054%2049%2054%206%200%2031%20-14%2054%20-32%2041%20-29%2045%20-31%2069%20-17%2014%208%2071%2079%20127%20159%20110%20157%20601%20854%20750%201065%20254%20359%20583%20817%20693%20964%20136%20182%20141%20197%20103%20291%20-14%2033%20-16%2050%20-8%2067%2022%2049%20-22%2072%20-60%2031z%20m12%20-138%20c8%20-16%2015%20-37%2015%20-46%200%20-9%20-49%20-83%20-108%20-163%20-263%20-354%20-631%20-870%20-1166%20-1636%20-76%20-110%20-159%20-228%20-183%20-263%20-24%20-34%20-48%20-62%20-52%20-62%20-12%200%20-61%2040%20-61%2050%200%204%2035%2056%2077%20116%20218%20308%20478%20675%20568%20799%2056%2077%20196%20271%20311%20430%20116%20160%20277%20385%20360%20500%20159%20224%20218%20304%20221%20305%201%200%209%20-13%2018%20-30z%20m-1564%20-2201%20c16%20-11%2029%20-24%2029%20-29%200%20-10%20-87%20-137%20-99%20-144%20-4%20-3%20-22%207%20-40%2022%20l-33%2027%2053%2073%20c29%2039%2054%2072%2057%2072%202%200%2017%20-9%2033%20-21z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4363%204539%20c-33%20-10%20-51%20-22%20-296%20-216%20-114%20-91%20-208%20-177%20-358%20-333%20-121%20-125%20-210%20-210%20-221%20-210%20-47%200%20-116%20-57%20-353%20-290%20-218%20-214%20-259%20-250%20-296%20-260%20-133%20-36%20-187%20-70%20-254%20-161%20-49%20-67%20-60%20-96%20-50%20-128%2012%20-39%2051%20-37%20101%205%2076%2065%20127%20104%20130%20101%202%20-1%20-117%20-125%20-264%20-275%20l-267%20-272%20-65%206%20c-76%206%20-118%20-13%20-146%20-68%20-14%20-28%20-15%20-39%20-4%20-81%2012%20-47%2012%20-49%20-16%20-78%20-16%20-16%20-40%20-32%20-54%20-36%20-65%20-15%20-110%20-61%20-110%20-111%200%20-25%20-195%20-212%20-220%20-212%20-26%200%20-80%20-49%20-96%20-86%20-14%20-33%20-104%20-119%20-229%20-219%20-151%20-121%20-324%20-224%20-477%20-284%20-64%20-25%20-80%20-28%20-105%20-19%20-38%2014%20-82%20-6%20-101%20-45%20-18%20-37%200%20-92%2059%20-179%20132%20-197%20361%20-408%20541%20-499%2071%20-36%2088%20-36%20127%20-3%2024%2020%2031%2034%2031%2063%200%2020%20-5%2042%20-10%2047%20-17%2017%2025%20160%2079%20269%2091%20183%20222%20358%20431%20578%2079%2082%20118%20116%20140%20121%2036%207%2078%2048%2086%2085%209%2037%20173%20201%20201%20201%2016%200%2057%2035%20135%20117%20229%20236%20406%20373%20484%20373%2037%200%2097%2064%20113%20122%2011%2039%2011%2050%20-4%2077%20-15%2030%20-15%2033%205%2062%2013%2018%2019%2037%2015%2047%20-5%2013%20126%20148%20563%20582%20546%20542%20576%20574%20731%20772%2089%20115%20169%20224%20177%20243%2019%2045%2018%2089%20-2%20132%20-28%2057%20-86%2082%20-151%2062z%20m80%20-76%20c28%20-32%2031%20-70%209%20-107%20-19%20-32%20-188%20-253%20-218%20-286%20-12%20-12%20-25%20-4%20-94%2065%20-44%2044%20-80%2083%20-80%2088%200%2010%2020%2027%20184%20160%20128%20103%20164%20118%20199%2080z%20m-343%20-355%20c77%20-80%2094%20-108%2067%20-108%20-20%200%20-180%20166%20-173%20179%2013%2020%2025%2012%20106%20-71z%20m-51%20-65%20l91%20-98%20-100%20-100%20-100%20-100%20-94%2094%20-95%2094%2096%20104%20c52%2057%2099%20103%20103%20103%205%200%2049%20-44%2099%20-97z%20m-157%20-335%20c-18%20-18%20-198%20162%20-188%20188%206%2015%2024%201%20104%20-79%2077%20-77%2094%20-99%2084%20-109z%20m-148%2061%20c42%20-40%2082%20-81%2087%20-92%2010%20-18%20-33%20-64%20-412%20-444%20l-424%20-424%20-40%207%20c-56%209%20-114%2040%20-127%2069%20-26%2058%20-10%2081%20216%20305%20118%20116%20224%20219%20237%20228%2021%2015%2022%2015%2015%20-9%20-19%20-69%20-19%20-77%207%20-103%2034%20-34%2081%20-34%20129%20-1%20106%2072%2040%20206%20-77%20153%20-54%20-25%20-34%207%2078%20121%2064%2065%20117%20126%20117%20135%200%2017%2096%20126%20110%20126%205%200%2042%20-32%2084%20-71z%20m-557%20-367%20l-315%20-315%20-30%2012%20c-43%2018%20-96%20-1%20-182%20-65%20-65%20-50%20-70%20-51%20-53%20-23%2041%2070%20140%20140%20218%20155%2022%203%2054%2013%2070%2022%2017%208%20140%20124%20275%20257%20234%20232%20302%20291%20323%20278%205%20-3%20-133%20-147%20-306%20-321z%20m241%20-19%20c2%20-24%20-2%20-34%20-18%20-43%20-54%20-29%20-93%2017%20-50%2060%2031%2031%2064%2023%2068%20-17z%20m-658%20-483%20c0%20-49%2053%20-98%20135%20-125%2075%20-24%2095%20-50%2038%20-50%20-26%200%20-44%20-12%20-90%20-57%20-547%20-535%20-589%20-575%20-600%20-565%20-3%204%206%2020%2020%2036%2017%2021%2028%2049%2032%2085%20l7%2053%2043%20-5%20c38%20-4%2047%20-1%2069%2023%2072%2078%20-26%20189%20-113%20129%20-19%20-14%20-25%20-14%20-32%20-3%20-5%208%20-9%2016%20-9%2019%200%2013%20308%20310%20321%20310%2011%200%2013%20-11%2011%20-43%20-3%20-35%201%20-49%2020%20-70%2022%20-25%2039%20-31%2086%20-28%2036%202%2062%2036%2062%2081%200%2061%20-54%20101%20-115%2086%20-53%20-13%20-46%208%2026%2080%2041%2041%2077%2074%2081%2074%205%200%208%20-14%208%20-30z%20m-52%20-206%20c2%20-22%20-2%20-33%20-14%20-38%20-25%20-9%20-52%202%20-59%2025%20-9%2027%2013%2051%2044%2047%2021%20-2%2027%20-9%2029%20-34z%20m255%20-71%20c12%20-7%208%20-40%20-10%20-77%20-14%20-30%20-25%20-38%20-70%20-51%20-108%20-32%20-210%20-109%20-447%20-340%20-121%20-118%20-146%20-137%20-146%20-116%200%205%20137%20142%20304%20305%20284%20277%20307%20296%20333%20290%2015%20-4%2031%20-9%2036%20-11z%20m-771%20-193%20c39%20-30%2051%20-70%2046%20-154%20-2%20-55%20-8%20-80%20-22%20-95%20-29%20-32%20-53%20-27%20-60%2013%20-4%2019%20-27%2064%20-51%20100%20-50%2073%20-55%2099%20-23%20133%2027%2029%2076%2030%20110%203z%20m196%20-72%20c5%20-45%20-57%20-62%20-72%20-21%20-13%2032%204%2054%2037%2051%2026%20-2%2033%20-8%2035%20-30z%20m-288%20-179%20c0%20-26%20-8%20-42%20-30%20-64%20-37%20-36%20-48%20-27%20-51%2042%20-2%2044%201%2057%2021%2078%20l24%2026%2018%20-23%20c10%20-13%2018%20-39%2018%20-59z%20m-126%20-12%20c15%20-23%20-12%20-71%20-42%20-75%20-49%20-7%20-68%2042%20-31%2079%2023%2023%2057%2022%2073%20-4z%20m261%20-128%20c4%20-5%20-34%20-50%20-84%20-101%20l-89%20-93%20-70%200%20c-39%200%20-74%203%20-78%208%20-10%2010%20115%20137%20130%20131%2019%20-7%2048%2021%2051%2049%202%2014%2016%2037%2031%2051%20l29%2024%2037%20-30%20c21%20-16%2040%20-34%2043%20-39z%20m-289%205%20c34%204%2044%202%2044%20-8%200%20-19%20-259%20-268%20-274%20-263%20-6%202%20-12%2029%20-14%2061%20l-3%2057%2082%2084%20c72%2074%2084%2083%20102%2073%2011%20-6%2039%20-8%2063%20-4z%20m-286%20-209%20c0%20-32%20-33%20-59%20-65%20-51%20-45%2011%20-30%2067%2020%2078%2031%207%2045%20-2%2045%20-27z%20m243%20-91%20l6%20-60%20-99%20-99%20-99%20-99%20-28%2024%20c-83%2072%20-183%20177%20-183%20191%200%2025%2038%2055%2052%2041%207%20-7%2034%20-12%2060%20-12%2040%200%2048%20-3%2048%20-18%200%20-10%205%20-23%2012%20-30%2015%20-15%2068%20-16%2068%20-1%200%206%2030%2042%2067%2080%2077%2081%2087%2079%2096%20-17z%20m127%2041%20c19%20-23%20-13%20-67%20-47%20-63%20-38%204%20-52%2032%20-29%2057%2022%2025%2058%2027%2076%206z%20m-460%20-229%20c55%20-54%20100%20-102%20100%20-107%200%20-4%20-5%20-11%20-11%20-15%20-13%20-8%20-219%20194%20-219%20214%200%2027%2031%205%20130%20-92z%20m-56%20-57%20c80%20-80%20107%20-114%20100%20-124%20-191%20-263%20-267%20-397%20-314%20-552%20-12%20-40%20-25%20-73%20-29%20-73%20-4%200%20-52%2038%20-107%2084%20-146%20123%20-408%20396%20-393%20410%202%202%2045%2021%2094%2042%20157%2067%20335%20173%20465%20278%2030%2025%2059%2045%2065%2045%205%201%2059%20-49%20119%20-110z%20m-796%20-297%20c80%20-124%20319%20-361%20495%20-489%2042%20-32%2077%20-63%2077%20-70%200%20-60%20-259%20122%20-421%20295%20-118%20126%20-216%20268%20-205%20297%209%2025%2023%2017%2054%20-33z'/%3e%3cpath%20d='M3140%203270%20c-29%20-29%20-27%20-94%205%20-125%2052%20-53%20145%20-15%20145%2058%200%2020%20-9%2046%20-21%2061%20-27%2034%20-98%2037%20-129%206z%20m90%20-34%20c19%20-23%208%20-61%20-18%20-64%20-45%20-7%20-72%2046%20-34%2067%2024%2014%2038%2013%2052%20-3z'/%3e%3cpath%20d='M2986%203114%20c-35%20-36%20-34%20-77%203%20-115%2071%20-70%20179%200%20141%2092%20-24%2056%20-98%2068%20-144%2023z%20m89%20-30%20c9%20-9%2015%20-26%2013%20-38%20-2%20-17%20-10%20-21%20-38%20-21%20-29%200%20-36%204%20-38%2023%20-7%2045%2032%2067%2063%2036z'/%3e%3cpath%20d='M2459%202571%20c-58%20-58%20-23%20-141%2061%20-141%2051%200%2080%2027%2080%2074%200%2048%20-8%2065%20-41%2081%20-42%2022%20-67%2018%20-100%20-14z%20m93%20-47%20c11%20-22%2010%20-28%20-7%20-40%20-26%20-19%20-41%20-18%20-59%208%20-20%2028%20-4%2058%2030%2058%2017%200%2028%20-8%2036%20-26z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M2494%204517%20c-81%20-84%20-94%20-135%20-49%20-201%2034%20-51%2033%20-76%20-4%20-76%20-16%200%20-34%207%20-41%2015%20-28%2033%20-100%204%20-100%20-41%200%20-29%2032%20-64%2059%20-64%2011%200%2032%208%2049%2017%2042%2024%2064%2012%2060%20-34%20-4%20-47%20-32%20-55%20-76%20-23%20-25%2018%20-32%2020%20-55%209%20-48%20-22%20-50%20-83%20-4%20-109%2025%20-14%2030%20-13%2058%203%2017%209%2042%2017%2055%2017%2023%200%2024%20-2%2024%20-72%200%20-40%20-7%20-199%20-15%20-353%20-8%20-154%20-15%20-292%20-15%20-307%200%20-25%20-10%20-33%20-102%20-79%20-279%20-140%20-382%20-273%20-382%20-494%200%20-116%2011%20-303%2019%20-315%203%20-6%2021%20-10%2038%20-10%2073%200%20104%20-62%2093%20-187%20-10%20-105%20-31%20-168%20-72%20-208%20-32%20-33%20-39%20-35%20-98%20-35%20-76%200%20-77%20-2%20-69%20-97%204%20-58%201%20-78%20-22%20-138%20-64%20-168%20-83%20-352%20-50%20-480%2038%20-146%20158%20-291%20296%20-359%2087%20-42%20231%20-82%20332%20-92%20106%20-10%20107%20-10%20108%20-107%202%20-111%209%20-142%2034%20-142%2016%200%2021%209%2027%2050%203%2028%207%2081%207%20118%201%2045%205%2069%2014%2071%206%202%2067%2011%20135%2020%20364%2048%20575%20241%20598%20550%208%20104%20-6%20187%20-58%20341%20-37%20112%20-39%20124%20-30%20175%2014%2077%205%2090%20-62%2089%20-112%20-3%20-166%2071%20-174%20241%20-2%2054%20-2%20110%202%20124%2010%2040%2041%2066%2080%2066%2044%200%2057%2018%2056%2077%20-1%2026%201%20109%205%20184%207%20123%206%20142%20-14%20205%20-44%20143%20-139%20238%20-338%20336%20l-122%2060%20-5%2061%20c-6%2073%20-26%20585%20-26%20675%200%2058%202%2062%2023%2062%2012%200%2031%20-7%2041%20-15%2061%20-46%20133%2038%2076%2090%20-19%2017%20-31%2017%20-102%20-1%20-27%20-6%20-28%20-5%20-28%2035%200%2022%202%2041%205%2041%203%200%2023%20-9%2045%20-20%2033%20-17%2043%20-18%2065%20-8%2048%2022%2045%2089%20-5%20106%20-21%208%20-33%207%20-47%20-3%20-23%20-18%20-73%20-19%20-73%20-2%200%206%2012%2023%2025%2036%2035%2032%2034%2088%20-2%20138%20-32%2045%20-106%20103%20-131%20103%20-9%200%20-35%20-19%20-58%20-43z%20m110%20-58%20c14%20-11%2026%20-30%2026%20-43%200%20-12%205%20-27%2012%20-34%2014%20-14%20-3%20-37%20-43%20-58%20-40%20-20%20-55%20-18%20-89%2014%20-28%2025%20-29%2030%20-20%2067%2010%2042%2040%2075%2070%2075%209%200%2029%20-9%2044%20-21z%20m0%20-230%20c8%20-40%208%20-94%200%20-153%20-7%20-47%20-7%20-47%20-43%20-44%20-32%203%20-36%207%20-39%2033%20-2%2017%20-1%2067%203%20113%20l7%2082%2033%200%20c28%200%2033%20-4%2039%20-31z%20m-20%20-1301%20l7%20-488%20-27%200%20-27%200%207%20648%20c3%20356%2010%20701%2014%20767%206%20110%207%2097%2013%20-160%204%20-154%209%20-499%2013%20-767z%20m25%20760%20c28%20-605%2051%20-1134%2051%20-1189%200%20-55%20-1%20-59%20-23%20-59%20l-24%200%20-7%20588%20c-3%20323%20-9%20660%20-13%20750%20-3%2089%20-4%20162%20-1%20162%203%200%2010%20-114%2017%20-252z%20m-85%20-375%20c-2%20-302%20-7%20-621%20-10%20-710%20l-6%20-163%20-25%200%20-25%200%207%2098%20c7%20116%2055%201228%2055%201283%200%2022%202%2039%205%2039%202%200%202%20-246%20-1%20-547z%20m-92%20-184%20c-2%20-35%20-9%20-212%20-18%20-393%20-8%20-181%20-13%20-335%20-10%20-342%203%20-8%2014%20-14%2025%20-14%2011%200%2023%20-5%2026%20-10%203%20-6%203%20-86%20-1%20-179%20l-7%20-170%20-26%20-3%20c-20%20-2%20-26%20-9%20-26%20-28%200%20-20%206%20-26%2026%20-28%2023%20-3%2027%20-9%2033%20-49%203%20-25%206%20-106%206%20-179%200%20-122%20-2%20-134%20-18%20-134%20-25%200%20-42%20-19%20-42%20-47%200%20-13%2017%20-74%2038%20-136%20l37%20-112%202%20-224%202%20-224%20-65%206%20c-265%2025%20-481%20166%20-549%20357%20-48%20135%20-40%20277%2027%20474%2029%2089%2039%20132%2036%20167%20l-3%2047%2042%205%20c121%2013%20192%20135%20194%20332%202%20125%20-25%20181%20-96%20205%20l-31%2010%20-14%20120%20c-33%20302%2027%20413%20310%20572%2047%2026%2089%2047%2094%2045%205%20-2%209%20-32%208%20-68z%20m432%20-18%20c102%20-59%20175%20-130%20212%20-206%2027%20-56%2029%20-68%2029%20-180%200%20-66%20-3%20-152%20-5%20-192%20l-5%20-71%20-46%20-19%20c-63%20-27%20-89%20-80%20-89%20-186%200%20-129%2035%20-241%2092%20-294%2029%20-27%2089%20-53%20123%20-53%2024%200%2025%20-3%2025%20-59%200%20-41%2012%20-93%2041%20-182%2089%20-268%2057%20-475%20-97%20-626%20-103%20-101%20-239%20-158%20-430%20-179%20l-62%20-6%20-7%20107%20c-4%2060%20-5%20160%20-3%20224%205%2099%2011%20133%2042%20227%2045%20135%2045%20177%202%20182%20l-29%204%207%2090%20c3%2050%206%20131%206%20179%20l0%2088%2028%203%20c21%202%2028%209%2030%2031%203%2024%200%2027%20-27%2027%20l-31%200%200%20180%200%20180%2025%200%20c25%200%2025%201%2025%2083%200%2045%20-7%20222%20-15%20392%20-8%20171%20-15%20318%20-15%20327%200%2015%204%2015%2048%20-4%2026%20-11%2083%20-41%20126%20-67z%20m-344%20-911%20c0%20-173%20-1%20-180%20-20%20-180%20-19%200%20-20%207%20-20%20180%200%20173%201%20180%2020%20180%2019%200%2020%20-7%2020%20-180z%20m60%200%20c0%20-173%20-1%20-180%20-20%20-180%20-19%200%20-20%207%20-20%20180%200%20173%201%20180%2020%20180%2019%200%2020%20-7%2020%20-180z%20m60%200%20c0%20-153%20-2%20-180%20-15%20-180%20-13%200%20-15%2027%20-15%20180%200%20153%202%20180%2015%20180%2013%200%2015%20-27%2015%20-180z%20m-120%20-421%20c0%20-140%20-3%20-180%20-12%20-177%20-15%205%20-25%20101%20-27%20256%20-1%2096%200%20102%2019%20102%2019%200%2020%20-7%2020%20-181z%20m60%201%20c0%20-145%20-3%20-180%20-14%20-180%20-15%200%20-26%20106%20-26%20263%200%2090%201%2097%2020%2097%2019%200%2020%20-7%2020%20-180z%20m63%208%20c-5%20-162%20-12%20-206%20-30%20-183%20-5%206%20-7%2088%20-5%20183%203%20159%205%20172%2022%20172%2017%200%2017%20-10%2013%20-172z%20m-14%20-356%20l-33%20-97%20-4%20-242%20c-3%20-207%20-6%20-242%20-19%20-247%20-9%20-4%20-22%20-1%20-30%205%20-11%2010%20-13%2042%20-7%20183%207%20192%20-6%20300%20-51%20419%20-14%2037%20-25%2072%20-25%2077%200%2011%20194%2018%20198%207%202%20-4%20-11%20-51%20-29%20-105z'/%3e%3cpath%20d='M2301%202244%20c-36%20-26%20-52%20-78%20-66%20-222%20-15%20-147%20-35%20-205%20-73%20-210%20-20%20-3%20-21%20-1%20-11%2022%209%2020%209%2029%20-1%2041%20-27%2032%20-70%2011%20-70%20-34%200%20-46%2034%20-71%2093%20-71%2073%200%20106%2073%20118%20261%208%20126%2021%20189%2040%20189%204%200%209%20-10%2011%20-22%202%20-18%2010%20-23%2033%20-23%2024%200%2031%205%2033%2023%208%2052%20-58%2080%20-107%2046z'/%3e%3cpath%20d='M2732%202244%20c-30%20-21%20-29%20-61%203%20-76%2032%20-15%2059%205%2050%2039%20-7%2030%200%2029%2020%20-1%2012%20-17%2019%20-65%2025%20-163%2010%20-161%2021%20-206%2060%20-245%2033%20-32%2091%20-38%20128%20-12%2025%2017%2031%2071%2010%2092%20-32%2032%20-80%20-8%20-58%20-48%208%20-15%208%20-20%20-2%20-20%20-44%201%20-67%2064%20-79%20214%20-10%20131%20-29%20198%20-62%20221%20-28%2019%20-67%2019%20-95%20-1z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M1492%204328%20c-5%20-7%20-13%20-23%20-16%20-35%20-9%20-28%20-15%20-28%20-146%20-1%20-144%2029%20-431%2032%20-502%205%20-72%20-28%20-94%20-76%20-63%20-136%2040%20-79%20215%20-180%20426%20-247%2062%20-20%20117%20-40%20122%20-43%204%20-4%20-31%20-44%20-77%20-89%20-59%20-58%20-89%20-80%20-100%20-76%20-43%2016%20-106%20-42%20-106%20-98%200%20-16%20-33%20-56%20-110%20-133%20-78%20-77%20-110%20-116%20-108%20-130%205%20-37%2036%20-20%20147%2085%2062%2058%20116%20107%20122%20108%206%203%208%20-105%207%20-290%20l-3%20-293%20-76%20-3%20c-65%20-2%20-81%20-7%20-103%20-27%20-37%20-34%20-43%20-70%20-17%20-105%2021%20-29%2021%20-37%2021%20-436%200%20-391%20-1%20-407%20-20%20-431%20-27%20-34%20-25%20-66%204%20-100%2022%20-26%2032%20-28%20108%20-33%20l83%20-5%203%20-103%203%20-103%20-34%20-42%20c-30%20-36%20-132%20-178%20-321%20-444%20-28%20-40%20-60%20-74%20-71%20-77%20-21%20-6%20-95%20-112%20-95%20-137%200%20-43%2073%20-54%20107%20-16%2029%2031%2074%20113%2067%20120%20-3%203%2025%2049%2063%20103%2037%2054%2071%20102%2074%20107%204%205%2055%20-27%20114%20-72%2060%20-44%20114%20-81%20122%20-81%207%200%2060%2034%20118%2077%2062%2044%20110%2072%20115%2067%2035%20-36%20150%20-203%20150%20-218%200%20-31%2038%20-83%2074%20-100%2041%20-20%2086%20-8%2086%2023%200%2021%20-74%20121%20-90%20121%20-5%200%20-104%20127%20-220%20282%20l-211%20283%203%20105%203%20105%20233%203%20232%202%200%20-102%20c0%20-194%2053%20-367%20162%20-529%20l58%20-86%20-32%20-59%20c-17%20-33%20-41%20-70%20-53%20-84%20-38%20-42%20-77%20-118%20-73%20-142%204%20-32%2049%20-55%2085%20-43%2033%2012%2092%20113%2093%20158%200%2015%209%2046%2020%2067%20l20%2040%2067%20-55%20c84%20-69%20213%20-136%20329%20-171%2074%20-22%20114%20-27%20239%20-31%20136%20-4%20159%20-2%20248%2021%20116%2030%20220%2078%20305%20141%2034%2025%2072%2045%2085%2045%2013%200%2028%205%2034%2011%2016%2016%2048%20-38%2033%20-56%20-17%20-20%2063%20-163%2096%20-171%2037%20-9%2073%204%2086%2030%209%2021%205%2035%20-28%2097%20-22%2039%20-46%2074%20-55%2076%20-17%205%20-73%20110%20-61%20116%204%203%2044%20-20%2090%20-50%20l82%20-55%2033%2019%20c17%2011%2058%2036%2089%2056%2053%2035%2058%2036%2067%2019%208%20-15%201%20-36%20-29%20-94%20-44%20-84%20-42%20-103%2017%20-114%2025%20-5%2037%20-1%2056%2018%2013%2013%2027%2031%2030%2039%204%2010%2012%206%2032%20-19%2027%20-33%2061%20-42%2083%20-20%2019%2019%2015%2032%20-37%2099%20l-49%2062%2062%20128%20c33%2070%2066%20128%2071%20128%206%200%2051%20-20%20100%20-44%2050%20-25%2093%20-45%2096%20-45%203%200%2045%2023%2093%2050%2048%2028%2091%2050%2096%2050%2016%200%20152%20-281%20146%20-303%20-8%20-33%2049%20-135%2080%20-143%2038%20-10%2078%207%2082%2034%204%2026%20-38%20104%20-77%20144%20-14%2014%20-53%2079%20-85%20145%20-33%2065%20-115%20224%20-183%20353%20l-123%20234%200%20237%20c0%20228%201%20237%2020%20242%2015%204%2020%2014%2020%2042%200%2028%20-5%2038%20-20%2042%20-19%205%20-20%2014%20-20%20315%20l0%20309%2033%2033%20c40%2041%20147%2080%20277%20101%20136%2023%20162%2032%20158%2058%20l-3%2022%20-495%200%20-495%200%20-3%20-22%20c-4%20-29%2017%20-37%20146%20-59%20145%20-24%20245%20-59%20287%20-98%20l35%20-33%200%20-306%20c0%20-296%20-1%20-307%20-20%20-317%20-14%20-8%20-20%20-21%20-20%20-45%200%20-24%206%20-37%2020%20-45%2019%20-10%2020%20-21%2020%20-247%20l0%20-236%20-71%20-135%20c-92%20-174%20-244%20-480%20-253%20-509%20-4%20-13%20-11%20-23%20-16%20-23%20-5%200%20-54%2059%20-110%20131%20l-100%20131%200%20359%20c0%20197%204%20359%208%20359%205%200%2050%2031%20101%2070%20l92%2070%2078%200%20c64%200%2083%204%20105%2021%2028%2022%2035%2064%2015%20101%20-14%2025%20-12%20249%202%20263%205%205%209%2028%209%2051%200%2034%20-5%2047%20-26%2063%20-26%2020%20-37%2021%20-448%2021%20-506%200%20-472%208%20-462%20-113%206%20-74%205%20-79%20-11%20-72%20-79%2034%20-190%2065%20-253%2072%20l-75%208%200%20207%20c0%20145%204%20211%2012%20219%2015%2015%2032%20-41%2040%20-136%203%20-41%2012%20-77%2021%20-88%2027%20-31%20107%20-47%20240%20-47%20235%200%20516%2078%20568%20158%2016%2024%2016%2030%200%2091%20-26%20104%20-67%20368%20-71%20456%20-3%2071%20-7%2083%20-29%20102%20-66%2057%20-357%2041%20-614%20-33%20-95%20-27%20-152%20-59%20-179%20-100%20-16%20-25%20-16%20-31%200%20-108%2022%20-103%2021%20-128%20-2%20-174%20-33%20-67%20-42%20-135%20-44%20-338%20-2%20-169%20-4%20-199%20-17%20-199%20-13%200%20-16%2034%20-21%20225%20-5%20223%20-11%20262%20-50%20357%20-11%2027%20-11%2045%201%20110%2020%20112%2018%20123%20-29%20164%20-81%2072%20-326%20129%20-556%20129%20-202%200%20-224%20-14%20-236%20-147%20-4%20-49%20-23%20-173%20-43%20-278%20-19%20-104%20-37%20-206%20-39%20-225%20l-3%20-34%20-210%20-1%20-209%200%20-3%20290%20-2%20291%2030%2029%20c22%2021%2030%2038%2030%2065%200%2036%2018%2058%20162%20189%20l37%2034%20118%20-24%20c98%20-20%20148%20-24%20293%20-24%20158%200%20179%202%20222%2022%2097%2045%2098%20105%201%20193%20-70%2064%20-246%20152%20-392%20195%20l-106%2032%200%2034%20c0%2035%20-10%2059%20-24%2059%20-5%200%20-13%20-6%20-19%20-12z%20m-213%20-88%20c234%20-38%20429%20-97%20584%20-177%2089%20-46%20187%20-124%20187%20-149%200%20-45%20-159%20-71%20-336%20-54%20-116%2010%20-263%2037%20-276%2049%20-7%206%2025%20138%2037%20149%203%203%2025%20-4%2049%20-16%2038%20-18%2046%20-19%2056%20-6%2018%2020%201%2036%20-69%2068%20-68%2030%20-213%2048%20-225%2027%20-12%20-19%2014%20-41%2048%20-41%2049%200%2076%20-11%2076%20-29%200%20-10%20-9%20-45%20-21%20-79%20-24%20-72%20-8%20-71%20-192%20-11%20-145%2048%20-286%20119%20-344%20174%20-59%2057%20-55%2084%2014%20105%2055%2016%20283%2011%20412%20-10z%20m-134%20-614%20c0%20-30%20-31%20-44%20-51%20-24%20-15%2014%20-15%2020%20-4%2033%2018%2021%2055%2015%2055%20-9z%20m985%20-62%20c110%20-20%20248%20-68%20277%20-96%2031%20-29%2024%20-32%20-26%20-7%20-23%2011%20-100%2034%20-169%2051%20-112%2027%20-149%2031%20-307%2034%20-99%202%20-184%204%20-189%204%20-20%200%2014%2023%2046%2031%2048%2012%20269%202%20368%20-17z%20m1213%2010%20c9%20-3%2017%20-11%2017%20-17%200%20-9%20-48%20-12%20-178%20-12%20-167%20-1%20-184%20-2%20-307%20-34%20-71%20-18%20-151%20-44%20-177%20-57%20-52%20-26%20-64%20-18%20-22%2015%2055%2043%20283%20101%20454%20114%2050%204%20185%20-2%20213%20-9z%20m-1567%20-129%20c-5%20-45%20-3%20-57%209%20-61%2025%20-10%2042%2013%2048%2062%202%2025%207%2048%2011%2051%208%208%20258%20-15%20267%20-25%204%20-4%204%20-28%200%20-53%20-9%20-55%20-5%20-69%2019%20-69%2019%200%2024%2010%2035%2073%207%2044%200%2044%20130%206%20105%20-30%20115%20-42%20107%20-109%20-7%20-54%20-8%20-55%20-37%20-51%20-17%203%20-46%205%20-65%205%20l-35%201%20-14%20-68%20c-17%20-80%20-17%20-80%2067%20-98%2029%20-7%2055%20-15%2057%20-19%202%20-3%20-1%20-37%20-8%20-74%20-9%20-53%20-14%20-66%20-27%20-62%20-8%203%20-60%2021%20-115%2040%20l-100%2034%200%2059%20c0%2055%20-1%2058%20-25%2058%20-22%200%20-26%20-5%20-32%20-48%20-4%20-27%20-9%20-51%20-11%20-54%20-3%20-2%20-31%200%20-63%206%20-33%205%20-94%2013%20-137%2016%20l-78%207%203%2046%20c3%2042%201%2047%20-19%2050%20-17%203%20-24%20-3%20-29%20-25%20-16%20-74%20-19%20-78%20-58%20-81%20-37%20-3%20-38%20-2%20-32%2025%203%2015%2017%2093%2031%20173%2015%2080%2029%20163%2033%20185%207%2037%2021%2049%2066%2054%205%201%206%20-24%202%20-54z%20m1469%200%20c8%20-41%2014%20-51%2034%20-53%2023%20-4%2024%20-2%2018%2047%20l-6%2051%2034%200%20c41%200%2035%2018%2070%20-215%2014%20-93%2028%20-180%2032%20-193%205%20-21%203%20-22%20-23%20-17%20-51%2012%20-54%2014%20-54%2042%200%2052%20-11%2074%20-34%2071%20-19%20-3%20-21%20-8%20-18%20-50%20l4%20-46%20-79%20-7%20c-43%20-3%20-105%20-10%20-138%20-14%20-33%20-5%20-63%20-7%20-67%20-4%20-5%202%20-8%2016%20-8%2031%200%2051%20-11%2073%20-34%2070%20-19%20-3%20-21%20-10%20-21%20-61%20l0%20-59%20-83%20-24%20c-46%20-13%20-97%20-31%20-114%20-40%20-16%20-8%20-32%20-13%20-35%20-10%20-7%206%20-22%2083%20-23%20112%200%2018%209%2023%2059%2034%2088%2018%2087%2017%2070%2097%20l-14%2068%20-35%200%20c-19%20-1%20-49%20-4%20-67%20-9%20l-31%20-7%20-8%2057%20c-6%2049%20-4%2059%2012%2071%2020%2015%20120%2048%20177%2058%2035%207%2036%206%2042%20-32%2012%20-67%2015%20-74%2038%20-71%2024%203%2025%2014%2014%2085%20-7%2040%20-6%2042%2023%2048%2053%2012%20163%2023%20210%2021%20l44%20-1%2011%20-50z%20m-867%20-235%20c18%200%2022%20-6%2022%20-28%200%20-38%20-5%20-42%20-48%20-30%20-47%2013%20-56%2021%20-47%2048%205%2016%2012%2020%2028%2016%2012%20-3%2032%20-6%2045%20-6z%20m402%20-19%20c0%20-26%20-4%20-29%20-46%20-36%20-52%20-7%20-53%20-7%20-56%2025%20-3%2025%2019%2037%2075%2039%2023%201%2027%20-3%2027%20-28z%20m1479%20-55%20c-2%20-3%20-48%20-18%20-101%20-36%20l-97%20-31%20-102%2031%20c-57%2017%20-105%2032%20-107%2035%20-3%203%2088%205%20203%205%20115%200%20206%20-2%20204%20-4z%20m-1791%20-294%20l-3%20-196%20-88%20-13%20c-97%20-14%20-228%20-62%20-319%20-118%20-31%20-19%20-59%20-35%20-62%20-35%20-4%200%20-5%2070%20-4%20155%20l3%20156%20160%202%20c138%202%20165%205%20199%2022%2022%2011%2043%2027%2047%2035%204%208%2012%2055%2019%20104%2013%20102%2016%20112%2036%2095%2012%20-10%2014%20-47%2012%20-207z%20m965%20163%20c10%20-4%2016%20-13%2015%20-19%20-7%20-22%20-116%20-67%20-228%20-93%20-101%20-23%20-137%20-27%20-292%20-27%20-132%20-1%20-180%202%20-190%2012%20-16%2016%20-7%2022%2092%2061%2080%2031%20187%2056%20310%2071%2081%209%20264%206%20293%20-5z%20m-1398%20-21%20c96%20-16%20255%20-65%20294%20-91%2042%20-27%2010%20-38%20-130%20-42%20-144%20-3%20-246%208%20-386%2045%20-148%2038%20-224%2085%20-160%2099%2079%2017%20241%2013%20382%20-11z%20m-945%20-104%20c0%20-18%20-7%20-20%20-80%20-20%20-44%200%20-80%204%20-80%208%200%2022%2029%2032%2092%2032%2061%200%2068%20-2%2068%20-20z%20m585%200%20l40%20-19%20-287%200%20c-282%20-1%20-288%20-1%20-288%2019%200%2019%206%2020%20248%2019%20218%200%20252%20-3%20287%20-19z%20m-653%20-142%20c3%20-57%205%20-63%2026%20-66%2021%20-3%2022%200%2022%2062%200%2037%204%2066%2010%2066%207%200%2010%20-145%2010%20-415%200%20-255%20-4%20-415%20-10%20-415%20-5%200%20-10%2026%20-12%2058%20-3%2049%20-6%2057%20-23%2057%20-17%200%20-21%20-8%20-25%20-60%20-5%20-56%20-7%20-60%20-30%20-60%20l-25%200%20-3%20418%20-2%20417%2029%200%20c30%200%2030%20-1%2033%20-62z%20m400%205%20c3%20-54%205%20-58%2028%20-58%2023%200%2025%204%2028%2058%20l3%2057%20169%200%20169%200%203%20-62%20c3%20-57%205%20-63%2026%20-66%2021%20-3%2022%200%2022%2062%20l0%2066%2035%200%2035%200%200%20-185%200%20-185%20-84%20-90%20c-68%20-73%20-94%20-111%20-135%20-193%20-27%20-56%20-55%20-121%20-62%20-144%20l-12%20-43%20-84%200%20-83%200%200%2049%20c0%2032%20-5%2053%20-15%2061%20-24%2020%20-40%20-3%20-40%20-58%20l0%20-47%20-140%200%20-140%200%20-3%20418%20-2%20417%20139%200%20140%200%203%20-57z%20m2406%20-70%20c-3%20-17%20-31%20-18%20-401%20-20%20-219%20-1%20-405%201%20-413%204%20-8%203%20-14%2011%20-14%2019%200%2012%2067%2014%20416%2014%20390%200%20415%20-1%20412%20-17z%20m-20%20-185%20l3%20-108%20-306%200%20-305%200%20-37%2033%20c-21%2019%20-63%2052%20-95%2075%20-57%2042%20-58%2045%20-43%2097%202%208%20128%2011%20391%2010%20l389%200%203%20-107z%20m-1036%2073%20c328%20-84%20585%20-375%20639%20-724%2022%20-142%20-3%20-336%20-61%20-472%20-33%20-78%20-128%20-214%20-197%20-283%20-115%20-114%20-278%20-203%20-430%20-232%20-40%20-8%20-115%20-11%20-210%20-8%20-130%205%20-159%209%20-241%2036%20-225%2074%20-419%20247%20-523%20467%20-62%20133%20-73%20188%20-73%20370%200%20145%203%20168%2027%20248%2049%20158%20116%20268%20234%20384%20132%20129%20280%20200%20493%20237%2059%2010%20268%20-4%20342%20-23z%20m1056%20-253%20c3%20-17%20-15%20-18%20-270%20-18%20-269%200%20-298%203%20-298%2032%200%205%20127%207%20282%206%20260%20-3%20283%20-4%20286%20-20z%20m-258%20-88%20c0%20-5%20-4%20-10%20-9%20-10%20-4%200%20-25%20-13%20-46%20-30%20-31%20-25%20-47%20-30%20-89%20-30%20-47%200%20-53%203%20-73%2035%20-13%2019%20-23%2037%20-23%2040%200%203%2054%205%20120%205%2073%200%20120%20-4%20120%20-10z%20m-2485%20-330%20c0%20-19%20-119%20-27%20-141%20-9%20-25%2021%20-3%2030%2069%2027%2056%20-2%2072%20-6%2072%20-18z%20m538%2014%20c3%20-3%203%20-12%200%20-20%20-4%20-11%20-48%20-14%20-238%20-14%20-225%200%20-256%204%20-240%2030%207%2011%20467%2015%20478%204z%20m2542%20-374%20c36%20-71%2065%20-136%2065%20-143%200%20-10%20-117%20-77%20-135%20-77%20-3%200%20-5%2079%20-5%20175%200%2096%202%20175%205%20175%203%200%2034%20-58%2070%20-130z%20m-135%20-60%20c0%20-103%20-4%20-160%20-10%20-160%20-18%200%20-132%2061%20-128%2068%202%204%2031%2062%2063%20129%2033%2067%2063%20122%2068%20123%204%200%207%20-72%207%20-160z%20m-2940%20-135%20c-1%20-91%20-5%20-165%20-9%20-165%20-14%200%20-146%20102%20-146%20113%200%2015%20137%20216%20148%20217%204%200%207%20-74%207%20-165z%20m133%2060%20c37%20-51%2070%20-100%2073%20-108%205%20-15%20-134%20-129%20-148%20-120%20-10%206%20-10%20323%200%20323%204%20-1%2037%20-43%2075%20-95z%20m2187%20-200%20l0%20-115%20-54%2036%20-54%2036%2050%2079%20c28%2043%2052%2079%2054%2079%202%200%204%20-52%204%20-115z%20m115%2017%20c22%20-31%2041%20-59%2043%20-63%203%20-7%20-73%20-59%20-88%20-59%20-6%200%20-10%2035%20-10%2090%200%2050%203%2090%208%2090%204%20-1%2025%20-26%2047%20-58z%20m130%20-252%20c-9%20-16%20-18%20-30%20-21%20-30%20-2%200%202%2014%2011%2030%209%2017%2018%2030%2021%2030%202%200%20-2%20-13%20-11%20-30z%20m-2995%20-11%20c-12%20-16%20-24%20-28%20-27%20-25%20-7%206%2027%2056%2039%2056%205%200%200%20-14%20-12%20-31z%20m3825%2010%20c10%20-30%200%20-33%20-13%20-4%20-6%2014%20-7%2025%20-2%2025%205%200%2012%20-9%2015%20-21z%20m-2895%20-10%20c0%20-6%20-4%20-7%20-10%20-4%20-5%203%20-10%2011%20-10%2016%200%206%205%207%2010%204%206%20-3%2010%20-11%2010%20-16z%20m169%20-93%20c-7%20-14%20-16%20-26%20-21%20-26%20-5%200%20-1%2014%207%2031%2020%2037%2031%2033%2014%20-5z%20m1591%20-20%20c0%20-6%20-7%20-2%20-15%208%20-8%2011%20-15%2025%20-15%2030%200%206%207%202%2015%20-8%208%20-11%2015%20-25%2015%20-30z'/%3e%3cpath%20d='M2342%202506%20c-270%20-72%20-489%20-279%20-578%20-546%20-26%20-79%20-28%20-96%20-28%20-245%200%20-143%203%20-169%2025%20-241%2067%20-216%20241%20-412%20454%20-510%2042%20-19%20109%20-42%20148%20-51%2089%20-19%20282%20-22%20362%20-4%20232%2050%20454%20234%20559%20463%2047%20100%2066%20183%2072%20302%2020%20379%20-217%20714%20-581%20822%20-135%2039%20-306%2043%20-433%2010z%20m295%20-36%20c323%20-42%20585%20-284%20649%20-600%2012%20-63%2015%20-112%2011%20-194%20-6%20-132%20-23%20-198%20-77%20-308%20-79%20-160%20-184%20-265%20-345%20-344%20-356%20-175%20-796%20-36%20-991%20312%20-79%20141%20-114%20312%20-95%20458%2041%20303%20231%20542%20511%20640%20119%2042%20214%2052%20337%2036z'/%3e%3cpath%20d='M2725%201618%20c-90%20-53%20-129%20-171%20-90%20-273%2020%20-54%2094%20-122%20142%20-131%20145%20-27%20266%2058%20280%20198%204%2045%201%2061%20-24%20108%20-18%2034%20-45%2066%20-72%2085%20-37%2026%20-53%2030%20-119%2033%20-65%202%20-83%20-1%20-117%20-20z%20m182%20-49%20c53%20-26%2084%20-68%2090%20-124%2010%20-86%20-35%20-153%20-119%20-176%20-56%20-15%20-101%20-4%20-145%2034%20-65%2057%20-79%20127%20-42%20204%2038%2078%20129%20104%20216%2062z'/%3e%3cpath%20d='M4037%203744%20c-4%20-4%20-7%20-67%20-7%20-139%20l0%20-131%20-44%20-46%20c-50%20-52%20-66%20-59%20-233%20-92%20-157%20-32%20-196%20-48%20-191%20-78%20l3%20-23%20475%20-3%20c261%20-1%20485%200%20498%203%2031%208%2028%2041%20-5%2059%20-16%207%20-66%2021%20-113%2031%20-311%2061%20-322%2071%20-330%20285%20-5%20126%20-6%20135%20-25%20138%20-12%202%20-24%200%20-28%20-4z%20m78%20-400%20c21%20-8%2076%20-24%20122%20-34%2047%20-10%2088%20-21%2091%20-25%204%20-3%20-114%20-5%20-262%20-4%20-252%202%20-299%207%20-200%2024%2023%203%2075%2017%20115%2030%2089%2029%2087%2029%20134%209z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4285%204494%20c-16%20-8%20-100%20-84%20-185%20-168%20-143%20-141%20-158%20-154%20-192%20-155%20-21%200%20-50%20-7%20-65%20-15%20-46%20-23%20-235%20-199%20-331%20-305%20-89%20-100%20-105%20-130%20-91%20-168%206%20-18%20-13%20-40%20-124%20-145%20-72%20-67%20-205%20-197%20-295%20-288%20l-164%20-164%20-39%2022%20c-21%2012%20-49%2022%20-62%2022%20-19%200%20-116%20-90%20-408%20-377%20-212%20-208%20-536%20-526%20-722%20-707%20-192%20-187%20-340%20-339%20-343%20-353%20-4%20-16%202%20-36%2019%20-62%20l26%20-38%20-44%20-43%20c-42%20-42%20-47%20-43%20-99%20-41%20-64%202%20-101%20-14%20-141%20-60%20-23%20-28%20-26%20-40%20-24%20-88%205%20-82%20-9%20-100%20-74%20-98%20-60%201%20-107%20-21%20-141%20-66%20-16%20-22%20-20%20-41%20-19%20-88%20l1%20-60%20-88%20-75%20c-49%20-41%20-91%20-82%20-94%20-90%20-21%20-55%206%20-109%2099%20-200%2077%20-76%20122%20-94%20164%20-67%2016%2010%20305%20291%20643%20624%20l614%20606%20104%200%20c151%20-1%20209%2033%20210%20121%200%2035%20-6%2049%20-30%2074%20l-30%2030%2033%2037%20c50%2055%20992%20984%201697%201675%20438%20430%20448%20439%20456%20469%2015%2063%20-73%20190%20-166%20237%20-47%2024%20-56%2024%20-95%204z%20m95%20-88%20c71%20-56%20120%20-143%2090%20-161%20-6%20-3%20-49%2033%20-98%2080%20-83%2082%20-86%2087%20-68%20101%2027%2019%2027%2019%2076%20-20z%20m-41%20-112%20c45%20-42%2081%20-80%2081%20-85%200%20-5%20-71%20-77%20-157%20-161%20-87%20-84%20-339%20-332%20-560%20-551%20l-402%20-400%20-54%2059%20c-109%20118%20-111%20121%20-94%20148%2024%2036%20318%20311%20331%20309%206%20-1%2038%20-7%2070%20-13%20131%20-26%20198%203%20337%20146%2092%2094%20109%20117%20123%20163%2019%2066%2020%20133%201%20185%20l-13%2038%20115%20119%20c64%2065%20122%20119%20129%20119%207%200%2049%20-34%2093%20-76z%20m-395%20-206%20c20%20-29%2021%20-136%202%20-183%20-19%20-45%20-171%20-202%20-220%20-227%20-75%20-39%20-235%20-22%20-244%2025%20-4%2020%20178%20212%20321%20338%2084%2075%20115%2085%20141%2047z%20m-813%20-881%20c20%20-17%2058%20-56%2085%20-85%2045%20-50%2046%20-54%2031%20-70%20-16%20-16%20-23%20-11%20-104%2070%20-74%2075%20-85%2089%20-74%20102%2018%2021%2020%2021%2062%20-17z%20m-18%20-118%20c42%20-39%2077%20-76%2077%20-83%200%20-6%20-211%20-222%20-470%20-479%20-578%20-575%20-542%20-552%20-665%20-428%20-43%2044%20-56%2064%20-48%2072%208%208%2022%20-1%2051%20-33%2037%20-40%2044%20-43%2091%20-43%2043%200%2055%204%2085%2034%2068%2066%2072%20149%209%20209%20-25%2023%20-33%2036%20-25%2044%207%207%2021%20-2%2044%20-28%2030%20-32%2041%20-38%2089%20-41%2066%20-5%20107%2017%20132%2070%2030%2062%2014%20134%20-36%20174%20-18%2014%20-23%2023%20-15%2031%207%207%2021%20-1%2048%20-29%2034%20-36%2041%20-39%2090%20-39%20100%200%20146%2053%20138%20157%20-4%2048%20-10%2061%20-38%2086%20l-33%2029%20184%20184%20c101%20101%20191%20184%20200%20184%208%200%2050%20-32%2092%20-71z%20m-345%20-49%20c3%20-18%20-20%20-47%20-109%20-136%20-74%20-75%20-117%20-110%20-123%20-104%20-6%206%20-18%2010%20-28%2010%20-10%200%20-18%204%20-18%208%200%2016%20250%20254%20262%20250%207%20-3%2015%20-15%2016%20-28z%20m-273%20-270%20c3%20-5%201%20-10%20-4%20-10%20-6%200%20-11%205%20-11%2010%200%206%202%2010%204%2010%203%200%208%20-4%2011%20-10z%20m-46%20-55%20c1%20-12%20-23%20-44%20-58%20-79%20-54%20-53%20-60%20-57%20-80%20-44%20-11%207%20-21%2017%20-21%2023%200%205%2033%2042%2072%2082%2075%2076%2085%2078%2087%2018z%20m181%20-10%20c61%20-65%20-10%20-161%20-89%20-121%20-49%2026%20-54%2069%20-15%20115%2032%2039%2071%2041%20104%206z%20m-397%20-182%20c-6%20-48%20-11%20-54%20-91%20-126%20-20%20-19%20-22%20-18%20-71%2010%20-3%202%20159%20161%20166%20163%202%200%200%20-21%20-4%20-47z%20m162%20-9%20c8%20-4%2023%20-20%2031%20-36%2041%20-79%20-80%20-148%20-131%20-75%20-21%2030%20-19%2051%2011%2086%2025%2030%2054%2038%2089%2025z%20m-375%20-196%20c-1%20-22%20-11%20-45%20-31%20-68%20-26%20-30%20-36%20-35%20-74%20-35%20l-44%200%2067%2068%20c36%2037%2070%2067%2074%2067%205%200%208%20-15%208%20-32z%20m171%20-21%20c17%20-13%2039%20-50%2039%20-66%200%20-24%20-53%20-71%20-80%20-71%20-60%200%20-101%2067%20-67%20110%2035%2045%2072%2054%20108%2027z%20m-353%20-161%20c1%20-42%20-1%20-47%20-48%20-86%20-39%20-33%20-54%20-39%20-74%20-34%20-14%203%20-26%209%20-26%2012%200%205%20141%20152%20145%20152%200%200%202%20-20%203%20-44z%20m186%20-85%20l108%20-109%2052%2023%20c28%2012%2073%2027%20100%2034%2042%2010%2051%2010%2065%20-3%2025%20-26%203%20-68%20-44%20-84%20-51%20-18%20-136%20-9%20-178%2017%20-46%2028%20-235%20204%20-236%20219%20-2%2029%2031%205%20133%20-97z%20m-52%20-78%20c43%20-43%2077%20-82%2077%20-88%20-1%20-5%20-128%20-134%20-283%20-285%20-155%20-151%20-415%20-407%20-578%20-568%20-252%20-249%20-300%20-292%20-315%20-283%20-10%205%20-53%2045%20-96%2089%20l-79%2079%2056%2048%2056%2047%2034%20-16%20c19%20-9%2048%20-16%2064%20-16%2024%200%2031%20-5%2034%20-22%202%20-12%208%20-23%2013%20-25%2013%20-4%20445%20421%20445%20437%200%2020%20-39%2078%20-67%20100%20l-27%2021%2049%2049%2048%2049%2024%20-25%20c33%20-36%2089%20-57%20131%20-49%2074%2014%20112%2061%20112%20140%200%2049%20-10%2077%20-42%20111%20-17%2019%20-17%2022%20-3%2028%2011%204%2025%20-4%2040%20-23%2014%20-16%2043%20-33%2069%20-41%2039%20-11%2049%20-10%2083%206%2054%2027%2083%2075%2083%20138%200%2059%20-16%2096%20-47%20111%20l-22%2011%2027%2027%20c14%2015%2029%2027%2032%2027%202%200%2040%20-35%2082%20-77z%20m-342%20-41%20c0%20-31%20-7%20-45%20-42%20-79%20-58%20-56%20-82%20-67%20-108%20-51%20-19%2012%20-16%2017%2057%2090%2043%2043%2081%2078%2085%2078%205%200%208%20-17%208%20-38z%20m169%203%20c41%20-21%2057%20-65%2037%20-103%20-25%20-47%20-75%20-57%20-120%20-21%20-43%2034%20-34%2099%2019%20127%2026%2015%2031%2015%2064%20-3z%20m-369%20-172%20c0%20-5%20-7%20-17%20-15%20-27%20-8%20-11%20-15%20-30%20-15%20-41%200%20-12%20-9%20-30%20-19%20-39%20-18%20-16%20-20%20-16%20-35%206%20-15%2021%20-14%2024%2026%2065%2040%2041%2058%2052%2058%2036z%20m149%20-49%20c38%20-31%2042%20-83%2011%20-114%20-25%20-25%20-86%20-27%20-112%20-3%20-36%2032%20-15%20113%2036%20133%2031%2013%2032%2012%2065%20-16z%20m-388%20-293%20c33%20-33%2035%20-50%2014%20-90%20-35%20-68%20-136%20-51%20-151%2026%20-5%2027%20-1%2037%2024%2063%2039%2039%2074%2039%20113%201z%20m118%20-10%20c12%20-16%2021%20-33%2021%20-38%200%20-5%20-21%20-29%20-46%20-53%20l-46%20-45%2017%2034%20c12%2024%2016%2049%2013%2083%20-6%2057%209%2064%2041%2019z%20m-149%20-184%20c20%204%2013%20-7%20-40%20-61%20-35%20-36%20-68%20-66%20-72%20-66%20-4%200%20-8%2014%20-8%2031%200%2017%20-5%2039%20-11%2051%20-9%2016%20-7%2024%2011%2043%2019%2021%2024%2021%2058%209%2020%20-7%2048%20-10%2062%20-7z%20m-200%20-52%20c50%20-54%206%20-144%20-64%20-131%20-43%208%20-79%2051%20-71%2085%2017%2069%2090%2094%20135%2046z%20m-195%20-385%20c85%20-86%2088%20-90%2070%20-105%20-11%20-8%20-24%20-15%20-28%20-15%20-11%200%20-124%20108%20-149%20142%20-20%2029%20-17%2068%205%2068%207%200%2053%20-40%20102%20-90z'/%3e%3cpath%20d='M3724%203896%20c-78%20-78%20-9%20-171%2075%20-101%2037%2032%2057%2086%2041%20115%20-18%2034%20-75%2027%20-116%20-14z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4121%204495%20c-26%20-25%20-51%20-45%20-54%20-45%20-3%200%20-7%2012%20-9%2026%20-2%2015%20-12%2033%20-24%2041%20-18%2012%20-24%2011%20-47%20-8%20-48%20-37%20-25%20-105%2028%20-81%2043%2020%2037%20-5%20-15%20-60%20-41%20-44%20-49%20-49%20-50%20-32%200%2012%20-8%2032%20-18%2044%20-17%2022%20-19%2022%20-49%206%20-34%20-17%20-47%20-43%20-37%20-71%206%20-14%2015%20-16%2045%20-12%2022%203%2039%202%2039%20-1%200%20-4%20-21%20-28%20-47%20-54%20l-46%20-47%20-16%2032%20c-21%2041%20-56%2043%20-85%204%20-16%20-21%20-18%20-32%20-10%20-45%2014%20-21%2050%20-27%2070%20-11%2026%2021%2026%202%200%20-38%20-14%20-21%20-30%20-62%20-37%20-91%20-10%20-50%20-18%20-60%20-147%20-185%20-317%20-307%20-528%20-513%20-707%20-689%20l-190%20-187%20-85%2056%20c-179%20117%20-277%20149%20-436%20141%20-76%20-4%20-103%20-11%20-159%20-36%20-129%20-61%20-195%20-135%20-297%20-334%20-89%20-176%20-138%20-208%20-391%20-258%20-379%20-75%20-614%20-259%20-723%20-565%20-26%20-73%20-28%20-92%20-28%20-215%200%20-118%204%20-146%2028%20-225%2099%20-325%20442%20-712%20783%20-883%20336%20-169%20688%20-118%20919%20131%2036%2040%2086%20106%20110%20147%2041%2069%20104%20240%20119%20320%2021%20111%2061%20261%2080%20300%2035%2069%20108%20130%20235%20195%20224%20117%20330%20271%20330%20485%200%20130%20-39%20233%20-144%20385%20l-55%2080%20167%20170%20c92%2094%20319%20324%20503%20511%20310%20315%20339%20342%20377%20349%2023%204%2061%2020%2084%2036%2024%2016%2046%2029%2050%2029%203%200%204%20-18%201%20-39%20-4%20-32%20-2%20-41%2015%20-50%2017%20-9%2026%20-6%2051%2015%2017%2014%2031%2032%2031%2039%200%2022%20-29%2045%20-57%2045%20-13%200%20-23%204%20-21%209%202%204%2055%2053%20118%20109%20109%2095%20143%20115%20120%2071%20-15%20-27%204%20-59%2035%20-59%2027%200%2065%2032%2065%2054%200%2023%20-30%2047%20-50%2041%20-36%20-11%20-29%2014%2012%2049%2042%2035%2043%2036%2042%2098%200%2050%20-8%2081%20-38%20149%20-21%2048%20-48%2097%20-60%20109%20-30%2027%20-198%2090%20-243%2090%20-26%200%20-44%20-10%20-82%20-45z%20m193%20-45%20c44%20-16%2085%20-35%2092%20-42%2022%20-24%2077%20-163%2078%20-198%201%20-32%20-9%20-43%20-179%20-193%20-99%20-87%20-196%20-169%20-215%20-182%20-35%20-23%20-110%20-43%20-110%20-28%201%2013%2088%2078%20112%2083%2014%204%2024%2015%2026%2028%204%2024%2076%2088%20107%2094%2013%202%2020%2011%2020%2027%200%2026%2069%2091%2096%2091%2022%200%2043%2026%2035%2045%20-11%2030%20-38%2030%20-65%20-2%20-39%20-44%20-391%20-304%20-409%20-301%20-8%202%20-19%2010%20-25%2019%20-8%2013%203%2031%2052%2090%20121%20144%20146%20173%20187%20228%2023%2031%2054%2067%2068%2080%2031%2029%2033%2056%207%2071%20-15%207%20-23%206%20-35%20-6%20-9%20-8%20-16%20-21%20-16%20-28%200%20-15%20-70%20-84%20-101%20-100%20-13%20-6%20-25%20-20%20-27%20-31%20-5%20-25%20-60%20-84%20-89%20-96%20-13%20-5%20-23%20-17%20-23%20-28%200%20-17%20-76%20-91%20-93%20-91%20-7%200%2031%2099%2048%20123%208%2011%2087%20101%20176%20199%20113%20125%20168%20178%20183%20178%2011%200%2057%20-13%20100%20-30z%20m-534%20-230%20c0%20-5%20-5%20-10%20-11%20-10%20-5%200%20-7%205%20-4%2010%203%206%208%2010%2011%2010%202%200%204%20-4%204%20-10z%20m320%206%20c0%20-2%20-8%20-10%20-17%20-17%20-16%20-13%20-17%20-12%20-4%204%2013%2016%2021%2021%2021%2013z%20m250%20-56%20c0%20-5%20-5%20-10%20-11%20-10%20-5%200%20-7%205%20-4%2010%203%206%208%2010%2011%2010%202%200%204%20-4%204%20-10z%20m-350%20-65%20c-13%20-14%20-26%20-23%20-28%20-20%20-3%203%205%2016%2018%2030%2013%2014%2026%2023%2028%2020%203%20-3%20-5%20-16%20-18%20-30z%20m-70%20-82%20c-1%20-5%20-21%20-30%20-45%20-57%20-38%20-43%20-45%20-47%20-51%20-31%20-5%2013%203%2028%2034%2057%2039%2036%2063%2048%2062%2031z%20m210%20-38%20c-19%20-19%20-39%20-35%20-44%20-35%20-11%201%2062%2070%2073%2070%203%200%20-10%20-16%20-29%20-35z%20m-410%20-110%20c-27%20-27%20-46%20-41%20-49%20-33%20-4%2013%2065%2078%2083%2078%205%200%20-10%20-20%20-34%20-45z%20m310%2035%20c0%20-17%20-84%20-88%20-98%20-83%20-19%208%20-12%2017%2038%2057%2047%2037%2060%2042%2060%2026z%20m-272%20-76%20c-28%20-29%20-50%20-44%20-58%20-39%20-8%205%203%2023%2036%2056%2033%2033%2051%2046%2058%2039%207%20-7%20-5%20-25%20-36%20-56z%20m84%202%20c0%20-4%20-19%20-28%20-42%20-53%20-31%20-32%20-46%20-41%20-53%20-34%20-8%208%202%2024%2033%2056%2041%2042%2061%2052%2062%2031z%20m-242%20-71%20c-24%20-25%20-49%20-45%20-54%20-45%20-6%200%2010%2020%2034%2045%2024%2025%2049%2045%2054%2045%206%200%20-10%20-20%20-34%20-45z%20m290%2037%20c0%20-4%20-19%20-30%20-43%20-57%20-29%20-32%20-47%20-46%20-56%20-41%20-9%206%200%2022%2035%2057%2046%2047%2064%2058%2064%2041z%20m-210%20-35%20c0%20-21%20-87%20-100%20-100%20-92%20-8%205%204%2023%2036%2056%2050%2050%2064%2058%2064%2036z%20m240%20-15%20c0%20-14%20-79%20-86%20-87%20-79%20-4%204%2011%2025%2032%2047%2038%2039%2055%2049%2055%2032z%20m-190%20-33%20c0%20-12%20-90%20-98%20-102%20-99%20-20%20-1%20-4%2029%2039%2072%2043%2044%2063%2052%2063%2027z%20m-255%20-79%20c-28%20-28%20-51%20-46%20-53%20-41%20-4%2011%2078%2090%2093%2091%205%200%20-13%20-23%20-40%20-50z%20m295%2037%20c0%20-21%20-87%20-100%20-100%20-92%20-8%205%204%2023%2036%2056%2050%2050%2064%2058%2064%2036z%20m-214%20-28%20c3%20-6%20-14%20-32%20-40%20-57%20-36%20-37%20-48%20-44%20-58%20-34%20-9%209%20-3%2022%2032%2057%2047%2048%2055%2052%2066%2034z%20m205%20-62%20c-27%20-28%20-54%20-48%20-58%20-44%20-9%2010%2088%20108%20100%20100%205%20-3%20-14%20-28%20-42%20-56z%20m-197%20-38%20c-43%20-44%20-64%20-53%20-64%20-28%200%205%2019%2029%2042%2054%2033%2035%2045%2042%2055%2033%2011%20-9%205%20-20%20-33%20-59z%20m-208%20-27%20c-25%20-25%20-49%20-43%20-53%20-39%20-9%2010%2078%2098%2090%2090%205%20-3%20-11%20-26%20-37%20-51z%20m288%2040%20c6%20-10%20-78%20-102%20-94%20-102%20-21%200%20-9%2026%2032%2066%2046%2044%2054%2049%2062%2036z%20m-208%20-33%20c4%20-6%20-14%20-32%20-40%20-58%20-38%20-38%20-48%20-43%20-56%20-31%20-7%2011%201%2026%2032%2057%2045%2046%2053%2050%2064%2032z%20m203%20-65%20c-23%20-24%20-46%20-41%20-52%20-37%20-5%203%2013%2027%2039%2054%2027%2027%2050%2045%2053%2038%202%20-6%20-16%20-31%20-40%20-55z%20m-155%2018%20c3%20-5%20-17%20-30%20-44%20-57%20-43%20-43%20-50%20-46%20-56%20-30%20-6%2014%203%2028%2037%2057%2046%2040%2054%2044%2063%2030z%20m-204%20-30%20c0%20-17%20-88%20-94%20-95%20-83%20-4%207%2012%2028%2037%2051%2043%2039%2058%2047%2058%2032z%20m207%20-69%20c-35%20-35%20-50%20-44%20-58%20-36%20-8%208%201%2023%2037%2057%2033%2032%2051%2043%2058%2036%207%20-7%20-4%20-25%20-37%20-57z%20m-163%2029%20c3%20-5%20-15%20-28%20-39%20-52%20-35%20-34%20-48%20-41%20-57%20-32%20-9%209%20-3%2021%2027%2052%2038%2039%2059%2048%2069%2032z%20m236%20-19%20c-1%20-5%20-18%20-27%20-40%20-51%20-24%20-27%20-41%20-39%20-45%20-31%20-4%206%2010%2028%2031%2050%2036%2037%2054%2048%2054%2032z%20m-194%20-24%20c3%20-6%20-13%20-31%20-37%20-55%20-33%20-34%20-46%20-41%20-56%20-32%20-11%209%20-6%2019%2029%2055%2045%2045%2053%2050%2064%2032z%20m-242%20-80%20c-24%20-25%20-41%20-36%20-48%20-29%20-6%206%206%2023%2035%2049%2055%2049%2065%2033%2013%20-20z%20m286%2028%20c0%20-7%20-18%20-31%20-40%20-52%20-32%20-31%20-43%20-36%20-52%20-27%20-10%2010%20-4%2021%2027%2051%2042%2040%2065%2050%2065%2028z%20m-200%20-20%20c0%20-7%20-18%20-31%20-40%20-52%20-31%20-30%20-43%20-36%20-52%20-27%20-9%209%20-3%2021%2027%2052%2039%2040%2065%2051%2065%2027z%20m240%20-17%20c0%20-17%20-80%20-91%20-91%20-84%20-7%204%207%2024%2032%2050%2043%2044%2059%2053%2059%2034z%20m-231%20-76%20c-34%20-34%20-46%20-41%20-56%20-32%20-11%209%20-6%2019%2028%2054%2034%2034%2046%2041%2056%2032%2011%20-9%206%20-19%20-28%20-54z%20m-203%20-12%20c-19%20-20%20-39%20-33%20-42%20-29%20-10%2010%2057%2078%2069%2070%205%20-3%20-7%20-22%20-27%20-41z%20m280%2017%20c7%20-12%20-64%20-89%20-83%20-89%20-22%200%20-15%2016%2025%2059%2040%2043%2047%2047%2058%2030z%20m-201%20-19%20c3%20-6%20-9%20-26%20-28%20-47%20-25%20-26%20-40%20-34%20-53%20-29%20-15%206%20-12%2012%2021%2046%2041%2042%2050%2046%2060%2030z%20m245%20-27%20c0%20-13%20-74%20-83%20-87%20-83%20-21%200%20-15%2012%2024%2052%2034%2035%2063%2049%2063%2031z%20m-229%20-67%20c-32%20-32%20-43%20-38%20-53%20-28%20-18%2018%2060%2097%2079%2080%2012%20-9%207%20-19%20-26%20-52z%20m-721%204%20c61%20-24%20189%20-97%20233%20-132%20l28%20-23%20-149%20-152%20-149%20-151%20-84%201%20c-171%202%20-307%20-81%20-378%20-232%20-24%20-51%20-26%20-67%20-27%20-184%20l0%20-128%20-149%20-149%20c-83%20-83%20-155%20-150%20-161%20-150%20-6%200%20-50%2041%20-98%2090%20-61%2063%20-94%2090%20-111%2090%20-27%200%20-139%20-120%20-133%20-144%205%20-23%20617%20-646%20635%20-646%2019%200%20143%20119%20143%20138%200%207%20-46%2063%20-101%20123%20l-102%20109%20142%20149%20c77%2081%20147%20154%20155%20160%2010%209%2031%209%2086%200%20140%20-24%20270%2020%20363%20121%2075%2080%2099%20146%20103%20270%20l2%2095%20147%20153%20c81%2084%20153%20151%20159%20149%2016%20-5%2094%20-123%20131%20-200%2085%20-174%2064%20-365%20-55%20-500%20-43%20-48%20-110%20-93%20-252%20-170%20-160%20-87%20-210%20-159%20-254%20-362%20-73%20-338%20-142%20-488%20-289%20-623%20-165%20-151%20-403%20-204%20-628%20-138%20-203%2060%20-380%20179%20-592%20397%20-348%20359%20-444%20714%20-278%201031%20111%20213%20330%20347%20683%20417%20213%2043%20290%20103%20390%20304%2038%2077%2082%20147%20111%20180%2049%2055%20137%20109%20205%20127%2063%2015%20211%205%20274%20-20z%20m560%2022%20c0%20-5%20-13%20-21%20-29%20-36%20-40%20-38%20-62%20-24%20-25%2015%2026%2028%2054%2038%2054%2021z%20m210%20-67%20c-31%20-32%20-60%20-45%20-60%20-28%200%204%2017%2024%2037%2045%2025%2025%2040%2035%2047%2028%207%20-7%20-1%20-22%20-24%20-45z%20m-189%20-8%20c-20%20-20%20-35%20-28%20-47%20-23%20-15%206%20-13%2011%2016%2041%2026%2027%2036%2032%2047%2023%2012%20-9%209%20-17%20-16%20-41z%20m259%206%20c0%20-13%20-64%20-73%20-77%20-73%20-20%200%20-16%2011%2019%2047%2029%2030%2058%2043%2058%2026z%20m-190%20-15%20c0%20-16%20-51%20-68%20-67%20-68%20-21%200%20-15%2022%2014%2052%2028%2029%2053%2037%2053%2016z%20m-202%20-28%20c-20%20-27%20-48%20-41%20-48%20-23%200%2013%2043%2053%2057%2053%2010%200%207%20-9%20-9%20-30z%20m62%20-24%20c0%20-7%20-11%20-23%20-25%20-36%20-19%20-18%20-28%20-21%20-37%20-12%20-9%209%20-5%2019%2017%2042%2028%2029%2045%2031%2045%206z%20m180%202%20c0%20-16%20-41%20-58%20-57%20-58%20-19%200%20-16%208%2015%2045%2026%2031%2042%2036%2042%2013z%20m-310%20-41%20c0%20-20%20-37%20-50%20-50%20-42%20-8%205%20-4%2015%2011%2031%2025%2027%2039%2031%2039%2011z%20m176%202%20c3%20-6%20-6%20-24%20-22%20-40%20-21%20-22%20-30%20-26%20-41%20-17%20-11%209%20-9%2016%2013%2040%2030%2030%2039%2034%2050%2017z%20m178%203%20c3%20-5%20-10%20-23%20-28%20-41%20-43%20-41%20-61%20-23%20-20%2020%2029%2030%2039%2035%2048%2021z%20m-304%20-45%20c0%20-8%20-11%20-24%20-25%20-37%20-19%20-18%20-28%20-21%20-37%20-12%20-9%209%20-6%2018%2012%2037%2025%2027%2050%2033%2050%2012z%20m170%20-10%20c0%20-20%20-47%20-60%20-60%20-52%20-8%205%20-3%2016%2016%2036%2030%2032%2044%2036%2044%2016z%20m-300%20-25%20c0%20-14%20-39%20-46%20-47%20-39%20-3%204%202%2016%2012%2027%2019%2021%2035%2026%2035%2012z%20m160%20-47%20c-28%20-29%20-36%20-31%20-44%20-8%20-4%2010%202%2025%2016%2040%2019%2021%2024%2022%2037%208%2013%20-13%2012%20-17%20-9%20-40z%20m183%2038%20c8%20-7%20-41%20-63%20-55%20-63%20-15%200%20-8%2024%2014%2047%2023%2024%2030%2027%2041%2016z%20m-293%20-36%20c0%20-8%20-9%20-22%20-20%20-32%20-16%20-14%20-23%20-16%20-32%20-7%20-9%209%20-7%2016%207%2032%2021%2023%2045%2026%2045%207z%20m148%20-43%20c-37%20-38%20-58%20-21%20-22%2017%2019%2020%2031%2026%2038%2019%207%20-7%202%20-19%20-16%20-36z%20m-268%2013%20c0%20-20%20-37%20-50%20-50%20-42%20-8%205%20-4%2015%2011%2031%2025%2027%2039%2031%2039%2011z%20m146%20-46%20c-20%20-20%20-28%20-23%20-38%20-13%20-18%2018%2029%2067%2049%2050%2012%20-9%2010%20-16%20-11%20-37z%20m184%2021%20c0%20-16%20-32%20-52%20-46%20-52%20-19%200%20-18%2019%203%2042%2016%2018%2043%2025%2043%2010z%20m-284%20-13%20c3%20-6%20-5%20-23%20-20%20-38%20-22%20-22%20-28%20-24%20-36%20-11%20-6%2010%20-3%2021%2012%2037%2024%2026%2034%2028%2044%2012z%20m149%20-49%20c-17%20-19%20-45%20-27%20-45%20-13%200%204%2010%2017%2022%2030%2028%2030%2051%2014%2023%20-17z%20m-272%2013%20c8%20-7%20-21%20-43%20-35%20-43%20-12%200%20-10%2024%204%2038%2014%2014%2022%2015%2031%205z%20m173%20-15%20c4%20-6%20-3%20-19%20-16%20-30%20-42%20-34%20-69%20-15%20-33%2024%2018%2021%2039%2023%2049%206z%20m154%20-21%20c0%20-16%20-38%20-39%20-51%20-31%20-6%204%20-2%2015%2012%2030%2022%2023%2039%2024%2039%201z%20m-285%20-7%20c8%20-13%20-13%20-40%20-31%20-40%20-17%200%20-18%2022%20-2%2038%2015%2015%2025%2015%2033%202z%20m155%20-45%20c-16%20-17%20-27%20-22%20-34%20-15%20-6%206%20-2%2018%2014%2035%2016%2017%2027%2022%2034%2015%206%20-6%202%20-18%20-14%20-35z%20m-262%209%20c-4%20-21%20-44%20-48%20-52%20-36%20-8%2013%2022%2052%2040%2052%209%200%2014%20-7%2012%20-16z%20m162%20-18%20c0%20-20%20-28%20-39%20-46%20-32%20-15%206%20-14%209%206%2031%2023%2025%2040%2025%2040%201z%20m154%20-5%20c3%20-4%20-5%20-18%20-18%20-30%20-29%20-27%20-47%20-10%20-20%2020%2019%2021%2030%2024%2038%2010z%20m-269%20-12%20c8%20-12%20-23%20-49%20-42%20-49%20-18%200%20-16%2020%204%2042%2018%2021%2029%2023%2038%207z%20m-234%20-33%20c-14%20-15%20-39%20-26%20-67%20-31%20-148%20-22%20-249%20-130%20-261%20-279%20-5%20-51%20-11%20-70%20-29%20-87%20-13%20-12%20-26%20-20%20-30%20-17%20-12%2013%20-4%20140%2012%20191%2045%20144%20183%20246%20333%20247%20l64%200%20-22%20-24z%20m387%208%20c-4%20-20%20-34%20-41%20-44%20-31%20-8%208%2024%2047%2038%2047%205%200%208%20-7%206%20-16z%20m-273%20-5%20c8%20-12%20-23%20-49%20-42%20-49%20-17%200%20-16%205%203%2035%2018%2027%2029%2031%2039%2014z%20m154%20-45%20c-17%20-19%20-25%20-21%20-36%20-12%20-11%209%20-10%2015%208%2034%2017%2019%2025%2021%2036%2012%2011%20-9%2010%20-15%20-8%20-34z%20m167%2015%20c3%20-6%20-3%20-21%20-15%20-32%20-16%20-16%20-23%20-19%20-33%20-9%20-9%209%20-7%2016%207%2032%2020%2023%2031%2025%2041%209z%20m-270%20-10%20c10%20-17%20-31%20-53%20-52%20-45%20-15%206%20-15%209%206%2031%2026%2028%2035%2030%2046%2014z%20m158%20-17%20c2%20-4%20-4%20-19%20-14%20-32%20-15%20-20%20-22%20-22%20-31%20-13%20-10%2010%20-9%2017%206%2033%2019%2021%2031%2025%2039%2012z%20m-114%20-35%20c0%20-7%20-5%20-18%20-12%20-25%20-16%20-16%20-38%20-15%20-38%201%200%207%205%2018%2012%2025%2016%2016%2038%2015%2038%20-1z%20m156%20-8%20c3%20-6%20-3%20-21%20-15%20-32%20-16%20-16%20-23%20-19%20-33%20-9%20-9%209%20-7%2016%207%2032%2020%2023%2031%2025%2041%209z%20m-521%20-99%20c-55%20-55%20-103%20-100%20-106%20-100%20-15%200%2015%2080%2043%20114%2031%2038%20109%2085%20143%2086%2014%200%20-9%20-28%20-80%20-100z%20m195%2094%20c0%20-12%20-298%20-303%20-304%20-297%20-3%204%20-6%2016%20-6%2028%200%2032%20252%20275%20286%20275%2013%200%2024%20-3%2024%20-6z%20m214%20-23%20c3%20-4%20-5%20-18%20-18%20-30%20-28%20-26%20-42%20-14%20-20%2017%2016%2023%2029%2028%2038%2013z%20m-164%20-11%20c12%20-8%20-18%20-42%20-149%20-174%20-129%20-130%20-168%20-163%20-178%20-154%20-8%206%20-12%2015%20-11%2019%204%2011%20311%20319%20318%20319%203%200%2012%20-5%2020%20-10z%20m210%20-37%20c0%20-12%20-33%20-43%20-47%20-43%20-17%200%20-17%2010%204%2032%2016%2018%2043%2025%2043%2011z%20m-154%20-14%20c4%20-7%20-62%20-80%20-157%20-175%20-145%20-146%20-165%20-162%20-179%20-149%20-13%2014%203%2033%20145%20175%2088%2088%20165%20160%20172%20160%206%200%2015%20-5%2019%20-11z%20m34%20-66%20c0%20-22%20-269%20-293%20-291%20-293%20-8%200%20-19%203%20-23%207%20-8%209%20284%20303%20301%20303%207%200%2013%20-8%2013%20-17z%20m127%20-90%20c-18%20-191%20-165%20-325%20-360%20-326%20-89%20-1%20-104%208%20-76%2042%2015%2018%2026%2022%2052%2018%2040%20-6%20121%2010%20167%2033%2077%2040%20142%20134%20155%20225%208%2048%2039%2090%2059%2078%205%20-3%206%20-35%203%20-70z%20m-129%20-25%20c-18%20-80%20-72%20-141%20-147%20-167%20-83%20-28%20-79%20-14%2034%2099%2060%2061%20113%20110%20116%20110%204%200%203%20-19%20-3%20-42z%20m-491%20-64%20c3%20-8%20-4%20-25%20-18%20-40%20-20%20-21%20-24%20-22%20-32%20-9%20-6%2011%20-3%2024%207%2041%2019%2028%2034%2031%2043%208z%20m28%20-104%20c-22%20-24%20-31%20-25%20-39%20-4%20-4%2010%201%2025%2011%2036%2015%2017%2018%2017%2032%204%2013%20-14%2013%20-18%20-4%20-36z%20m-106%2015%20c2%20-14%20-39%20-60%20-145%20-162%20-139%20-134%20-169%20-156%20-169%20-123%200%2017%20287%20309%20300%20306%206%20-2%2012%20-11%2014%20-21z%20m169%20-37%20c9%20-9%208%20-16%20-5%20-30%20-9%20-10%20-22%20-18%20-29%20-18%20-22%200%20-27%2021%20-8%2041%2020%2022%2026%2023%2042%207z%20m-128%20-17%20c8%20-17%20-10%20-39%20-137%20-165%20-141%20-140%20-147%20-145%20-165%20-129%20-19%2017%20-14%2022%20134%20165%2084%2081%20154%20147%20155%20148%201%200%207%20-9%2013%20-19z%20m194%20-20%20c9%20-15%20-38%20-51%20-54%20-41%20-12%207%20-11%2012%204%2029%2020%2022%2041%2027%2050%2012z%20m-277%20-198%20c-138%20-138%20-148%20-147%20-164%20-131%20-15%2016%20-7%2026%20131%20164%20137%20137%20149%20146%20164%20130%2015%20-15%206%20-27%20-131%20-163z%20m-429%2055%20c71%20-76%2092%20-111%2052%20-86%20-25%2016%20-38%203%20-21%20-24%2011%20-17%2010%20-23%20-3%20-36%20-15%20-15%20-23%20-10%20-96%2063%20-44%2044%20-80%2084%20-80%2089%200%2012%2062%2077%2070%2074%203%20-2%2038%20-38%2078%20-80z%20m487%20-103%20c-142%20-150%20-148%20-155%20-167%20-138%20-18%2016%20-14%2022%20134%20170%20133%20133%20154%20151%20167%20138%2012%20-12%20-5%20-34%20-134%20-170z%20m-365%20-35%20c0%20-5%20-2%20-10%20-4%20-10%20-3%200%20-8%205%20-11%2010%20-3%206%20-1%2010%204%2010%206%200%2011%20-4%2011%20-10z%20m-42%20-33%20c7%20-8%207%20-18%202%20-27%20-7%20-12%20-12%20-11%20-30%205%20-16%2014%20-17%2020%20-8%2027%2018%2011%2024%2010%2036%20-5z%20m98%20-24%20c-7%20-7%20-26%207%20-26%2019%200%206%206%206%2015%20-2%209%20-7%2013%20-15%2011%20-17z%20m-46%20-18%20c6%20-8%209%20-23%205%20-36%20-6%20-17%20-4%20-20%2012%20-15%2013%204%2026%20-1%2037%20-12%2015%20-17%2015%20-20%201%20-32%20-14%20-12%20-22%20-7%20-61%2034%20-35%2038%20-42%2051%20-33%2062%2015%2018%2024%2018%2039%20-1z%20m100%20-37%20c0%20-6%20-7%20-5%20-15%202%20-8%207%20-15%2017%20-15%2022%200%206%207%205%2015%20-2%208%20-7%2015%20-17%2015%20-22z%20m45%20-38%20c3%20-5%202%20-10%20-4%20-10%20-5%200%20-13%205%20-16%2010%20-3%206%20-2%2010%204%2010%205%200%2013%20-4%2016%20-10z%20m-38%20-39%20c10%20-16%209%20-22%20-3%20-32%20-12%20-10%20-18%20-9%20-31%204%20-13%2013%20-14%2019%20-3%2031%2016%2021%2023%2020%2037%20-3z%20m168%20-91%20l90%20-90%20-38%20-38%20-38%20-37%20-90%2095%20c-49%2052%20-89%2098%20-89%20101%200%204%206%2012%2013%2018%2011%208%2018%206%2032%20-9%2010%20-11%2024%20-20%2032%20-20%2018%200%2016%2030%20-4%2052%20-9%2010%20-12%2018%20-7%2018%205%200%2050%20-41%2099%20-90z'/%3e%3cpath%20d='M4310%203911%20c-21%20-40%20-6%20-81%2031%20-81%2018%200%2069%2043%2069%2059%200%2038%20-81%2056%20-100%2022z%20m50%20-31%20c0%20-5%20-5%20-10%20-11%20-10%20-5%200%20-7%205%20-4%2010%203%206%208%2010%2011%2010%202%200%204%20-4%204%20-10z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M1405%204533%20c-155%20-20%20-340%20-129%20-451%20-263%20-59%20-73%20-121%20-198%20-139%20-285%20-19%20-90%20-19%20-252%200%20-335%2019%20-83%2057%20-169%20107%20-242%2033%20-49%2037%20-61%2028%20-79%20-17%20-30%20-3%20-75%2035%20-115%2032%20-33%2037%20-35%2092%20-33%2050%202%2066%20-2%20123%20-34%2082%20-45%20191%20-76%20301%20-84%20l86%20-6%2012%20-34%20c18%20-48%2064%20-75%20119%20-70%2048%205%2038%2013%20277%20-198%2044%20-39%20117%20-101%20163%20-139%2070%20-58%2083%20-73%2081%20-95%20-2%20-17%209%20-42%2030%20-71%2075%20-101%20121%20-260%20121%20-421%200%20-83%20-2%20-90%20-35%20-139%20-19%20-28%20-39%20-68%20-45%20-88%20-6%20-20%20-13%20-176%20-17%20-345%20-7%20-342%20-10%20-327%2059%20-327%20l38%200%202%20-276%20c3%20-246%205%20-278%2020%20-287%2012%20-8%2021%20-7%2032%202%2014%2012%2016%2050%2016%20287%20l0%20274%20100%200%20100%200%200%20-274%20c0%20-237%202%20-275%2016%20-287%2011%20-9%2020%20-10%2032%20-2%2015%209%2017%2041%2020%20287%20l2%20276%2034%200%20c70%200%2066%20-20%2066%20314%20l0%20302%2038%2013%20c20%208%2056%2026%2080%2042%2035%2024%2046%2027%2066%2018%2017%20-8%2029%20-8%2045%201%2026%2014%2015%2021%20171%20-115%20379%20-331%20358%20-315%20401%20-315%2022%200%2057%209%2078%2020%2036%2018%2040%2018%2053%203%2032%20-39%20220%20-193%20243%20-199%2018%20-5%2037%201%2067%2021%20l41%2027%2018%20-23%20c38%20-49%20109%20-199%20124%20-260%2020%20-88%2018%20-237%20-5%20-324%20-16%20-61%20-16%20-72%20-4%20-85%2024%20-24%2047%201%2067%2071%2057%20204%2019%20411%20-114%20616%20l-41%2062%2022%2023%20c51%2055%2037%2089%20-96%20227%20l-95%2099%2016%2050%20c25%2076%2010%20116%20-79%20210%20-40%2042%20-223%20241%20-407%20442%20-309%20339%20-564%20615%20-967%201049%20-155%20166%20-162%20176%20-162%20215%200%2051%20-29%20100%20-74%20127%20-36%2021%20-46%2042%20-46%2098%200%2084%20-65%20264%20-121%20335%20-17%2022%20-22%2040%20-20%2073%202%2039%20-1%2048%20-37%2083%20-35%2036%20-45%2040%20-88%2040%20-38%200%20-61%208%20-103%2035%20-146%2093%20-321%20131%20-496%20108z%20m319%20-93%20c68%20-23%20187%20-89%20193%20-106%207%20-22%20-348%20-424%20-538%20-609%20-136%20-132%20-354%20-325%20-367%20-325%20-4%200%20-23%2026%20-43%2058%20-127%20204%20-141%20436%20-39%20649%2058%20119%20179%20243%20290%20296%20120%2058%20168%2067%20310%2063%2098%20-2%20140%20-8%20194%20-26z%20m324%20-134%20c26%20-33%2020%20-47%20-64%20-153%20-251%20-317%20-626%20-696%20-876%20-886%20-41%20-32%20-70%20-30%20-89%204%20-15%2028%20-5%2040%20136%20160%20221%20188%20457%20428%20671%20680%2071%2085%20140%20168%20152%20186%2022%2032%2050%2035%2070%209z%20m128%20-311%20c14%20-44%2028%20-114%2031%20-155%20l5%20-75%20-209%20-215%20c-114%20-119%20-252%20-262%20-305%20-318%20l-98%20-102%20-73%200%20c-85%200%20-205%2028%20-280%2065%20-29%2015%20-55%2030%20-60%2034%20-4%204%2055%2062%20130%20128%20259%20228%20463%20441%20682%20711%20l83%20104%2034%20-48%20c19%20-27%2046%20-84%2060%20-129z%20m127%20-303%20c9%20-8%2017%20-28%2017%20-43%200%20-24%20-38%20-68%20-212%20-250%20-117%20-122%20-239%20-250%20-272%20-285%20-85%20-94%20-139%20-117%20-170%20-72%20-9%2012%20-16%2028%20-16%2035%200%207%20107%20124%20238%20260%20131%20137%20268%20279%20304%20317%2067%2070%2071%2071%20111%2038z%20m158%20-274%20c127%20-135%20983%20-1063%201284%20-1391%20105%20-114%20194%20-219%20199%20-234%206%20-18%204%20-35%20-7%20-59%20-22%20-46%20-220%20-248%20-262%20-268%20-31%20-15%20-38%20-15%20-62%20-2%20-29%2016%20-496%20422%20-501%20437%20-2%204%2013%2086%2032%20181%2051%20245%2057%20231%20-213%20481%20-171%20158%20-206%20186%20-246%20196%20-76%2019%20-122%202%20-288%20-106%20-85%20-55%20-101%20-62%20-115%20-51%20-133%20104%20-463%20390%20-460%20398%204%2012%20511%20540%20518%20540%203%200%2058%20-55%20121%20-122z%20m272%20-764%20c156%20-137%20350%20-322%20363%20-345%2020%20-39%2018%20-66%20-16%20-224%20-17%20-77%20-33%20-152%20-37%20-167%20-3%20-16%20-8%20-28%20-12%20-28%20-3%200%20-96%2079%20-206%20176%20-200%20176%20-435%20380%20-489%20426%20l-28%2024%2098%2064%20c168%20109%20194%20121%20241%20117%2031%20-3%2053%20-15%2086%20-43z%20m-138%20-475%20c77%20-68%20186%20-164%20243%20-212%2056%20-49%20100%20-93%2096%20-98%20-6%20-11%20-68%20-43%20-101%20-53%20-19%20-6%20-25%20-2%20-36%2027%20-22%2050%20-72%20103%20-124%20128%20-51%2025%20-153%2030%20-190%2011%20-20%20-11%20-21%20-8%20-27%2086%20-4%2053%20-16%20131%20-27%20174%20-25%2098%20-24%20106%204%2081%2012%20-11%2085%20-76%20162%20-144z%20m74%20-282%20c24%20-16%2048%20-44%2062%20-74%2023%20-46%2024%20-61%2031%20-333%204%20-156%205%20-286%203%20-288%20-8%20-8%20-404%20-11%20-408%20-4%20-2%204%20-1%20135%202%20292%20l6%20285%2028%2051%20c56%20100%20182%20133%20276%2071z%20m1376%20-382%20c53%20-58%2095%20-109%2093%20-114%20-5%20-15%20-109%20-121%20-118%20-121%20-14%200%20-220%20182%20-220%20194%200%2011%20130%20146%20141%20146%204%200%2050%20-47%20104%20-105z'/%3e%3cpath%20d='M2494%201821%20c-45%20-27%20-64%20-59%20-64%20-106%200%20-113%20132%20-175%20212%20-98%2044%2043%2055%2090%2030%20145%20-31%2072%20-113%2099%20-178%2059z%20m110%20-73%20c22%20-30%2020%20-54%20-5%20-79%20-27%20-27%20-66%20-21%20-92%2012%20-16%2023%20-17%2030%20-7%2050%2017%2031%2029%2039%2062%2039%2017%200%2033%20-9%2042%20-22z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M3765%204481%20c-60%20-32%20-168%20-91%20-240%20-131%20-71%20-40%20-220%20-122%20-330%20-183%20-110%20-60%20-402%20-222%20-650%20-360%20-247%20-138%20-544%20-303%20-660%20-367%20-239%20-133%20-873%20-486%20-1044%20-582%20-63%20-35%20-123%20-76%20-134%20-90%20-18%20-23%20-18%20-32%20-8%20-72%207%20-29%2011%20-159%2011%20-364%200%20-358%201%20-351%20-74%20-476%20-41%20-66%20-48%20-87%20-57%20-160%20-6%20-46%20-9%20-174%20-7%20-285%203%20-187%204%20-204%2022%20-217%2015%20-10%2054%20-14%20152%20-14%20l133%200%205%20-52%20c3%20-29%2017%20-158%2031%20-287%2014%20-129%2030%20-240%2036%20-248%2017%20-20%20182%20-18%20199%202%2012%2015%2032%20162%2060%20457%20l13%20128%20538%200%20539%200%200%20-200%200%20-200%20-25%200%20c-14%200%20-34%20-9%20-45%20-20%20-18%20-18%20-20%20-31%20-18%20-98%20l3%20-77%20339%20-3%20c242%20-2%20343%201%20352%209%2019%2015%2018%20122%20-1%20158%20-15%2030%20-33%2041%20-66%2041%20-18%200%20-19%209%20-19%20195%20l0%20195%20540%200%20539%200%205%20-33%20c3%20-17%2017%20-147%2031%20-287%2016%20-153%2031%20-260%2038%20-266%2018%20-17%20172%20-25%20193%20-10%2011%209%2021%2042%2030%20102%2013%2082%2044%20418%2044%20471%200%2023%201%2023%20134%2023%20194%200%20178%20-28%20174%20310%20l-3%20275%20-33%2055%20c-18%2030%20-47%2084%20-65%20120%20l-32%2065%20-3%20335%20c-3%20290%20-5%20337%20-19%20352%20-13%2015%20-33%2018%20-103%2018%20l-87%200%20-135%20238%20c-74%20130%20-204%20359%20-288%20507%20-84%20149%20-195%20344%20-247%20433%20-51%2090%20-93%20167%20-93%20172%200%204%2030%2024%2068%2044%20190%20102%20438%20246%20459%20266%2028%2027%2031%2079%206%20117%20-15%2022%20-67%2053%20-90%2053%20-4%200%20-57%20-27%20-118%20-59z%20m162%20-42%20c6%20-31%2059%200%20-687%20-411%20-239%20-132%20-473%20-262%20-520%20-288%20-47%20-27%20-310%20-173%20-585%20-325%20-749%20-415%20-1200%20-669%20-1225%20-690%20-18%20-17%20-152%20-23%20-157%20-8%20-6%2016%2010%2026%20592%20351%20143%2079%20379%20211%20525%20292%20146%2081%20380%20212%20520%20290%20251%20140%20783%20435%201255%20696%20214%20118%20242%20131%20260%20120%2011%20-8%2021%20-20%2022%20-27z%20m-410%20-699%20c83%20-146%20237%20-418%20343%20-605%20106%20-187%20204%20-357%20217%20-377%2012%20-21%2023%20-40%2023%20-43%200%20-3%20-191%20-5%20-425%20-5%20l-425%200%20-17%2027%20c-24%2037%20-24%20150%200%20222%20l18%2054%20-23%2023%20c-18%2017%20-47%2026%20-133%2039%20-60%209%20-166%2025%20-235%2036%20-261%2040%20-382%2037%20-735%20-22%20-232%20-38%20-223%20-36%20-236%20-60%20-8%20-16%20-7%20-36%206%20-84%2021%20-76%2018%20-197%20-6%20-220%20-13%20-13%20-72%20-15%20-446%20-13%20l-430%203%20266%20152%20c146%2083%20475%20267%20731%20408%20256%20142%20571%20316%20700%20388%20508%20282%20645%20356%20651%20349%203%20-4%2073%20-126%20156%20-272z%20m-727%20-680%20c255%20-38%20370%20-57%20377%20-64%204%20-4%202%20-33%20-5%20-64%20-21%20-100%20-12%20-178%2033%20-284%207%20-17%20-27%20-18%20-630%20-18%20-603%200%20-637%201%20-630%2018%203%209%2016%2052%2028%2096%2021%2077%2021%2080%203%20164%20-9%2046%20-16%2086%20-14%2087%204%204%20356%2062%20443%2074%20118%2015%20254%2012%20395%20-9z%20m-926%20-450%20l1%20-35%20695%200%20695%200%203%2038%203%2037%20533%200%20c417%200%20536%20-3%20544%20-13%207%20-8%2012%20-128%2014%20-327%203%20-300%205%20-318%2026%20-372%2013%20-32%2038%20-79%2056%20-105%2053%20-78%2056%20-96%2056%20-354%20l0%20-239%20-1925%200%20-1926%200%203%20248%203%20247%2035%2065%20c19%2036%2046%2087%2060%20115%20l25%2050%203%20325%20c3%20282%205%20327%2019%20342%2015%2017%2049%2018%20547%2016%20l530%20-3%200%20-35z%20m-707%20-1452%20c-3%20-13%20-13%20-108%20-22%20-213%20-9%20-104%20-20%20-217%20-23%20-250%20l-7%20-60%20-52%20-3%20-52%20-3%20-5%2043%20c-26%20213%20-38%20328%20-43%20411%20l-6%2097%20108%200%20c106%200%20107%200%20102%20-22z%20m1254%20-178%20l0%20-195%20-26%20-3%20-25%20-3%200%20201%200%20201%2026%20-3%2026%20-3%20-1%20-195z%20m229%200%20l0%20-200%20-80%200%20-80%200%200%20200%200%20200%2080%200%2080%200%200%20-200z%20m120%200%20l0%20-200%20-30%200%20-30%200%200%20200%200%20200%2030%200%2030%200%200%20-200z%20m1416%20103%20c-4%20-54%20-16%20-176%20-27%20-270%20-10%20-95%20-19%20-175%20-19%20-178%200%20-3%20-25%20-5%20-55%20-5%20-49%200%20-55%202%20-60%2023%20-4%2020%20-45%20486%20-45%20515%200%209%2031%2012%20106%2012%20l107%200%20-7%20-97z%20m-1316%20-403%20l0%20-40%20-295%200%20-295%200%200%2040%200%2040%20295%200%20295%200%200%20-40z'/%3e%3cpath%20d='M950%202512%20c-8%20-2%20-25%20-14%20-37%20-25%20-22%20-20%20-23%20-26%20-23%20-226%200%20-263%20-8%20-311%20-64%20-425%20-24%20-50%20-49%20-109%20-55%20-131%20-6%20-22%20-11%20-116%20-11%20-209%200%20-149%202%20-167%2016%20-162%209%203%20821%206%201806%206%20l1790%200%20-4%20183%20-3%20182%20-48%2093%20c-71%20139%20-77%20171%20-77%20424%200%20223%20-4%20254%20-41%20276%20-15%2010%20-390%2013%20-1627%2016%20-884%202%20-1614%201%20-1622%20-2z%20m3228%20-279%20l2%20-213%20-1615%200%20-1615%200%200%20215%200%20215%201613%20-2%201612%20-3%203%20-212z%20m-3128%20-295%20c0%20-13%20-9%20-84%20-19%20-158%20-11%20-74%20-17%20-138%20-15%20-142%203%20-4%2019%20-8%2036%20-8%2030%200%2030%20-1%2024%20-42%20-3%20-24%20-8%20-76%20-12%20-115%20l-7%20-73%20-83%200%20c-73%200%20-84%202%20-84%2018%200%2020%2070%20511%2076%20530%202%207%2020%2012%2044%2012%2035%200%2040%20-3%2040%20-22z%20m223%2015%20c2%20-5%20-4%20-69%20-15%20-143%20-23%20-164%20-22%20-173%2017%20-180%2017%20-3%2029%20-10%2029%20-15%20-1%20-6%20-5%20-56%20-9%20-112%20l-7%20-103%20-95%200%20-95%200%206%2048%20c3%2026%208%2077%2012%20114%206%2066%207%2067%2037%2070%20l32%203%2013%20139%20c8%2077%2018%20150%2023%20163%208%2022%2043%2032%2052%2016z%20m102%20-5%20c3%20-7%20-1%20-67%20-8%20-133%20l-12%20-120%20-29%20-3%20c-27%20-3%20-28%20-2%20-23%2030%204%2018%2011%2074%2017%20123%2014%20109%2015%20115%2035%20115%209%200%2018%20-6%2020%20-12z%20m181%20-60%20c-13%20-153%20-36%20-444%20-36%20-465%200%20-22%20-3%20-23%20-96%20-23%20l-97%200%207%2073%20c14%20154%2015%20157%2047%20157%2016%200%2029%204%2029%209%200%2029%2032%20306%2036%20313%203%204%2030%208%2061%208%20l56%200%20-7%20-72z%20m150%20-20%20c-3%20-51%20-9%20-125%20-12%20-165%20l-6%20-72%2033%20-3%20c19%20-2%2033%20-6%2032%20-10%20-2%20-5%20-3%20-55%20-3%20-113%20l0%20-105%20-95%200%20c-92%200%20-95%201%20-95%2023%200%2054%2040%20519%2045%20528%204%205%2029%209%2057%209%20l51%200%20-7%20-92z%20m107%2026%20c-2%20-33%20-6%20-92%20-9%20-131%20-5%20-69%20-7%20-73%20-30%20-73%20l-25%200%206%20113%20c8%20150%2010%20158%2038%20153%2020%20-3%2022%20-8%2020%20-62z%20m120%2059%20c2%20-5%20-2%20-75%20-8%20-158%20-7%20-82%20-10%20-153%20-6%20-157%203%20-3%2017%20-8%2031%20-10%2021%20-2%2026%20-9%2028%20-43%202%20-22%201%20-73%20-3%20-112%20l-7%20-73%20-91%200%20-92%200%203%20102%20c2%2057%205%20109%207%20116%202%206%2018%2012%2034%2012%20l29%200%206%20108%20c13%20209%2015%20222%2041%20222%2013%200%2026%20-3%2028%20-7z%20m102%20-3%20c3%20-5%203%20-66%20-1%20-135%20-7%20-124%20-7%20-125%20-31%20-125%20l-25%200%207%20128%20c4%2070%209%20130%2012%20135%206%2010%2031%209%2038%20-3z%20m176%20-100%20c0%20-58%20-4%20-183%20-7%20-277%20l-7%20-173%20-93%200%20-94%200%206%20103%20c7%20126%207%20125%2041%20129%20l28%203%208%20150%20c4%2083%209%20156%2012%20163%203%209%2021%2012%2056%2010%20l52%20-3%20-2%20-105z%20m153%20-55%20l1%20-160%2033%20-3%2032%20-3%200%20-115%200%20-114%20-97%200%20-96%200%207%20272%20c4%20149%209%20275%2012%20280%203%205%2028%208%2056%206%20l50%20-3%202%20-160z%20m106%2024%20l0%20-129%20-25%200%20-25%200%200%20129%20c0%20115%202%20130%2018%20134%209%202%2020%202%2025%200%204%20-2%207%20-62%207%20-134z%20m120%20-24%20l0%20-165%2030%200%2030%200%200%20-115%200%20-115%20-90%200%20-90%200%200%20115%200%20115%2030%200%2030%200%200%20165%200%20165%2030%200%2030%200%200%20-165z%20m284%2033%20c3%20-73%207%20-199%209%20-280%20l2%20-148%20-98%200%20-98%200%203%20113%203%20112%2033%203%2033%203%20-1%20157%20c-1%2086%20-1%20160%20-1%20165%201%204%2025%207%2055%207%20l54%200%206%20-132z%20m152%20-33%20c7%20-88%2012%20-161%2013%20-162%200%20-1%2016%20-3%2034%20-5%20l32%20-3%205%20-113%205%20-112%20-97%200%20-98%200%200%20108%20c0%2059%20-3%20185%20-7%20280%20l-6%20173%2054%20-3%2054%20-3%2011%20-160z%20m98%20148%20c2%20-10%208%20-71%2011%20-135%20l7%20-118%20-25%200%20c-24%200%20-25%203%20-31%2083%20-5%2078%20-9%20163%20-7%20180%202%2015%2040%206%2045%20-10z%20m120%20-45%20c3%20-35%209%20-108%2013%20-163%208%20-100%208%20-100%2036%20-103%2034%20-4%2034%20-3%2042%20-129%20l6%20-103%20-96%200%20-95%200%20-2%2095%20c-1%2052%20-2%20103%20-2%20112%20-1%2012%209%2020%2029%2023%2025%205%2030%2010%2028%2030%20-1%2014%20-7%2082%20-13%20153%20-6%2070%20-8%20132%20-5%20137%203%206%2017%2010%2030%2010%2022%200%2024%20-5%2029%20-62z%20m107%2012%20c3%20-25%209%20-84%2013%20-132%20l6%20-88%20-24%200%20c-28%200%20-31%2013%20-42%20173%20l-7%2099%2024%20-4%20c20%20-2%2025%20-10%2030%20-48z%20m174%2038%20c2%20-7%2011%20-107%2020%20-223%208%20-115%2018%20-236%2021%20-267%20l6%20-58%20-95%200%20-94%200%20-7%2038%20c-3%2020%20-6%2072%20-6%20114%200%2076%200%2077%2028%2080%2031%204%2031%204%2018%20206%20l-8%20122%2056%200%20c36%200%2058%20-4%2061%20-12z%20m149%204%20c4%20-8%2036%20-274%2036%20-306%200%20-9%2012%20-16%2033%20-18%20l32%20-3%207%20-75%20c4%20-41%209%20-92%2012%20-112%20l4%20-38%20-93%200%20-94%200%20-5%2043%20c-6%2048%20-36%20460%20-36%20495%200%2020%205%2022%2049%2022%2028%200%2052%20-4%2055%20-8z%20m110%20-14%20c3%20-13%2010%20-66%2016%20-118%206%20-52%2014%20-103%2016%20-112%204%20-14%20-1%20-18%20-23%20-18%20l-29%200%20-15%20131%20c-8%2071%20-13%20132%20-10%20135%2013%2013%2041%201%2045%20-18z%20m119%20-10%20c7%20-38%2026%20-207%2030%20-258%202%20-31%205%20-35%2034%20-38%2035%20-4%2036%20-7%2048%20-154%20l7%20-78%20-91%200%20c-49%200%20-92%203%20-94%208%20-3%204%20-8%2055%20-12%20115%20l-7%20107%2026%200%20c15%200%2029%206%2032%2014%203%207%20-4%2078%20-14%20157%20-11%2079%20-18%20147%20-15%20152%202%204%2015%207%2027%207%2019%200%2025%20-7%2029%20-32z%20m264%20-43%20c21%20-127%2073%20-462%2073%20-474%200%20-7%20-29%20-11%20-89%20-11%20l-89%200%20-7%2088%20c-3%2048%20-7%2098%20-8%20112%20-2%2020%204%2025%2028%2030%2036%207%2036%2011%2011%20183%20-10%2066%20-15%20126%20-12%20134%204%2010%2017%2013%2043%2011%20l38%20-3%2012%20-70z%20m-3010%2038%20c-3%20-16%20-12%20-74%20-18%20-130%20-12%20-98%20-14%20-103%20-36%20-103%20-28%200%20-28%206%20-8%20145%208%2055%2015%20103%2015%20108%200%204%2012%207%2026%207%2023%200%2026%20-3%2021%20-27z%20m1543%20-103%20l0%20-130%20-25%200%20-25%200%200%20130%200%20130%2025%200%2025%200%200%20-130z%20m1310%20118%20c0%20-7%207%20-62%2015%20-123%208%20-60%2015%20-113%2015%20-117%200%20-5%20-10%20-8%20-23%20-8%20-23%200%20-24%206%20-40%20123%20-10%2067%20-17%20125%20-17%20130%200%2013%2050%208%2050%20-5z%20m267%20-190%20c25%20-49%2027%20-63%2030%20-198%201%20-80%201%20-140%20-2%20-135%20-2%206%20-16%2087%20-30%20180%20-14%2094%20-28%20178%20-31%20188%20-10%2034%206%2016%2033%20-35z%20m-3427%20-153%20l-30%20-190%203%20145%20c3%20129%206%20150%2027%20192%2013%2026%2025%2046%2026%2045%202%20-1%20-10%20-88%20-26%20-192z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M2196%204525%20c-73%20-20%20-174%20-73%20-193%20-101%20-14%20-23%20-14%20-26%201%20-43%209%20-9%2016%20-22%2016%20-27%200%20-19%20-140%20-67%20-210%20-72%20-55%20-4%20-77%20-1%20-112%2016%20-29%2014%20-75%2022%20-143%2027%20l-101%207%20-113%20-46%20c-133%20-53%20-161%20-70%20-161%20-95%200%20-31%2025%20-42%20153%20-73%20165%20-39%20251%20-43%20441%20-24%20136%2014%20177%2022%20275%2057%20230%2080%20269%2084%20315%2029%2025%20-30%2041%20-96%2034%20-140%20-2%20-18%20-12%20-26%20-48%20-34%20l-45%20-11%20-6%20-160%20c-4%20-88%20-7%20-241%20-8%20-341%20-1%20-175%200%20-181%2022%20-201%2012%20-11%2033%20-24%2046%20-28%2024%20-7%2024%20-8%2018%20-119%20-4%20-61%20-11%20-268%20-17%20-461%20-6%20-192%20-13%20-364%20-16%20-381%20-3%20-25%20-10%20-33%20-33%20-37%20-55%20-11%20-58%20-22%20-66%20-209%20-4%20-95%20-5%20-189%20-3%20-208%203%20-32%206%20-36%2047%20-45%20l44%20-9%20-6%20-171%20c-4%20-93%20-7%20-214%20-7%20-268%200%20-69%20-4%20-99%20-12%20-101%20-7%20-2%20-32%20-9%20-54%20-15%20-23%20-6%20-45%20-18%20-48%20-26%20-5%20-14%2010%20-278%2019%20-320%206%20-27%2065%20-55%20113%20-55%2035%200%2041%20-5%2080%20-60%20129%20-182%20362%20-260%20597%20-200%20234%2060%20361%20241%20385%20549%206%2069%2017%20216%2025%20326%2036%20480%20110%20750%20245%20884%2070%2070%2091%2078%20145%2059%2053%20-20%2091%20-12%20118%2024%2028%2038%2010%2081%20-66%20155%20-93%2090%20-562%20490%20-596%20508%20-55%2028%20-100%2014%20-120%20-38%20-8%20-21%20-5%20-35%2014%20-72%2033%20-61%2031%20-79%20-10%20-150%20-173%20-295%20-236%20-580%20-261%20-1175%20-4%20-98%20-2%20-206%206%20-293%2012%20-133%2012%20-139%20-11%20-207%20-19%20-59%20-26%20-70%20-45%20-70%20-13%200%20-33%2013%20-48%2031%20-23%2027%20-26%2039%20-26%20105%200%2064%204%2081%2025%20112%2014%2020%2025%2042%2025%2049%200%206%2010%2013%2023%2015%20l22%203%200%20632%20c0%20604%20-1%20632%20-19%20652%20-14%2015%20-31%2021%20-63%2021%20-41%200%20-43%201%20-43%2030%200%2017%206%2033%2014%2036%208%203%2024%2024%2036%2048%2031%2057%2022%20108%20-27%20154%20l-36%2033%2032%2033%20c40%2041%2049%2091%2026%20140%20-10%2020%20-26%2041%20-36%2047%20-23%2012%20-25%2035%20-3%2043%208%203%2024%2026%2035%2051%2026%2060%2018%2096%20-32%20143%20l-39%2037%200%20120%20c0%2066%20-5%20200%20-10%20298%20-9%20173%20-9%20179%2013%20220%2075%20144%20-48%20340%20-248%20393%20-63%2017%20-205%2016%20-269%20-1z%20m296%20-74%20c92%20-35%20166%20-121%20183%20-214%2010%20-51%20-6%20-46%20-29%209%20-28%2069%20-105%20146%20-177%20179%20-56%2025%20-69%2027%20-153%2023%20-74%20-4%20-105%20-10%20-163%20-36%20-40%20-17%20-75%20-27%20-78%20-23%20-11%2019%2065%2058%20149%2077%2081%2018%20196%2012%20268%20-15z%20m-35%20-85%20c63%20-30%20126%20-106%20148%20-179%2018%20-58%2030%20-206%2041%20-504%20l7%20-201%20-32%20-17%20c-39%20-20%20-65%20-74%20-56%20-116%208%20-36%2041%20-78%2071%20-89%2023%20-9%2033%20-30%2015%20-30%20-5%200%20-23%20-11%20-39%20-25%20-56%20-47%20-47%20-125%2019%20-179%2022%20-18%2030%20-29%2021%20-33%20-27%20-11%20-70%20-54%20-82%20-83%20-10%20-24%20-10%20-40%20-1%20-70%2012%20-39%2061%20-90%2087%20-90%2029%200%2013%20-31%20-24%20-46%20-43%20-17%20-82%20-73%20-82%20-118%200%20-51%2052%20-120%2095%20-128%2013%20-2%2021%20-12%2023%20-29%203%20-23%20-4%20-30%20-45%20-50%20-32%20-16%20-54%20-36%20-67%20-60%20-19%20-35%20-19%20-38%20-2%20-83%2019%20-49%2054%20-76%20101%20-76%2016%200%2025%20-6%2025%20-15%200%20-16%20-5%20-19%20-53%20-30%20-79%20-17%20-106%20-125%20-47%20-184%2017%20-17%2046%20-33%2065%20-37%2025%20-4%2035%20-11%2035%20-25%200%20-14%20-7%20-19%20-29%20-19%20-39%200%20-88%20-43%20-101%20-88%20-8%20-30%20-6%20-44%2011%20-79%2022%20-45%2044%20-62%2094%20-73%2044%20-9%2038%20-33%20-9%20-41%20-28%20-5%20-50%20-17%20-73%20-43%20-28%20-31%20-33%20-43%20-33%20-86%200%20-86%2044%20-142%20120%20-155%20l40%20-7%200%20-70%20c0%20-45%206%20-83%2017%20-105%2021%20-45%2082%20-90%20136%20-98%2026%20-4%2054%20-18%2072%20-35%20107%20-102%20265%20-42%20265%20100%20-1%2096%20-68%20162%20-166%20164%20l-54%200%200%2063%200%2062%2035%20-15%20c51%20-21%20123%20-18%20175%209%20119%2059%20117%20251%20-2%20322%20-46%2027%20-123%2026%20-172%20-3%20-20%20-12%20-39%20-22%20-42%20-22%20-5%200%206%20132%2011%20138%201%202%2020%20-8%2040%20-23%2044%20-29%20128%20-35%20174%20-10%2064%2033%20109%20122%2097%20194%20-7%2045%20-49%20107%20-89%20131%20-39%2024%20-122%2027%20-172%206%20l-35%20-15%200%2032%20c0%2054%2029%20206%2062%20327%2024%2084%2056%20161%20119%20287%20l86%20172%2024%20-26%20c13%20-14%20117%20-109%20232%20-211%20114%20-102%20207%20-189%20207%20-193%200%20-5%20-12%20-15%20-27%20-23%20-63%20-33%20-145%20-134%20-188%20-229%20-83%20-189%20-129%20-464%20-155%20-937%20-6%20-107%20-15%20-217%20-20%20-245%20-39%20-226%20-203%20-380%20-425%20-401%20l-60%20-6%2033%2027%20c45%2037%2062%2075%2062%20138%200%2095%20-61%20158%20-157%20164%20-47%203%20-66%20-1%20-97%20-19%20-72%20-42%20-107%20-149%20-71%20-218%209%20-17%2013%20-30%2010%20-30%20-14%200%20-104%2073%20-132%20107%20-88%20110%20-116%20218%20-115%20438%201%20169%2022%20846%2047%201500%2023%20606%2034%20971%2037%201200%202%20206%201%20212%20-22%20260%20-38%2074%20-66%2090%20-158%2089%20-62%20-1%20-93%20-7%20-159%20-33%20-134%20-52%20-212%20-72%20-315%20-78%20l-98%20-6%200%2032%200%2031%2073%200%20c93%200%20125%2010%20282%2083%20163%2076%20194%2086%20275%2086%2049%201%2078%20-5%20117%20-23z%20m-819%20-115%20c9%20-5%2012%20-25%2010%20-57%20l-3%20-49%20-71%202%20c-63%203%20-261%2037%20-271%2047%20-3%202%2031%2018%2074%2035%2065%2025%2092%2030%20163%2030%2047%201%2091%20-3%2098%20-8z%20m756%20-548%20c-6%20-301%20-12%20-376%20-27%20-370%20-9%203%20-11%2081%20-8%20303%202%20164%205%20302%208%20307%202%204%2011%207%2018%207%2013%200%2014%20-37%209%20-247z%20m320%20-299%20c17%20-16%2021%20-51%208%20-70%20-22%20-34%20-85%20-23%20-97%2016%20-16%2050%2052%2091%2089%2054z%20m16%20-254%20c14%20-26%205%20-57%20-21%20-71%20-46%20-24%20-93%2024%20-64%2067%2020%2031%2069%2033%2085%204z%20m607%20-192%20c54%20-45%20170%20-145%20258%20-222%2088%20-78%20186%20-163%20218%20-190%2066%20-56%2084%20-83%2068%20-99%20-15%20-15%20-33%200%20-291%20224%20-258%20225%20-380%20340%20-380%20357%200%2027%2034%208%20127%20-70z%20m-613%20-47%20c25%20-27%2017%20-72%20-15%20-90%20-24%20-13%20-29%20-13%20-53%202%20-47%2031%20-27%20107%2028%20107%2013%200%2031%20-9%2040%20-19z%20m-9%20-286%20c30%20-29%2031%20-45%204%20-79%20-20%20-25%20-53%20-33%20-75%20-18%20-13%209%20-34%2046%20-34%2062%200%2017%2047%2060%2065%2060%209%200%2027%20-11%2040%20-25z%20m82%20-7%20c-3%20-8%20-6%20-5%20-6%206%20-1%2011%202%2017%205%2013%203%20-3%204%20-12%201%20-19z%20m12%20-850%20c0%20-142%20-2%20-258%20-5%20-258%20-3%200%20-14%2010%20-25%2023%20-22%2027%20-24%2091%20-4%20127%2021%2037%2019%20120%20-5%20150%20-26%2033%20-25%2073%202%20138%2022%2053%2022%2054%204%20100%20-29%2075%20-30%20106%20-6%20165%2019%2045%2020%2058%2011%2094%20-6%2022%20-18%2046%20-26%2053%20-25%2021%20-19%2097%2010%20132%2014%2016%2026%2037%2027%2046%203%2033%2015%20-516%2017%20-770z%20m-105%20546%20c52%20-51%20-22%20-126%20-76%20-77%20-25%2022%20-23%2059%204%2077%2029%2020%2052%2020%2072%200z%20m-364%20-216%20c0%20-150%20-10%20-238%20-26%20-238%20-16%200%20-18%2080%20-7%20243%204%2071%2010%2097%2020%2097%2010%200%2013%20-23%2013%20-102z%20m364%20-54%20c34%20-33%2011%20-84%20-37%20-84%20-38%200%20-57%2015%20-57%2046%200%2029%2025%2054%2055%2054%2013%200%2031%20-7%2039%20-16z%20m483%20-33%20c41%20-37%2050%20-73%2032%20-124%20-17%20-49%20-52%20-77%20-107%20-84%20-49%20-7%20-83%2012%20-112%2060%20-32%2052%20-26%2093%2019%20138%2034%2035%2044%2039%2088%2039%2040%200%2054%20-5%2080%20-29z%20m-473%20-243%20c9%20-12%2016%20-30%2016%20-40%200%20-24%20-35%20-58%20-60%20-58%20-24%200%20-60%2038%20-60%2064%200%2052%2075%2076%20104%2034z%20m423%20-143%20c37%20-10%2073%20-62%2073%20-105%200%20-84%20-46%20-130%20-131%20-130%20-38%200%20-50%205%20-78%2034%20-45%2046%20-53%20108%20-20%20150%2025%2031%2095%2068%20119%2061%208%20-2%2025%20-6%2037%20-10z%20m-403%20-146%20c14%20-17%2026%20-42%2026%20-56%200%20-28%20-49%20-83%20-75%20-83%20-57%200%20-106%2069%20-86%20123%2021%2056%2094%2065%20135%2016z%20m-419%20-374%20c4%20-47%2013%20-111%2020%20-142%207%20-32%2012%20-59%2010%20-61%20-2%20-2%20-16%200%20-32%205%20-28%2010%20-28%2010%20-40%20139%20-9%2098%20-9%20131%200%20136%2028%2018%2035%206%2042%20-77z%20m784%2038%20c60%20-75%2026%20-163%20-63%20-163%20-37%200%20-48%205%20-70%2031%20-25%2029%20-36%2095%20-20%20112%204%203%2021%20-10%2040%20-30%2028%20-30%2036%20-34%2049%20-23%2022%2018%2018%2040%20-12%2072%20l-27%2028%2041%200%20c33%200%2046%20-5%2062%20-27z%20m-257%20-282%20c29%20-26%2033%20-35%2033%20-80%200%20-66%20-31%20-101%20-99%20-108%20-42%20-5%20-48%20-3%20-81%2030%20-39%2039%20-45%2078%20-20%20127%2034%2067%20111%2081%20167%2031z'/%3e%3cpath%20d='M2502%203761%20c-10%20-6%20-16%20-152%20-28%20-642%20-8%20-349%20-13%20-713%20-12%20-809%203%20-167%204%20-175%2023%20-175%2012%200%2022%209%2027%2025%206%2020%2033%201290%2033%201522%200%2060%20-19%2094%20-43%2079z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M3105%203235%20c-120%20-160%20-230%20-207%20-550%20-239%20-285%20-29%20-936%20-56%20-1350%20-56%20-148%200%20-299%20-5%20-335%20-11%20-193%20-31%20-313%20-165%20-313%20-349%20-1%20-160%2085%20-292%20224%20-347%2040%20-16%20106%20-18%20717%20-21%20l672%20-3%200%20-99%200%20-100%20-57%200%20c-89%200%20-179%2018%20-265%2052%20-66%2026%20-82%2029%20-103%2020%20-25%20-11%20-25%20-14%20-25%20-130%200%20-105%202%20-121%2019%20-136%2019%20-17%2022%20-17%2079%203%2033%2011%2088%2025%20123%2031%2042%206%20483%2010%201249%2010%20l1185%200%2050%2024%20c98%2046%20148%20126%20148%20233%20-1%20117%20-85%20217%20-203%20242%20-35%208%20-403%2011%20-1170%2011%20l-1120%200%200%20191%200%20191%20138%20-6%20c184%20-9%20423%20-33%20520%20-51%20175%20-33%20251%20-74%20364%20-195%20116%20-124%20140%20-110%20159%2092%2015%20169%207%20572%20-14%20647%20-16%2056%20-28%2071%20-64%2071%20-16%200%20-38%20-21%20-78%20-75z%20m106%20-127%20c16%20-164%201%20-630%20-20%20-627%20-3%200%20-29%2028%20-56%2062%20-147%20179%20-333%20226%20-1000%20257%20-282%2013%20-1239%2025%20-1286%2016%20-59%20-11%20-122%20-60%20-154%20-118%20-23%20-43%20-29%20-66%20-29%20-118%200%20-36%206%20-82%2013%20-104%2018%20-51%2076%20-115%20126%20-137%2038%20-18%20118%20-19%201778%20-19%201281%200%201750%20-3%201784%20-12%2087%20-21%20153%20-110%20153%20-203%20-1%20-81%20-74%20-166%20-160%20-184%20-35%20-8%20-396%20-11%20-1175%20-11%20l-1125%200%200%2025%200%2025%201138%200%201138%200%2044%2023%20c104%2053%20109%20209%208%20264%20-31%2017%20-123%2018%20-1803%2023%20-1956%206%20-1799%200%20-1876%2068%20-82%2072%20-121%20230%20-85%20340%2023%2069%2091%20143%20158%20173%2050%2022%2069%2023%20363%2030%201247%2031%201616%2059%201789%20138%2068%2031%20157%20107%20212%20183%2047%2063%2051%2057%2065%20-94z%20m-2343%20-638%20l-3%20-100%20-43%2021%20c-61%2030%20-95%2085%20-100%20160%20-7%20101%2036%20177%20118%20207%20l25%209%203%20-98%20c1%20-55%201%20-144%200%20-199z%20m72%20100%20c0%20-127%20-4%20-200%20-10%20-200%20-6%200%20-10%2073%20-10%20200%200%20127%204%20200%2010%20200%206%200%2010%20-73%2010%20-200z%20m230%200%20l0%20-200%20-92%200%20-93%200%200%20200%200%20200%2093%200%2092%200%200%20-200z%20m57%20-107%20c-1%20-59%20-3%20-13%20-3%20102%200%20116%202%20164%203%20108%202%20-56%202%20-151%200%20-210z%20m716%20290%20c4%20-2%207%20-89%207%20-194%20l0%20-189%20-335%200%20-335%200%200%20201%200%20201%20328%20-7%20c180%20-4%20330%20-9%20335%20-12z%20m87%20-188%20c0%20-188%20-1%20-195%20-20%20-195%20-19%200%20-20%207%20-20%20195%200%20188%201%20195%2020%20195%2019%200%2020%20-7%2020%20-195z%20m220%20-450%20c0%20-87%20-3%20-105%20-15%20-105%20-12%200%20-15%2018%20-15%2098%200%2054%203%20102%207%20105%2018%2019%2023%20-2%2023%20-98z%20m300%200%20c0%20-98%20-1%20-105%20-20%20-105%20-19%200%20-20%207%20-20%2098%200%20100%203%20112%2027%20112%2010%200%2013%20-24%2013%20-105z%20m-90%20-5%20l0%20-101%20-77%203%20-78%203%20-3%2098%20-3%2097%2081%200%2080%200%200%20-100z%20m1921%2071%20c48%20-49%2035%20-126%20-26%20-156%20-29%20-13%20-137%20-15%20-894%20-15%20l-861%200%200%20100%200%20100%20876%200%20876%200%2029%20-29z%20m-2563%20-171%20c23%20-11%2074%20-28%20112%20-36%2061%20-14%2070%20-19%2070%20-38%200%20-20%20-8%20-24%20-75%20-34%20-42%20-7%20-89%20-19%20-105%20-27%20-16%20-8%20-34%20-15%20-40%20-15%20-6%200%20-10%2032%20-10%2085%200%2047%201%2085%203%2085%202%200%2022%20-9%2045%20-20z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M3665%204495%20c-29%20-28%20-30%20-45%20-9%20-145%2031%20-144%20-5%20-310%20-103%20-481%20-99%20-172%20-220%20-314%20-579%20-679%20-143%20-146%20-313%20-319%20-377%20-384%20-113%20-117%20-117%20-119%20-142%20-106%20-21%2011%20-27%2011%20-43%20-3%20-26%20-24%20-34%20-22%20-70%2016%20-29%2030%20-32%2037%20-22%2061%2012%2033%200%2062%20-30%2071%20-22%207%20-57%20-15%20-132%20-84%20-44%20-39%20-46%20-51%20-16%20-91%2025%20-34%2043%20-37%2076%20-14%2022%2015%2025%2015%2044%20-2%2034%20-32%2042%20-54%2024%20-73%20-25%20-27%20-19%20-67%2015%20-105%2044%20-51%2026%20-65%20-22%20-16%20-45%2046%20-56%2048%20-93%2019%20l-26%20-21%20-30%2029%20c-30%2028%20-39%2057%20-20%2068%2028%2017%20-20%2095%20-59%2095%20-21%200%20-141%20-120%20-141%20-141%200%20-40%2077%20-88%2095%20-59%2010%2016%2018%2012%2047%20-24%20l28%20-35%20-20%20-34%20-21%20-35%2036%20-47%20c45%20-58%2037%20-71%20-13%20-22%20-42%2041%20-61%2045%20-98%2021%20-24%20-16%20-26%20-16%20-55%2012%20-28%2027%20-30%2037%20-15%2075%209%2020%20-39%2079%20-63%2079%20-18%200%20-151%20-128%20-151%20-146%200%20-11%2058%20-74%2069%20-74%204%200%2017%207%2030%2016%2022%2016%2024%2015%2054%20-15%2027%20-27%2030%20-34%2019%20-49%20-22%20-31%20-25%20-44%20-15%20-71%2010%20-25%201%20-35%20-207%20-241%20-218%20-215%20-271%20-282%20-286%20-359%20-5%20-23%20-49%20-71%20-183%20-199%20-261%20-250%20-292%20-276%20-369%20-307%20-197%20-81%20-223%20-100%20-208%20-159%208%20-33%20151%20-203%20190%20-227%2069%20-42%20104%20-23%20160%2089%2068%20134%20119%20199%20273%20347%20l143%20136%2024%20-54%20c44%20-100%20132%20-177%20253%20-223%2061%20-23%2079%20-25%20168%20-22%20169%207%20221%2040%20508%20317%20103%2099%20190%20181%20194%20181%203%200%2034%20-27%2069%20-60%2056%20-54%2066%20-60%20105%20-60%2038%200%2048%206%2096%2053%2045%2046%2053%2059%2053%2092%200%2035%20-9%2047%20-115%20155%20-109%20110%20-131%20140%20-103%20140%207%200%2067%20-54%20133%20-120%2076%20-75%20129%20-120%20142%20-120%2029%200%20114%2060%20141%20100%2037%2055%2031%2070%20-78%20187%20-55%2060%20-100%20114%20-100%20121%200%2029%2031%206%20123%20-93%2054%20-58%20109%20-108%20122%20-111%2032%20-8%2088%2021%20130%2067%2028%2031%2035%2047%2035%2080%200%2037%20-7%2048%20-67%20111%20l-68%2069%2080%2077%20c573%20550%20611%20590%20646%20682%2076%20200%2021%20400%20-143%20517%20-26%2019%20-48%2039%20-48%2044%200%2017%20149%20119%20252%20173%20140%2074%20235%2099%20368%20100%2058%200%20131%20-6%20162%20-13%2049%20-10%2061%20-10%2087%204%2070%2036%2030%20124%20-159%20350%20-112%20134%20-323%20349%20-445%20454%20-172%20148%20-204%20163%20-250%20116z%20m131%20-92%20c95%20-78%20349%20-328%20449%20-443%2092%20-106%20245%20-307%20245%20-322%200%20-7%20-20%20-7%20-57%20-2%20-32%205%20-112%209%20-178%208%20-104%200%20-132%20-4%20-205%20-28%20-142%20-47%20-314%20-144%20-441%20-248%20-45%20-37%20-46%20-37%20-115%20-31%20-82%207%20-172%20-13%20-241%20-54%20-43%20-25%20-256%20-221%20-575%20-530%20-121%20-117%20-148%20-137%20-148%20-112%200%207%20148%20161%20328%20343%20480%20484%20573%20586%20696%20763%20147%20212%20207%20444%20163%20633%20-13%2055%20-12%2080%202%2080%204%200%2038%20-26%2077%20-57z%20m-178%20-1168%20c81%20-44%20147%20-122%20172%20-202%2044%20-142%2017%20-250%20-98%20-390%20-19%20-24%20-38%20-43%20-42%20-43%20-5%200%20-14%2016%20-20%2035%20-11%2033%20-10%2038%2021%2072%2017%2021%2043%2061%2057%2091%2034%2074%2029%20187%20-11%20255%20-53%2090%20-148%20147%20-246%20147%20-98%200%20-128%20-24%20-578%20-455%20-566%20-543%20-699%20-670%20-1220%20-1177%20l-450%20-437%20-34%2029%20c-34%2028%20-34%2029%20-14%2048%2011%2010%20189%20178%20395%20372%20206%20194%20476%20453%20600%20574%20124%20122%20340%20330%20480%20462%20140%20133%20334%20317%20430%20409%20244%20232%20269%20247%20415%20242%2077%20-2%2098%20-7%20143%20-32z%20m-97%20-110%20c55%20-20%2085%20-47%20115%20-107%2032%20-64%2032%20-144%200%20-213%20-35%20-76%20-48%20-83%20-99%20-54%20-31%2018%20-57%2024%20-102%2024%20-80%200%20-97%20-13%20-370%20-279%20l-220%20-215%20-90%2090%20-90%2090%2055%2052%20c30%2029%20178%20169%20328%20312%20334%20318%20365%20338%20473%20300z%20m-1251%20-359%20c0%20-14%20-61%20-59%20-69%20-50%20-6%205%2050%2064%2061%2064%204%200%208%20-6%208%20-14z%20m1227%20-65%20c63%20-29%2091%20-103%2064%20-174%20-8%20-21%20-143%20-157%20-403%20-407%20-87%20-83%20-88%20-83%20-109%20-64%20l-21%2019%20241%20235%20c226%20220%20242%20237%20241%20270%200%2075%20-57%20103%20-116%2058%20-16%20-13%20-128%20-118%20-249%20-235%20-219%20-213%20-219%20-213%20-239%20-193%20-20%2020%20-20%2020%2019%2061%2022%2023%20131%20128%20242%20235%20188%20180%20226%20209%20278%20213%206%200%2029%20-8%2052%20-18z%20m-1027%20-96%20l24%20-25%20-44%20-45%20c-24%20-25%20-49%20-45%20-55%20-45%20-6%200%20-22%2012%20-36%2026%20l-24%2025%2050%2044%20c28%2024%2053%2044%2056%2045%203%200%2016%20-11%2029%20-25z%20m980%20-18%20c0%20-11%20-99%20-112%20-367%20-372%20-66%20-64%20-96%20-86%20-103%20-79%20-8%208%2056%2076%20222%20238%20128%20124%20236%20226%20240%20226%205%200%208%20-6%208%20-13z%20m-1428%20-50%20c-43%20-42%20-51%20-28%20-11%2018%2020%2022%2035%2032%2037%2025%203%20-7%20-9%20-26%20-26%20-43z%20m233%20-143%20c17%20-26%2017%20-27%20-26%20-70%20-24%20-24%20-48%20-44%20-54%20-44%20-6%200%20-22%2011%20-35%2025%20l-23%2024%2049%2045%20c27%2025%2054%2045%2060%2046%207%200%2019%20-12%2029%20-26z%20m652%20-275%20c153%20-160%20279%20-297%20281%20-305%204%20-18%20-60%20-84%20-81%20-84%20-8%200%20-32%2019%20-53%2043%20-21%2023%20-144%20154%20-273%20290%20-130%20136%20-238%20252%20-240%20258%20-3%2011%2067%2089%2080%2089%205%200%20133%20-131%20286%20-291z%20m-1107%20206%20c-18%20-19%20-36%20-32%20-39%20-30%20-2%203%2011%2021%2029%2040%2018%2019%2036%2032%2039%2030%202%20-3%20-11%20-21%20-29%20-40z%20m854%20-229%20c91%20-96%20166%20-179%20166%20-185%200%20-31%20-42%204%20-194%20164%20-147%20153%20-178%20195%20-147%20195%205%200%2083%20-78%20175%20-174z%20m-604%2070%20c0%20-14%20-81%20-96%20-95%20-96%20-6%200%20-22%2012%20-36%2026%20l-24%2026%2055%2049%2055%2048%2022%20-21%20c13%20-12%2023%20-26%2023%20-32z%20m511%20-118%20c79%20-84%20204%20-215%20277%20-290%20108%20-110%20133%20-140%20127%20-157%20-7%20-23%20-60%20-71%20-79%20-71%20-8%200%20-74%2064%20-147%20142%20-74%2078%20-198%20209%20-277%20292%20l-143%20150%2043%2043%20c23%2024%2045%2043%2049%2043%203%200%2071%20-69%20150%20-152z%20m-107%20-176%20c69%20-73%20126%20-137%20126%20-142%200%20-6%20-8%20-10%20-18%20-10%20-20%200%20-312%20301%20-312%20323%200%2028%2015%2027%2046%20-5%2017%20-18%2088%20-93%20158%20-166z%20m-624%2062%20c-123%20-125%20-373%20-354%20-380%20-347%20-8%208%20433%20433%20450%20433%208%200%20-24%20-39%20-70%20-86z%20m455%20-36%20c49%20-51%20176%20-182%20282%20-290%20106%20-108%20193%20-201%20193%20-206%200%20-16%20-78%20-84%20-92%20-80%20-8%201%20-139%20134%20-291%20293%20l-275%20290%2041%2043%20c23%2023%2044%2042%2047%2042%204%200%2046%20-42%2095%20-92z%20m-159%20-120%20c114%20-118%20117%20-92%20-27%20-232%20-69%20-66%20-133%20-137%20-142%20-158%20-21%20-45%20-22%20-133%20-2%20-172%2015%20-28%2014%20-31%20-12%20-59%20-46%20-48%20-101%20-71%20-168%20-71%20-133%200%20-235%20104%20-235%20241%200%2041%203%2044%20247%20282%20135%20133%20251%20241%20257%20241%206%200%2043%20-33%2082%20-72z%20m170%20-179%20c19%20-21%2019%20-21%20-91%20-127%20-120%20-115%20-145%20-145%20-145%20-180%200%20-26%2041%20-72%2065%20-72%209%200%2078%2058%20154%20130%20131%20123%20139%20129%20155%20111%2022%20-24%2021%20-30%20-11%20-59%20-16%20-14%20-76%20-72%20-134%20-129%20-106%20-102%20-107%20-103%20-155%20-103%20-58%201%20-88%2015%20-115%2056%20-28%2042%20-25%20103%207%20150%2024%2036%20232%20242%20245%20244%203%200%2014%20-10%2025%20-21z%20m-46%20-190%20c-63%20-59%20-117%20-105%20-120%20-102%20-3%203%2046%2054%20109%20114%2063%2060%20117%20106%20120%20103%203%20-4%20-46%20-55%20-109%20-115z%20m-766%20-150%20c23%20-144%20157%20-246%20311%20-237%2078%205%20117%2022%20175%2075%20l40%2035%2051%20-13%2052%20-13%20-49%20-44%20c-27%20-24%20-83%20-60%20-123%20-80%20-70%20-35%20-81%20-37%20-165%20-37%20-176%201%20-291%2080%20-360%20247%20-16%2037%20-16%2038%2015%2073%2017%2019%2035%2035%2039%2035%204%200%2010%20-18%2014%20-41z%20m-359%20-149%20l29%20-30%20-69%20-70%20-70%20-70%20-34%2035%20-35%2035%2069%2064%20c39%2036%2073%2065%2076%2066%203%200%2018%20-14%2034%20-30z%20m-191%20-184%20c30%20-36%2030%20-37%2012%20-64%20-9%20-15%20-38%20-69%20-62%20-119%20-25%20-51%20-50%20-93%20-57%20-93%20-13%200%20-116%20109%20-153%20162%20-15%2021%20-24%2044%20-21%2052%203%207%2041%2026%2084%2040%2043%2015%2094%2035%20113%2046%2019%2011%2039%2018%2044%2016%206%20-1%2023%20-19%2040%20-40z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4280%204525%20c-16%20-9%20-41%20-12%20-71%20-8%20-54%206%20-95%20-13%20-130%20-60%20-17%20-24%20-20%20-39%20-17%20-83%204%20-51%203%20-55%20-33%20-90%20l-37%20-36%20-36%2028%20c-26%2021%20-34%2034%20-30%2049%208%2032%20-36%2088%20-82%20104%20-48%2017%20-84%204%20-118%20-42%20-19%20-26%20-19%20-30%20-6%20-69%2011%20-32%2025%20-48%2055%20-65%2022%20-13%2048%20-23%2058%20-23%2026%200%2067%20-30%2067%20-49%200%20-9%20-20%20-33%20-44%20-53%20l-43%20-37%20-27%2028%20c-17%2017%20-26%2038%20-26%2058%200%2069%20-96%20130%20-158%20101%20-15%20-7%20-35%20-30%20-45%20-50%20-16%20-32%20-17%20-43%20-7%20-73%2014%20-42%2058%20-75%20110%20-82%2022%20-3%2048%20-15%2060%20-28%20l22%20-23%20-23%20-31%20c-19%20-26%20-441%20-433%20-590%20-569%20l-47%20-42%20-53%2036%20c-227%20153%20-450%20181%20-656%2083%20-93%20-44%20-211%20-163%20-283%20-284%20-64%20-109%20-92%20-141%20-147%20-165%20-38%20-16%20-63%20-44%20-63%20-68%200%20-5%2015%20-29%2034%20-52%2046%20-58%2052%20-98%2027%20-155%20-40%20-92%20-207%20-234%20-316%20-272%20-30%20-10%20-66%20-14%20-101%20-11%20-49%204%20-60%209%20-103%2052%20-58%2057%20-85%2058%20-116%207%20-50%20-83%20-97%20-122%20-220%20-183%20-146%20-71%20-233%20-135%20-301%20-219%20-261%20-324%20-189%20-784%20181%20-1155%20264%20-266%20569%20-424%20815%20-424%20297%200%20529%20181%20670%20522%2039%2096%2057%20118%20131%20169%2041%2027%2059%2046%2059%2061%200%2012%20-22%2044%20-49%2073%20-67%2070%20-80%20117%20-57%20205%2042%20165%20210%20349%20319%20350%2020%200%2040%20-12%2068%20-40%2061%20-61%2095%20-51%20135%2038%2033%2074%2061%20103%20164%20165%20155%2093%20266%20233%20305%20383%2045%20174%20-4%20393%20-132%20581%20l-35%2051%20223%20254%20c123%20139%20272%20303%20331%20363%20l108%20110%2024%20-30%20c14%20-16%2025%20-37%2026%20-46%200%20-34%2033%20-110%2053%20-124%2037%20-26%2094%20-19%20128%2014%2062%2063%2015%20159%20-91%20184%20-14%204%20-39%2020%20-55%2037%20l-29%2030%2044%2045%2044%2045%2027%20-26%20c15%20-14%2030%20-41%2033%20-59%209%20-44%2041%20-84%2083%20-101%2028%20-12%2038%20-12%2067%200%2038%2016%2066%2050%2066%2081%200%2056%20-70%20125%20-128%20125%20-12%200%20-36%2010%20-52%2022%20-28%2020%20-29%2023%20-14%2039%2011%2012%2038%2020%2084%2025%2081%208%20121%2029%20143%2077%2015%2031%2015%2039%202%2077%20-13%2037%20-13%2045%200%2070%2032%2061%2011%20121%20-59%20170%20-49%2033%20-95%2038%20-136%2015z%20m73%20-56%20c66%20-34%2083%20-79%2048%20-128%20-17%20-23%20-18%20-29%20-5%20-51%2014%20-27%2019%20-86%207%20-93%20-5%20-2%20-40%20-7%20-79%20-11%20l-72%20-7%20-61%2057%20-62%2057%203%2065%20c3%2057%206%2067%2030%2085%2026%2019%2028%2019%2053%203%2025%20-17%2028%20-16%2053%201%2024%2016%2050%2030%2060%2032%202%201%2013%20-4%2025%20-10z%20m-515%20-105%20c24%20-17%2030%20-59%208%20-67%20-19%20-8%20-60%2015%20-64%2036%20-4%2017%2014%2047%2027%2047%204%200%2017%20-7%2029%20-16z%20m112%20-265%20c-139%20-133%20-160%20-150%20-160%20-130%200%2013%20292%20282%20299%20275%203%20-3%20-59%20-68%20-139%20-145z%20m-274%2098%20c35%20-30%2027%20-57%20-16%20-57%20-23%200%20-33%206%20-42%2024%20-13%2029%20-5%2056%2016%2056%208%200%2027%20-11%2042%20-23z%20m468%20-5%20c6%20-10%20-277%20-292%20-293%20-292%20-29%200%20-1%2036%20131%20162%2079%2076%20146%20138%20150%20138%204%200%209%20-4%2012%20-8z%20m50%20-49%20c4%20-4%20-57%20-71%20-136%20-150%20-117%20-117%20-144%20-140%20-156%20-130%20-12%2010%2010%2035%20129%20149%2079%2076%20147%20138%20150%20138%203%200%209%20-3%2013%20-7z%20m161%20-199%20c22%20-23%2015%20-58%20-12%20-62%20-25%20-4%20-59%2039%20-49%2063%207%2020%2040%2019%2061%20-1z%20m-647%20-85%20c-24%20-23%20-324%20-321%20-668%20-663%20-344%20-342%20-646%20-641%20-671%20-664%20-44%20-40%20-47%20-41%20-63%20-23%20-16%2017%20-2%2032%20281%20302%20895%20855%201143%201089%201156%201089%205%200%20-11%20-19%20-35%20-41z%20m62%20-6%20c-12%20-15%20-162%20-174%20-334%20-353%20-172%20-179%20-473%20-495%20-670%20-702%20-197%20-208%20-361%20-378%20-365%20-378%20-4%200%20-17%2010%20-29%2023%20l-22%2023%20518%20515%20c684%20681%20905%20899%20915%20899%205%200%20-1%20-12%20-13%20-27z%20m-227%20-326%20c-153%20-167%20-440%20-480%20-638%20-696%20-198%20-216%20-376%20-411%20-395%20-434%20-33%20-37%20-37%20-39%20-58%20-26%20-12%208%20-22%2017%20-22%2022%200%2010%20969%201033%201274%201345%20210%20214%20117%2092%20-161%20-211z%20m317%20274%20c0%20-5%20-7%20-15%20-16%20-22%20-9%20-7%20-75%20-81%20-148%20-164%20-235%20-269%20-1082%20-1220%20-1152%20-1295%20-23%20-23%20-25%20-23%20-41%20-7%20-16%2016%20-15%2019%2013%2049%2017%2018%2079%2087%20140%20153%2060%2066%20161%20176%20225%20245%2063%2069%20211%20231%20329%20360%20352%20388%20634%20690%20642%20690%204%200%208%20-4%208%20-9z%20m349%20-54%20c17%20-44%20-15%20-63%20-51%20-30%20-21%2018%20-24%2059%20-5%2066%2018%207%2047%20-12%2056%20-36z%20m-1416%20-288%20c75%20-25%20232%20-110%20232%20-126%200%20-9%20-166%20-170%20-687%20-669%20-79%20-75%20-128%20-129%20-128%20-141%200%20-11%209%20-28%2020%20-38%2011%20-10%2020%20-21%2020%20-25%200%20-3%20-75%20-82%20-167%20-174%20l-168%20-167%20-20%2026%20-21%2025%20-26%20-27%20-27%20-28%2025%20-29%2025%20-28%20-63%20-67%20c-35%20-36%20-90%20-96%20-122%20-133%20l-58%20-67%20-27%2020%20c-15%2011%20-34%2017%20-42%2014%20-27%20-11%20-90%20-104%20-150%20-222%20-52%20-103%20-165%20-271%20-174%20-261%20-2%202%201%2028%207%2058%2021%20116%20-31%20250%20-136%20348%20-77%2071%20-165%20116%20-284%20145%20-50%2012%20-92%2025%20-92%2030%200%2025%2076%20152%20120%20200%2069%2076%20129%20118%20257%20182%20137%2067%20185%20103%20218%20160%2015%2025%2029%2045%2032%2045%203%200%2022%20-15%2043%20-34%2065%20-58%20168%20-66%20275%20-21%20117%2048%20297%20211%20330%20298%2024%2063%2016%20134%20-20%20188%20-21%2033%20-24%2043%20-13%2050%207%205%2018%209%2023%209%2026%200%2085%2066%20140%20155%2066%20108%20154%20210%20224%20257%2024%2017%2076%2042%20115%2055%2091%2030%20216%2027%20319%20-8z%20m578%20-474%20c152%20-250%20139%20-506%20-33%20-691%20-33%20-35%20-104%20-93%20-159%20-130%20-106%20-70%20-162%20-127%20-179%20-180%20l-11%20-33%20-36%2024%20c-93%2064%20-195%2041%20-303%20-66%20-194%20-194%20-245%20-424%20-122%20-547%2034%20-33%2035%20-36%2017%20-46%20-11%20-6%20-41%20-31%20-67%20-56%20-38%20-35%20-58%20-66%20-89%20-140%20-60%20-138%20-112%20-223%20-190%20-305%20-115%20-120%20-245%20-175%20-419%20-175%20-126%200%20-209%2021%20-335%2085%20-152%2077%20-150%2075%20-130%20116%2022%2042%2016%20116%20-13%20157%20-12%2016%20-22%2037%20-22%2045%200%2023%2096%20131%20182%20206%2042%2037%20127%2095%20190%20131%20122%2069%20192%20119%20209%20152%209%2017%206%2025%20-17%2049%20l-28%2029%20129%20130%20129%20130%2026%20-25%20c32%20-31%2054%20-32%2075%20-2%2015%2021%2014%2023%20-15%2050%20-27%2024%20-29%2030%20-18%2046%2028%2039%20293%20331%20301%20331%205%200%2022%20-11%2039%20-25%2016%20-14%2034%20-25%2038%20-25%2017%200%2084%2065%20209%20206%20487%20545%20577%20643%20585%20641%205%20-2%2031%20-39%2057%20-82z%20m-1074%20-571%20c3%20-9%20-298%20-343%20-317%20-352%20-4%20-1%20-14%206%20-24%2017%20-17%2019%20-13%2024%20145%20186%20150%20153%20186%20180%20196%20149z%20m53%20-49%20c13%20-16%2024%20-3%20-189%20-238%20-63%20-70%20-118%20-127%20-121%20-127%20-4%200%20-15%209%20-25%2020%20-17%2018%20-13%2024%20141%20189%2088%2094%20164%20171%20170%20171%206%200%2017%20-7%2024%20-15z%20m60%20-50%20c10%20-11%208%20-19%20-7%20-38%20-42%20-53%20-296%20-327%20-303%20-327%20-4%200%20-13%207%20-20%2015%20-15%2018%20-27%202%20164%20212%2076%2084%20142%20153%20146%20153%204%200%2013%20-7%2020%20-15z%20m-522%20-354%20c-182%20-200%20-209%20-226%20-218%20-211%20-5%208%20-10%2020%20-10%2026%200%205%2052%2068%20116%20138%20112%20122%20117%20127%20135%20110%2018%20-16%2018%20-18%20-23%20-63z%20m83%203%20c17%20-16%2012%20-24%20-108%20-150%20-99%20-105%20-129%20-131%20-140%20-123%20-7%206%20-13%2017%20-13%2024%200%2012%20227%20265%20238%20265%203%200%2013%20-7%2023%20-16z%20m-41%20-199%20c-69%20-69%20-130%20-125%20-136%20-125%20-6%200%20-16%206%20-22%2013%20-8%209%2020%2045%20115%20145%20l126%20133%2021%20-20%2021%20-21%20-125%20-125z%20m-1058%2045%20c137%20-42%20262%20-156%20294%20-267%2023%20-80%2014%20-156%20-30%20-249%20-65%20-138%20-60%20-169%2053%20-280%2057%20-57%2071%20-77%2071%20-101%200%20-43%20-23%20-60%20-57%20-42%20-47%2025%20-252%20229%20-319%20318%20-78%20103%20-147%20240%20-170%20336%20-18%2077%20-23%20218%20-11%20279%20l8%2039%2047%20-6%20c26%20-3%2077%20-15%20114%20-27z%20m803%20-170%20l102%20-100%20-21%20-19%20c-12%20-10%20-64%20-43%20-116%20-72%20-52%20-29%20-119%20-70%20-149%20-92%20-73%20-54%20-192%20-168%20-238%20-229%20l-38%20-49%20-27%2031%20c-16%2016%20-28%2036%20-28%2044%200%207%2039%2055%2087%20107%20119%20129%20162%20190%20223%20316%2052%20107%2085%20163%2098%20163%203%200%2051%20-45%20107%20-100z'/%3e%3cpath%20d='M1905%202459%20c-53%20-28%20-85%20-53%20-180%20-139%20-135%20-123%20-211%20-162%20-250%20-130%20-20%2017%20-19%2030%203%2030%2026%200%2042%2020%2042%2052%200%2022%20-6%2031%20-27%2039%20-55%2021%20-104%20-51%20-82%20-118%2015%20-48%2053%20-73%20107%20-73%2066%200%20119%2030%20227%20128%20161%20146%20207%20182%20235%20182%2022%20-1%2023%20-2%208%20-11%20-35%20-20%20-14%20-89%2026%20-89%2058%200%2074%2073%2027%20121%20-36%2036%20-79%2038%20-136%208z'/%3e%3cpath%20d='M2365%202078%20c-38%20-22%20-46%20-55%20-19%20-82%2022%20-22%2050%20-20%2073%206%2018%2018%2021%2019%2027%205%2010%20-26%20-21%20-76%20-126%20-206%20-119%20-146%20-145%20-189%20-160%20-258%20-22%20-103%2017%20-163%20108%20-163%2060%200%20104%2058%2075%2099%20-11%2016%20-23%2021%20-46%2019%20-26%20-2%20-34%20-9%20-42%20-36%20-19%20-66%20-54%20-4%20-36%2064%2013%2049%2052%20109%20127%20194%2068%2078%20129%20169%20145%20217%208%2027%209%2045%200%2073%20-17%2056%20-84%2093%20-126%2068z'/%3e%3cpath%20d='M4422%203364%20c-26%20-18%20-182%20-229%20-592%20-799%20-178%20-247%20-380%20-529%20-450%20-625%20-70%20-96%20-297%20-413%20-505%20-705%20-208%20-291%20-393%20-550%20-411%20-574%20-19%20-24%20-34%20-48%20-34%20-52%200%20-10%2029%20-39%2040%20-39%205%200%2030%2027%2055%2060%2025%2033%2050%2060%2055%2060%205%200%2029%20-14%2054%20-31%2070%20-50%2075%20-46%20228%20168%20165%20231%20758%201074%20818%201163%2062%2092%20432%20603%20693%20958%2059%2081%20111%20158%20114%20172%204%2014%20-2%2054%20-11%2090%20-10%2036%20-18%2070%20-17%2075%201%206%204%2026%207%2046%207%2042%20-11%2056%20-44%2033z%20m-2%20-216%20c0%20-17%20-21%20-55%20-63%20-110%20-101%20-135%20-388%20-530%20-584%20-803%20-103%20-145%20-287%20-406%20-591%20-840%20-294%20-420%20-333%20-475%20-340%20-475%20-3%200%20-18%2012%20-34%2026%20-23%2023%20-25%2030%20-16%2048%2020%2037%20357%20514%20552%20781%20104%20143%20269%20370%20365%20505%20277%20389%20632%20882%20660%20918%20l26%2032%2012%20-27%20c7%20-16%2012%20-40%2013%20-55z%20m-1645%20-2263%20c23%20-19%2028%20-28%2020%20-39%20-5%20-8%20-28%20-42%20-50%20-75%20-44%20-67%20-60%20-73%20-100%20-38%20l-26%2022%2032%2045%20c67%2093%2080%20110%2087%20110%204%20-1%2021%20-12%2037%20-25z'/%3e%3c/g%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='128'%20height='128'%20viewBox='0%200%20512.000000%20512.000000'%3e%3cg%20transform='translate(0.000000,512.000000)%20scale(0.100000,-0.100000)'%20fill='%23000000'%20stroke='none'%3e%3cpath%20d='M4315%204533%20c-22%20-9%20-62%20-15%20-90%20-14%20-92%203%20-153%20-60%20-141%20-144%205%20-39%202%20-46%20-34%20-86%20l-40%20-43%20-30%2029%20c-17%2016%20-28%2035%20-25%2043%2017%2044%20-61%20122%20-123%20122%20-44%200%20-92%20-43%20-92%20-82%200%20-38%2064%20-105%20108%20-114%2017%20-3%2043%20-19%2058%20-35%20l28%20-29%20-39%20-40%20c-22%20-22%20-43%20-40%20-48%20-40%20-18%200%20-56%2057%20-57%2084%200%2019%20-12%2040%20-39%2067%20-32%2032%20-46%2039%20-78%2039%20-51%200%20-90%20-30%20-99%20-74%20-11%20-62%2048%20-136%20110%20-136%2023%200%2041%20-9%2062%20-31%20l29%20-31%20-41%20-36%20c-22%20-21%20-167%20-156%20-320%20-302%20-154%20-146%20-292%20-276%20-306%20-289%20l-27%20-23%20-60%2036%20c-86%2053%20-198%20102%20-259%20115%20-77%2016%20-219%2014%20-283%20-5%20-144%20-42%20-290%20-165%20-384%20-324%20-48%20-81%20-79%20-112%20-167%20-165%20-48%20-30%20-50%20-69%20-4%20-124%2065%20-78%2046%20-143%20-78%20-266%20-88%20-87%20-171%20-138%20-254%20-155%20-72%20-16%20-119%20-1%20-170%2055%20-60%2066%20-89%2061%20-132%20-24%20-33%20-66%20-67%20-92%20-191%20-150%20-198%20-91%20-317%20-198%20-393%20-352%20-74%20-150%20-91%20-271%20-61%20-444%2039%20-224%20150%20-411%20367%20-621%20131%20-126%20236%20-203%20371%20-275%20295%20-155%20613%20-127%20831%2072%2083%2076%20146%20171%20214%20323%2029%2066%2059%20127%2065%20135%207%208%2037%2030%2067%2049%2086%2055%2088%2064%2026%20130%20-59%2064%20-69%2087%20-69%20152%202%20131%20128%20326%20252%20390%2061%2031%20104%2027%20150%20-15%2021%20-19%2047%20-35%2058%20-35%2025%200%2055%2032%2087%2097%2026%2053%2064%2088%20171%20158%2091%2060%20197%20170%20234%20242%20101%20202%2075%20454%20-70%20672%20l-49%2075%2033%2035%20c18%2020%20119%20131%20222%20246%20104%20116%20243%20267%20308%20337%20l119%20127%2029%20-21%20c22%20-17%2029%20-30%2029%20-55%200%20-87%2082%20-149%20156%20-118%2065%2027%2075%20106%2021%20160%20-19%2019%20-47%2037%20-63%2041%20-31%208%20-104%2050%20-104%2060%200%209%2071%2088%2083%2093%2018%207%2067%20-52%2067%20-82%200%20-42%2066%20-107%20109%20-107%2090%200%20132%2079%2080%20151%20-21%2030%20-75%2059%20-109%2059%20-22%200%20-80%2035%20-80%2048%201%2016%2078%2042%20107%2036%2020%20-4%2043%201%2071%2015%2069%2035%2088%2081%2057%20141%20-14%2028%20-14%2033%206%2071%2026%2052%2020%2093%20-21%20137%20-26%2029%20-85%2063%20-107%2062%20-4%20-1%20-26%20-8%20-48%20-17z%20m96%20-82%20c34%20-35%2036%20-58%208%20-105%20-19%20-32%20-19%20-37%20-5%20-65%2036%20-69%2013%20-92%20-89%20-89%20-66%202%20-69%203%20-119%2052%20-47%2045%20-51%2053%20-53%20100%20-4%2068%203%2093%2028%20107%2015%208%2028%208%2049%20-1%2023%20-10%2034%20-8%2066%209%2053%2028%2080%2026%20115%20-8z%20m-539%20-88%20c22%20-20%2023%20-36%203%20-53%20-31%20-26%20-90%2024%20-64%2056%2015%2019%2038%2018%2061%20-3z%20m201%20-156%20c-222%20-232%20-242%20-252%20-253%20-241%20-8%208%2028%2049%20136%20153%2081%2077%20150%20139%20152%20136%203%20-3%20-12%20-24%20-35%20-48z%20m-363%203%20c24%20-24%2025%20-34%204%20-54%20-21%20-21%20-36%20-20%20-62%204%20-25%2023%20-28%2040%20-10%2058%2018%2018%2045%2015%2068%20-8z%20m305%20-134%20c-127%20-130%20-163%20-162%20-153%20-137%208%2021%20265%20281%20278%20281%208%200%20-49%20-65%20-125%20-144z%20m163%20115%20c-8%20-20%20-278%20-294%20-284%20-288%20-4%204%2055%2071%20132%20151%20126%20130%20162%20163%20152%20137z%20m35%20-37%20c7%20-7%20-261%20-294%20-274%20-294%20-25%200%203%2038%20122%20163%2072%2075%20134%20137%20138%20137%204%200%2011%20-3%2014%20-6z%20m171%20-203%20c40%20-44%20-12%20-83%20-54%20-41%20-16%2016%20-18%2024%20-10%2040%2014%2025%2042%2026%2064%201z%20m-894%20-323%20c-168%20-166%20-498%20-494%20-733%20-727%20-355%20-353%20-431%20-423%20-444%20-415%20-9%206%20-18%2015%20-20%2021%20-2%205%2076%2086%20174%20179%2098%2093%20273%20259%20388%20369%20116%20110%20316%20300%20445%20422%20129%20121%20289%20273%20355%20337%2066%2063%20125%20115%20130%20115%206%201%20-127%20-135%20-295%20-301z%20m280%20205%20c-30%20-32%20-214%20-222%20-410%20-423%20-195%20-201%20-452%20-467%20-570%20-590%20-118%20-124%20-254%20-267%20-302%20-317%20-88%20-92%20-89%20-93%20-113%20-77%20-14%209%20-25%2020%20-25%2024%200%207%201011%201009%201335%201322%20134%20130%20179%20162%2085%2061z%20m60%20-10%20c-18%20-21%20-90%20-99%20-160%20-173%20-206%20-219%20-492%20-531%20-859%20-933%20l-344%20-378%20-23%2022%20-24%2022%2042%2046%20c162%20179%201378%201431%201390%201431%205%200%20-5%20-17%20-22%20-37z%20m70%201%20c0%20-3%20-69%20-80%20-153%20-172%20-286%20-312%20-558%20-619%20-897%20-1008%20-19%20-22%20-100%20-113%20-179%20-203%20-137%20-155%20-144%20-161%20-162%20-145%20-15%2014%20-16%2020%20-6%2034%207%2010%20179%20199%20382%20421%20204%20222%20394%20430%20424%20463%20130%20146%20575%20616%20583%20616%204%200%208%20-3%208%20-6z%20m336%20-60%20c8%20-29%20-2%20-44%20-28%20-44%20-24%200%20-58%2027%20-58%2046%200%207%207%2019%2015%2028%2021%2020%2063%202%2071%20-30z%20m-1441%20-326%20c76%20-25%20229%20-108%20226%20-123%20-1%20-6%20-181%20-181%20-399%20-389%20-218%20-208%20-401%20-389%20-406%20-402%20-8%20-19%20-5%20-29%2013%20-48%20l22%20-24%20-163%20-171%20-163%20-170%20-20%2019%20c-49%2046%20-103%20-4%20-57%20-53%20l20%20-22%20-123%20-130%20c-119%20-126%20-124%20-129%20-142%20-112%20-11%209%20-24%2017%20-30%2017%20-23%200%20-82%20-81%20-146%20-201%20-63%20-116%20-175%20-280%20-196%20-287%20-6%20-2%20-5%2012%201%2035%2013%2046%206%20143%20-15%20202%20-51%20144%20-196%20256%20-395%20304%20-48%2011%20-89%2022%20-90%2023%20-2%201%2015%2039%2038%2084%2048%2090%20129%20181%20213%20234%2028%2018%2099%2057%20157%2086%20131%2065%20165%2090%20191%20143%2012%2023%2023%2043%2024%2045%202%202%2024%20-13%2049%20-32%2092%20-70%20180%20-72%20313%20-6%2093%2046%20227%20163%20270%20237%2053%2091%2050%20171%20-8%20238%20l-31%2035%2027%2010%20c67%2026%20113%2070%20174%20169%20104%20170%20233%20276%20371%20308%2073%2017%20188%209%20275%20-19z%20m557%20-451%20c88%20-131%20131%20-306%20109%20-439%20-25%20-154%20-99%20-254%20-285%20-387%20-114%20-81%20-160%20-128%20-186%20-191%20l-13%20-30%20-35%2027%20c-81%2061%20-198%2035%20-304%20-69%20-185%20-181%20-240%20-423%20-122%20-540%20l36%20-37%20-40%20-25%20c-55%20-35%20-83%20-74%20-137%20-195%20-68%20-150%20-111%20-217%20-190%20-297%20-83%20-83%20-159%20-128%20-263%20-155%20-158%20-40%20-315%20-19%20-489%2067%20-136%2067%20-141%2072%20-118%20120%2022%2046%2014%20104%20-21%20157%20-23%2036%20-24%2040%20-10%2062%2075%20115%20222%20243%20392%20340%20123%2071%20171%20108%20186%20141%2010%2020%208%2028%20-12%2049%20l-23%2024%20118%20126%20c65%2069%20120%20125%20123%20125%202%200%2017%20-11%2034%20-25%2023%20-20%2033%20-23%2049%20-15%2025%2014%2024%2048%20-2%2077%20l-22%2022%2077%2085%20c42%2046%20115%20124%20161%20172%20l85%2088%2028%20-27%20c37%20-36%2064%20-34%2097%206%20122%20145%20722%20806%20730%20804%205%20-2%2027%20-29%2047%20-60z%20m-1057%20-588%20c0%20-8%20-71%20-89%20-157%20-180%20-148%20-154%20-159%20-163%20-174%20-147%20-16%2016%20-8%2027%20141%20183%20149%20157%20190%20188%20190%20144z%20m55%20-44%20c15%20-18%20-3%20-41%20-184%20-230%20-123%20-129%20-124%20-130%20-145%20-111%20-21%2019%20-21%2019%20140%20187%2089%2093%20165%20169%20169%20169%204%200%2013%20-7%2020%20-15z%20m60%20-60%20c11%20-13%20-12%20-41%20-147%20-183%20-88%20-92%20-164%20-167%20-168%20-167%20-4%200%20-12%207%20-18%2016%20-9%2014%2017%2046%20144%20182%2085%2091%20159%20166%20165%20166%206%201%2017%20-6%2024%20-14z%20m-506%20-271%20c9%20-3%2016%20-12%2016%20-19%200%20-7%20-53%20-68%20-117%20-135%20-91%20-93%20-122%20-120%20-135%20-115%20-10%204%20-18%2012%20-18%2017%200%207%20230%20258%20237%20258%201%200%208%20-3%2017%20-6z%20m17%20-153%20c-38%20-42%20-94%20-100%20-125%20-130%20-47%20-46%20-57%20-52%20-70%20-41%20-9%207%20-16%2017%20-16%2022%200%205%2055%2066%20122%20134%20115%20117%20122%20123%20140%20108%2017%20-16%2014%20-20%20-51%20-93z%20m119%2015%20c0%20-6%20-54%20-65%20-119%20-130%20-84%20-84%20-124%20-117%20-135%20-113%20-9%204%20-16%2011%20-16%2018%200%206%2055%2067%20122%20135%2095%2097%20124%20121%20135%20113%207%20-6%2013%20-17%2013%20-23z%20m-1163%20-87%20c115%20-38%20217%20-119%20263%20-209%2052%20-102%2047%20-210%20-16%20-329%20-53%20-100%20-42%20-164%2040%20-226%2043%20-32%2096%20-110%2096%20-140%200%20-12%20-6%20-29%20-13%20-39%20-12%20-17%20-20%20-13%20-104%2057%20-204%20172%20-343%20359%20-409%20552%20-24%2071%20-28%2095%20-28%20210%20-1%2072%202%20137%206%20146%205%2014%2014%2015%2055%208%2026%20-5%2076%20-18%20110%20-30z%20m805%20-159%20l103%20-100%20-25%20-19%20c-14%20-11%20-47%20-32%20-75%20-47%20-160%20-86%20-344%20-234%20-432%20-349%20-29%20-37%20-33%20-39%20-59%20-30%20-60%2021%20-43%2061%2083%20199%2088%2095%20144%20178%20213%20317%2055%20109%2067%20129%2080%20129%205%200%2055%20-45%20112%20-100z'/%3e%3cpath%20d='M1885%202435%20c-32%20-20%20-95%20-69%20-141%20-110%20-138%20-126%20-241%20-182%20-265%20-144%20-13%2022%20-11%2027%2018%2041%2034%2016%2041%2043%2017%2069%20-40%2045%20-104%201%20-104%20-72%200%20-29%208%20-47%2029%20-71%2026%20-30%2035%20-33%2083%20-33%2073%201%20136%2039%20272%20165%20112%20104%20149%20130%20188%20130%2017%200%2019%20-3%2010%20-12%20-22%20-22%20-14%20-57%2015%20-64%2038%20-10%2058%207%2061%2053%203%2034%20-1%2044%20-24%2062%20-40%2032%20-90%2027%20-159%20-14z'/%3e%3cpath%20d='M2347%202052%20c-10%20-10%20-17%20-27%20-17%20-38%200%20-43%2050%20-60%2072%20-24%2015%2024%2024%2025%2032%204%2011%20-27%20-29%20-96%20-109%20-189%20-81%20-95%20-143%20-181%20-163%20-228%20-16%20-38%20-15%20-122%202%20-156%2025%20-47%2083%20-63%20135%20-36%2045%2023%2055%2069%2022%2099%20-26%2024%20-52%2017%20-71%20-19%20-8%20-17%20-16%20-32%20-18%20-35%20-7%20-11%20-22%2028%20-22%2059%200%2053%2031%20106%20136%20231%2053%2063%20107%20138%20120%20165%2049%20103%2020%20185%20-64%20185%20-25%200%20-45%20-7%20-55%20-18z'/%3e%3cpath%20d='M4424%203373%20c-25%20-25%20-327%20-432%20-526%20-708%20-338%20-471%20-520%20-723%20-591%20-820%20-40%20-55%20-191%20-266%20-336%20-470%20-146%20-203%20-322%20-449%20-391%20-545%20-165%20-228%20-158%20-216%20-138%20-236%2024%20-24%2048%20-10%2096%2056%20l42%2060%2051%20-40%20c28%20-22%2054%20-40%2058%20-40%2021%200%2059%2044%20137%20158%2048%2070%20138%20197%20199%20282%2061%2085%20273%20385%20470%20665%20366%20520%20531%20749%20805%201118%2085%20114%20163%20222%20173%20239%2021%2039%2022%2099%203%20162%20-11%2035%20-12%2053%20-3%2075%208%2023%208%2033%20-2%2045%20-17%2020%20-25%2020%20-47%20-1z%20m0%20-172%20c8%20-54%20-4%20-81%20-83%20-186%20-37%20-49%20-106%20-142%20-153%20-205%20-46%20-63%20-117%20-159%20-156%20-212%20-109%20-147%20-390%20-543%20-657%20-923%20-229%20-326%20-524%20-745%20-532%20-754%20-5%20-6%20-63%2051%20-63%2061%200%2011%20314%20457%20569%20808%20101%20140%20246%20340%20320%20443%2075%20104%20253%20349%20395%20545%20142%20197%20277%20382%20300%20414%2023%2031%2044%2054%2047%2052%204%20-2%209%20-21%2013%20-43z%20m-1660%20-2310%20c18%20-18%2026%20-36%2023%20-46%20-10%20-25%20-87%20-135%20-95%20-135%20-4%200%20-21%2014%20-39%2030%20l-32%2030%2052%2074%20c29%2041%2055%2075%2058%2075%203%201%2018%20-12%2033%20-28z'/%3e%3c/g%3e%3c/svg%3e\"","{\n \"version\": 1,\n \"source\": \"https://raw.githubusercontent.com/gleitz/midi-js-soundfonts/gh-pages/FluidR3_GM/names.json\",\n \"programNumbering\": \"GM 1-128\",\n \"icons\": {\n \"piano\": \"src/icons/piano.svg\",\n \"guitar\": \"src/icons/guitar.svg\",\n \"bassguitar\": \"src/icons/bassguitar.svg\",\n \"double-bass\": \"src/icons/double-bass.svg\",\n \"drum-kit\": \"src/icons/drum-kit.svg\",\n \"alto-saxophone\": \"src/icons/alto-saxophone.svg\",\n \"tenor-saxophone\": \"src/icons/tenor-saxophone.svg\",\n \"bari-saxophone\": \"src/icons/bari-saxophone.svg\",\n \"flute\": \"src/icons/flute.svg\",\n \"clarinet\": \"src/icons/clarinet.svg\",\n \"trumpet\": \"src/icons/trumpet.svg\",\n \"trombone\": \"src/icons/trombone.svg\",\n \"violin\": \"src/icons/violin.svg\",\n \"viola\": \"src/icons/viola.svg\",\n \"cello\": \"src/icons/cello.svg\",\n \"microphone\": \"src/icons/microphone.svg\"\n },\n \"programs\": [\n {\n \"program\": 1,\n \"soundfont\": \"acoustic_grand_piano\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/acoustic_grand_piano.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 2,\n \"soundfont\": \"bright_acoustic_piano\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/bright_acoustic_piano.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 3,\n \"soundfont\": \"electric_grand_piano\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/electric_grand_piano.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 4,\n \"soundfont\": \"honkytonk_piano\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/honkytonk_piano.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 5,\n \"soundfont\": \"electric_piano_1\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/electric_piano_1.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 6,\n \"soundfont\": \"electric_piano_2\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/electric_piano_2.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 7,\n \"soundfont\": \"harpsichord\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/harpsichord.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 8,\n \"soundfont\": \"clavinet\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/clavinet.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 9,\n \"soundfont\": \"celesta\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/celesta.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 10,\n \"soundfont\": \"glockenspiel\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/glockenspiel.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 11,\n \"soundfont\": \"music_box\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/music_box.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 12,\n \"soundfont\": \"vibraphone\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/vibraphone.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 13,\n \"soundfont\": \"marimba\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/marimba.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 14,\n \"soundfont\": \"xylophone\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/xylophone.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 15,\n \"soundfont\": \"tubular_bells\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/tubular_bells.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 16,\n \"soundfont\": \"dulcimer\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/dulcimer.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 17,\n \"soundfont\": \"drawbar_organ\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/drawbar_organ.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 18,\n \"soundfont\": \"percussive_organ\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/percussive_organ.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 19,\n \"soundfont\": \"rock_organ\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/rock_organ.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 20,\n \"soundfont\": \"church_organ\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/church_organ.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 21,\n \"soundfont\": \"reed_organ\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/reed_organ.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 22,\n \"soundfont\": \"accordion\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/accordion.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 23,\n \"soundfont\": \"harmonica\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/harmonica.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 24,\n \"soundfont\": \"tango_accordion\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/tango_accordion.json\",\n \"family\": \"Keyboard\"\n },\n {\n \"program\": 25,\n \"soundfont\": \"acoustic_guitar_nylon\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/acoustic_guitar_nylon.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 26,\n \"soundfont\": \"acoustic_guitar_steel\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/acoustic_guitar_steel.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 27,\n \"soundfont\": \"electric_guitar_jazz\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/electric_guitar_jazz.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 28,\n \"soundfont\": \"electric_guitar_clean\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/electric_guitar_clean.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 29,\n \"soundfont\": \"electric_guitar_muted\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/electric_guitar_muted.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 30,\n \"soundfont\": \"overdriven_guitar\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/overdriven_guitar.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 31,\n \"soundfont\": \"distortion_guitar\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/distortion_guitar.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 32,\n \"soundfont\": \"guitar_harmonics\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/guitar_harmonics.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 33,\n \"soundfont\": \"acoustic_bass\",\n \"icon\": \"double-bass\",\n \"localPack\": \"/soundfonts/fluidr3/acoustic_bass.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 34,\n \"soundfont\": \"electric_bass_finger\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/electric_bass_finger.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 35,\n \"soundfont\": \"electric_bass_pick\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/electric_bass_pick.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 36,\n \"soundfont\": \"fretless_bass\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/fretless_bass.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 37,\n \"soundfont\": \"slap_bass_1\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/slap_bass_1.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 38,\n \"soundfont\": \"slap_bass_2\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/slap_bass_2.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 39,\n \"soundfont\": \"synth_bass_1\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/synth_bass_1.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 40,\n \"soundfont\": \"synth_bass_2\",\n \"icon\": \"bassguitar\",\n \"localPack\": \"/soundfonts/fluidr3/synth_bass_2.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 41,\n \"soundfont\": \"violin\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/violin.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 42,\n \"soundfont\": \"viola\",\n \"icon\": \"viola\",\n \"localPack\": \"/soundfonts/fluidr3/viola.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 43,\n \"soundfont\": \"cello\",\n \"icon\": \"cello\",\n \"localPack\": \"/soundfonts/fluidr3/cello.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 44,\n \"soundfont\": \"contrabass\",\n \"icon\": \"double-bass\",\n \"localPack\": \"/soundfonts/fluidr3/contrabass.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 45,\n \"soundfont\": \"tremolo_strings\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/tremolo_strings.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 46,\n \"soundfont\": \"pizzicato_strings\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/pizzicato_strings.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 47,\n \"soundfont\": \"orchestral_harp\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/orchestral_harp.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 48,\n \"soundfont\": \"timpani\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/timpani.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 49,\n \"soundfont\": \"string_ensemble_1\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/string_ensemble_1.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 50,\n \"soundfont\": \"string_ensemble_2\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/string_ensemble_2.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 51,\n \"soundfont\": \"synth_strings_1\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/synth_strings_1.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 52,\n \"soundfont\": \"synth_strings_2\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/synth_strings_2.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 53,\n \"soundfont\": \"choir_aahs\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/choir_aahs.json\",\n \"family\": \"Voice\"\n },\n {\n \"program\": 54,\n \"soundfont\": \"voice_oohs\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/voice_oohs.json\",\n \"family\": \"Voice\"\n },\n {\n \"program\": 55,\n \"soundfont\": \"synth_choir\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/synth_choir.json\",\n \"family\": \"Voice\"\n },\n {\n \"program\": 56,\n \"soundfont\": \"orchestra_hit\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/orchestra_hit.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 57,\n \"soundfont\": \"trumpet\",\n \"icon\": \"trumpet\",\n \"localPack\": \"/soundfonts/fluidr3/trumpet.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 58,\n \"soundfont\": \"trombone\",\n \"icon\": \"trombone\",\n \"localPack\": \"/soundfonts/fluidr3/trombone.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 59,\n \"soundfont\": \"tuba\",\n \"icon\": \"trombone\",\n \"localPack\": \"/soundfonts/fluidr3/tuba.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 60,\n \"soundfont\": \"muted_trumpet\",\n \"icon\": \"trumpet\",\n \"localPack\": \"/soundfonts/fluidr3/muted_trumpet.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 61,\n \"soundfont\": \"french_horn\",\n \"icon\": \"trombone\",\n \"localPack\": \"/soundfonts/fluidr3/french_horn.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 62,\n \"soundfont\": \"brass_section\",\n \"icon\": \"trumpet\",\n \"localPack\": \"/soundfonts/fluidr3/brass_section.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 63,\n \"soundfont\": \"synth_brass_1\",\n \"icon\": \"trumpet\",\n \"localPack\": \"/soundfonts/fluidr3/synth_brass_1.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 64,\n \"soundfont\": \"synth_brass_2\",\n \"icon\": \"trumpet\",\n \"localPack\": \"/soundfonts/fluidr3/synth_brass_2.json\",\n \"family\": \"Brass\"\n },\n {\n \"program\": 65,\n \"soundfont\": \"soprano_sax\",\n \"icon\": \"alto-saxophone\",\n \"localPack\": \"/soundfonts/fluidr3/soprano_sax.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 66,\n \"soundfont\": \"alto_sax\",\n \"icon\": \"alto-saxophone\",\n \"localPack\": \"/soundfonts/fluidr3/alto_sax.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 67,\n \"soundfont\": \"tenor_sax\",\n \"icon\": \"tenor-saxophone\",\n \"localPack\": \"/soundfonts/fluidr3/tenor_sax.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 68,\n \"soundfont\": \"baritone_sax\",\n \"icon\": \"bari-saxophone\",\n \"localPack\": \"/soundfonts/fluidr3/baritone_sax.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 69,\n \"soundfont\": \"oboe\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/oboe.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 70,\n \"soundfont\": \"english_horn\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/english_horn.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 71,\n \"soundfont\": \"bassoon\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/bassoon.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 72,\n \"soundfont\": \"clarinet\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/clarinet.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 73,\n \"soundfont\": \"piccolo\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/piccolo.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 74,\n \"soundfont\": \"flute\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/flute.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 75,\n \"soundfont\": \"recorder\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/recorder.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 76,\n \"soundfont\": \"pan_flute\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/pan_flute.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 77,\n \"soundfont\": \"blown_bottle\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/blown_bottle.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 78,\n \"soundfont\": \"shakuhachi\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/shakuhachi.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 79,\n \"soundfont\": \"whistle\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/whistle.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 80,\n \"soundfont\": \"ocarina\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/ocarina.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 81,\n \"soundfont\": \"lead_1_square\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_1_square.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 82,\n \"soundfont\": \"lead_2_sawtooth\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_2_sawtooth.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 83,\n \"soundfont\": \"lead_3_calliope\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_3_calliope.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 84,\n \"soundfont\": \"lead_4_chiff\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_4_chiff.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 85,\n \"soundfont\": \"lead_5_charang\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_5_charang.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 86,\n \"soundfont\": \"lead_6_voice\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/lead_6_voice.json\",\n \"family\": \"Voice\"\n },\n {\n \"program\": 87,\n \"soundfont\": \"lead_7_fifths\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_7_fifths.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 88,\n \"soundfont\": \"lead_8_bass__lead\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/lead_8_bass__lead.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 89,\n \"soundfont\": \"pad_1_new_age\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_1_new_age.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 90,\n \"soundfont\": \"pad_2_warm\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_2_warm.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 91,\n \"soundfont\": \"pad_3_polysynth\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_3_polysynth.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 92,\n \"soundfont\": \"pad_4_choir\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/pad_4_choir.json\",\n \"family\": \"Voice\"\n },\n {\n \"program\": 93,\n \"soundfont\": \"pad_5_bowed\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_5_bowed.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 94,\n \"soundfont\": \"pad_6_metallic\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_6_metallic.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 95,\n \"soundfont\": \"pad_7_halo\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_7_halo.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 96,\n \"soundfont\": \"pad_8_sweep\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/pad_8_sweep.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 97,\n \"soundfont\": \"fx_1_rain\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_1_rain.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 98,\n \"soundfont\": \"fx_2_soundtrack\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_2_soundtrack.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 99,\n \"soundfont\": \"fx_3_crystal\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_3_crystal.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 100,\n \"soundfont\": \"fx_4_atmosphere\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_4_atmosphere.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 101,\n \"soundfont\": \"fx_5_brightness\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_5_brightness.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 102,\n \"soundfont\": \"fx_6_goblins\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_6_goblins.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 103,\n \"soundfont\": \"fx_7_echoes\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_7_echoes.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 104,\n \"soundfont\": \"fx_8_scifi\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/fx_8_scifi.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 105,\n \"soundfont\": \"sitar\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/sitar.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 106,\n \"soundfont\": \"banjo\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/banjo.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 107,\n \"soundfont\": \"shamisen\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/shamisen.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 108,\n \"soundfont\": \"koto\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/koto.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 109,\n \"soundfont\": \"kalimba\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/kalimba.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 110,\n \"soundfont\": \"bagpipe\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/bagpipe.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 111,\n \"soundfont\": \"fiddle\",\n \"icon\": \"violin\",\n \"localPack\": \"/soundfonts/fluidr3/fiddle.json\",\n \"family\": \"Strings\"\n },\n {\n \"program\": 112,\n \"soundfont\": \"shanai\",\n \"icon\": \"clarinet\",\n \"localPack\": \"/soundfonts/fluidr3/shanai.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 113,\n \"soundfont\": \"tinkle_bell\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/tinkle_bell.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 114,\n \"soundfont\": \"agogo\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/agogo.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 115,\n \"soundfont\": \"steel_drums\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/steel_drums.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 116,\n \"soundfont\": \"woodblock\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/woodblock.json\",\n \"family\": \"Percussion\"\n },\n {\n \"program\": 117,\n \"soundfont\": \"taiko_drum\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/taiko_drum.json\",\n \"family\": \"Drums\"\n },\n {\n \"program\": 118,\n \"soundfont\": \"melodic_tom\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/melodic_tom.json\",\n \"family\": \"Drums\"\n },\n {\n \"program\": 119,\n \"soundfont\": \"synth_drum\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/synth_drum.json\",\n \"family\": \"Drums\"\n },\n {\n \"program\": 120,\n \"soundfont\": \"reverse_cymbal\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/reverse_cymbal.json\",\n \"family\": \"Drums\"\n },\n {\n \"program\": 121,\n \"soundfont\": \"guitar_fret_noise\",\n \"icon\": \"guitar\",\n \"localPack\": \"/soundfonts/fluidr3/guitar_fret_noise.json\",\n \"family\": \"Guitar\"\n },\n {\n \"program\": 122,\n \"soundfont\": \"breath_noise\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/breath_noise.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 123,\n \"soundfont\": \"seashore\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/seashore.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 124,\n \"soundfont\": \"bird_tweet\",\n \"icon\": \"flute\",\n \"localPack\": \"/soundfonts/fluidr3/bird_tweet.json\",\n \"family\": \"Woodwinds\"\n },\n {\n \"program\": 125,\n \"soundfont\": \"telephone_ring\",\n \"icon\": \"piano\",\n \"localPack\": \"/soundfonts/fluidr3/telephone_ring.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 126,\n \"soundfont\": \"helicopter\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/helicopter.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 127,\n \"soundfont\": \"applause\",\n \"icon\": \"microphone\",\n \"localPack\": \"/soundfonts/fluidr3/applause.json\",\n \"family\": \"FX / Other\"\n },\n {\n \"program\": 128,\n \"soundfont\": \"gunshot\",\n \"icon\": \"drum-kit\",\n \"localPack\": \"/soundfonts/fluidr3/gunshot.json\",\n \"family\": \"FX / Other\"\n }\n ],\n \"voices\": [\n {\n \"id\": \"piano\",\n \"label\": \"Piano\",\n \"icon\": \"piano\",\n \"program\": 1,\n \"localPack\": \"/soundfonts/fluidr3/acoustic_grand_piano.json\"\n },\n {\n \"id\": \"guitar\",\n \"label\": \"Guitar\",\n \"icon\": \"guitar\",\n \"program\": 25,\n \"localPack\": \"/soundfonts/fluidr3/acoustic_guitar_nylon.json\"\n },\n {\n \"id\": \"bassguitar\",\n \"label\": \"Bass Guitar\",\n \"icon\": \"bassguitar\",\n \"program\": 34,\n \"localPack\": \"/soundfonts/fluidr3/electric_bass_finger.json\"\n },\n {\n \"id\": \"double-bass\",\n \"label\": \"Double Bass\",\n \"icon\": \"double-bass\",\n \"program\": 33,\n \"localPack\": \"/soundfonts/fluidr3/acoustic_bass.json\"\n },\n {\n \"id\": \"drum-kit\",\n \"label\": \"Drum Kit\",\n \"icon\": \"drum-kit\",\n \"program\": null,\n \"localPack\": \"/soundfonts/TimGM6mb.sf2\"\n },\n {\n \"id\": \"alto-saxophone\",\n \"label\": \"Alto Saxophone\",\n \"icon\": \"alto-saxophone\",\n \"program\": 66,\n \"localPack\": \"/soundfonts/fluidr3/alto_sax.json\"\n },\n {\n \"id\": \"tenor-saxophone\",\n \"label\": \"Tenor Saxophone\",\n \"icon\": \"tenor-saxophone\",\n \"program\": 67,\n \"localPack\": \"/soundfonts/fluidr3/tenor_sax.json\"\n },\n {\n \"id\": \"bari-saxophone\",\n \"label\": \"Baritone Saxophone\",\n \"icon\": \"bari-saxophone\",\n \"program\": 68,\n \"localPack\": \"/soundfonts/fluidr3/baritone_sax.json\"\n },\n {\n \"id\": \"flute\",\n \"label\": \"Flute\",\n \"icon\": \"flute\",\n \"program\": 74,\n \"localPack\": \"/soundfonts/fluidr3/flute.json\"\n },\n {\n \"id\": \"clarinet\",\n \"label\": \"Clarinet\",\n \"icon\": \"clarinet\",\n \"program\": 72,\n \"localPack\": \"/soundfonts/fluidr3/clarinet.json\"\n },\n {\n \"id\": \"trumpet\",\n \"label\": \"Trumpet\",\n \"icon\": \"trumpet\",\n \"program\": 57,\n \"localPack\": \"/soundfonts/fluidr3/trumpet.json\"\n },\n {\n \"id\": \"trombone\",\n \"label\": \"Trombone\",\n \"icon\": \"trombone\",\n \"program\": 58,\n \"localPack\": \"/soundfonts/fluidr3/trombone.json\"\n },\n {\n \"id\": \"violin\",\n \"label\": \"Violin\",\n \"icon\": \"violin\",\n \"program\": 41,\n \"localPack\": \"/soundfonts/fluidr3/violin.json\"\n },\n {\n \"id\": \"viola\",\n \"label\": \"Viola\",\n \"icon\": \"viola\",\n \"program\": 42,\n \"localPack\": \"/soundfonts/fluidr3/viola.json\"\n },\n {\n \"id\": \"cello\",\n \"label\": \"Cello\",\n \"icon\": \"cello\",\n \"program\": 43,\n \"localPack\": \"/soundfonts/fluidr3/cello.json\"\n },\n {\n \"id\": \"microphone\",\n \"label\": \"Voice\",\n \"icon\": \"microphone\",\n \"program\": 54,\n \"localPack\": \"/soundfonts/fluidr3/voice_oohs.json\"\n }\n ]\n}\n","import manifest from './gm-soundfont-manifest.json';\nimport type { SourceDocument } from './notation/document';\nconst iconUrls = import.meta.glob('../icons/*.svg', { eager: true, query: '?url', import: 'default' }) as Record<string, string>;\n\nexport type Pitch = { step: string; octave: number; alter: number; midi: number; sourceId?: string; unpitched?: boolean; displayStep?: string; displayOctave?: number; accidental?: string; cautionary?: boolean; tieStart?: boolean; tieStop?: boolean };\n/** Key mode from the source (MusicXML <mode>, MEI @mode); absent means major. */\nexport type KeyMode = 'major' | 'minor';\nexport type Transposition = { semitones: number; diatonic?: number };\nexport type ScoreNote = { id: string; sourceId?: string; start: number; duration: number; pitches: Pitch[]; transposition?: Transposition; chordSymbol?: string; lyric?: string; beamStart?: boolean; beamEnd?: boolean; rest?: boolean; dotted?: boolean; dots?: number; writtenType?: string; voice?: string; stem?: string; grace?: boolean; tuplet?: { actual: number; normal: number; number: string; start?: boolean; stop?: boolean }; slurStart?: string[]; slurStop?: string[]; tieStart?: boolean; tieStop?: boolean };\nexport type ScoreDirection = { start: number; symbols?: string[]; text?: string; placement?: 'above' | 'below'; voice?: string; wedge?: { type: string; number: string }; soundDynamics?: number; tempo?: number };\n/** A repeat barline inside a bar, at an exact quarter-note offset from the bar start (\"3\", \"5/2\"). */\nexport type BarlineNavigation = { beat: string; repeatStart?: boolean; repeatEnd?: boolean; repeatTimes?: number };\n/**\n * Format-neutral written navigation of one measure, filled by every importer.\n * Bar-level marks apply at the bar start (repeatStart, segno, coda) or the bar\n * end (repeatEnd, toCoda, daCapo, dalSegno, fine); `barlines` holds repeats\n * that fall inside the bar. JSON-serializable.\n */\nexport type MeasureNavigation = {\n repeatStart?: boolean; repeatEnd?: boolean;\n /** Total plays of a repeatEnd; omitted means 2, or the last ending number when the repeat ends inside an ending. */\n repeatTimes?: number;\n /** Volta numbers of the ending bracket this measure belongs to. */\n endings?: number[];\n segno?: boolean; coda?: boolean; toCoda?: boolean; daCapo?: boolean; dalSegno?: boolean; fine?: boolean;\n barlines?: BarlineNavigation[];\n};\nexport type Measure = { index: number; beats: number; notes: ScoreNote[]; dynamics?: { start: number; symbol: string }[]; directions?: ScoreDirection[]; nominalBeats?: number; number?: string; implicit?: boolean; key?: number; keyMode?: KeyMode; clef?: string; beatsPerBar?: number; beatType?: number; transposition?: Transposition; navigation?: MeasureNavigation };\nexport type Part = { id: string; name: string; clef: string; key?: number; keyMode?: KeyMode; instrument: InstrumentId; gmProgram?: number; gmSoundfont?: string; pitchBasis?: 'written' | 'concert'; transposition?: Transposition; measures: Measure[] };\nexport type Score = { title: string; subtitle?: string; composer?: string; credits?: string[]; source: string; tempo: number; beats: number; beatType: number; key: number; keyMode?: KeyMode; parts: Part[];\n /** Set on a transposed or flipped view of a score (transpose.ts `scoreForView`). */\n pitchView?: import('./transpose').PitchView; document?: SourceDocument };\nexport type InstrumentId = 'piano' | 'guitar' | 'bassguitar' | 'double-bass' | 'drum-kit' | 'alto-saxophone' | 'tenor-saxophone' | 'bari-saxophone' | 'flute' | 'clarinet' | 'trumpet' | 'trombone' | 'violin' | 'viola' | 'cello' | 'microphone';\nexport const GM_FAMILIES = ['Keyboard', 'Guitar', 'Voice', 'Percussion', 'Drums', 'Woodwinds', 'Brass', 'Strings', 'FX / Other'] as const;\nexport type GmFamily = typeof GM_FAMILIES[number];\nexport type GmSound = { program: number | null; label: string; soundfont: string | null; iconId: InstrumentId; icon: string; family: GmFamily };\nconst iconFor = (id: InstrumentId) => iconUrls[`../icons/${manifest.icons[id].split('/').at(-1)}`];\nexport const GM_SOUNDS: GmSound[] = [\n { program: null, label: 'Drum Kit', soundfont: null, iconId: 'drum-kit', icon: iconFor('drum-kit'), family: 'Drums' },\n ...manifest.programs.map(entry => ({ program: entry.program, label: gmSoundfontLabel(entry.soundfont), soundfont: entry.soundfont, iconId: entry.icon as InstrumentId, icon: iconFor(entry.icon as InstrumentId), family: entry.family as GmFamily })),\n];\n\nexport const INSTRUMENTS: { id: InstrumentId; label: string; program: number; icon: string; soundfont: string | null; localPack: string }[] = manifest.voices.map(voice => ({\n id: voice.id as InstrumentId,\n label: voice.label,\n program: voice.program === null ? 0 : voice.program - 1,\n icon: iconFor(voice.icon as InstrumentId),\n soundfont: voice.program === null ? null : manifest.programs[voice.program - 1].soundfont,\n localPack: voice.localPack,\n}));\nexport function instrumentForProgram(program: number): InstrumentId {\n return (manifest.programs[program]?.icon || 'piano') as InstrumentId;\n}\nexport function gmProgramForVirtualName(library: string, name: string) {\n if (library.toLowerCase().replace(/[^a-z]/g, '') !== 'generalmidi') return undefined;\n const normalized = name.toLowerCase().replace(/[^a-z0-9]/g, '');\n return manifest.programs.find(entry => entry.soundfont.replace(/[^a-z0-9]/g, '') === normalized);\n}\nexport function gmProgramForNumber(program: number) {\n return Number.isInteger(program) && program >= 1 && program <= 128 ? manifest.programs[program - 1] : undefined;\n}\n/** GM program (1-128) of a FluidR3 sound name. */\nexport function gmProgramForSoundfont(name: string): number | undefined {\n return manifest.programs.find(entry => entry.soundfont === name)?.program;\n}\nexport function isGmSoundfont(name: string) {\n return manifest.programs.some(entry => entry.soundfont === name);\n}\nexport function gmSoundfontLabel(name: string) {\n return name.split('_').filter(Boolean).map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');\n}\nexport const instrumentDetails = (id: InstrumentId) => INSTRUMENTS.find(item => item.id === id)!;\nexport const ucfirst = (name: string) => name ? name.charAt(0).toLocaleUpperCase() + name.slice(1) : name;\n\nconst semitones: Record<string, number> = { C: 0, D: 2, E: 4, F: 5, G: 7, A: 9, B: 11 };\nexport function pitch(step: string, octave: number, alter = 0): Pitch {\n const s = step.toUpperCase();\n return { step: s, octave, alter, midi: (octave + 1) * 12 + semitones[s] + alter };\n}\nexport function midiPitch(midi: number): Pitch {\n const names = ['C', 'C', 'D', 'D', 'E', 'F', 'F', 'G', 'G', 'A', 'A', 'B'];\n const altered = [0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0];\n const pc = ((midi % 12) + 12) % 12;\n return pitch(names[pc], Math.floor(midi / 12) - 1, altered[pc]);\n}\nexport function noteName(p: Pitch): string { return `${p.step}${p.alter === 1 ? '♯' : p.alter === -1 ? '♭' : ''}${p.octave}`; }\nexport function instrumentForName(name: string): InstrumentId {\n const n = name.toLowerCase();\n if (/drum|percussion/.test(n)) return 'drum-kit';\n if (/bass guitar|bassguitar|electric bass/.test(n)) return 'bassguitar';\n if (/double bass|contrabass|acoustic bass|upright bass|\\bbass\\b/.test(n)) return 'double-bass';\n if (/guitar/.test(n)) return 'guitar';\n if (/baritone sax|bari sax/.test(n)) return 'bari-saxophone';\n if (/tenor sax/.test(n)) return 'tenor-saxophone';\n if (/sax/.test(n)) return 'alto-saxophone';\n if (/flute/.test(n)) return 'flute';\n if (/clarinet/.test(n)) return 'clarinet';\n if (/trumpet/.test(n)) return 'trumpet';\n if (/trombone/.test(n)) return 'trombone';\n if (/violin/.test(n)) return 'violin';\n if (/viola/.test(n)) return 'viola';\n if (/cello/.test(n)) return 'cello';\n if (/voice|vocal|choir|singer/.test(n)) return 'microphone';\n return 'piano';\n}\nexport function exampleScore(): Score {\n const notes = [\n [[60, 64, 67], [62, 65, 69], [64, 67, 72], [65, 69, 72]],\n [[67, 71, 74], [65, 69, 72], [64, 67, 72], [62, 65, 69]],\n [[60, 64, 67], [64, 67, 72], [67, 72, 76], [64, 67, 72]],\n [[62, 65, 69], [65, 69, 74], [67, 71, 74], [60, 64, 67]],\n ];\n return { title: 'A little room to play', composer: 'Sample score', source: 'sample', tempo: 96, beats: 4, beatType: 4, key: 0, parts: [\n { id: 'p1', name: 'Piano', clef: 'treble', instrument: 'piano', measures: Array.from({ length: 24 }, (_, index) => ({ index, beats: 4, notes: notes[index % 4].map((chord, beat) => ({ id: `p1-${index}-${beat}`, start: beat, duration: 1, pitches: chord.map(midiPitch) })) })) },\n ] };\n}\n","/** Exact rational numbers for sub-bar positions (\"0\", \"3\", \"5/2\"). */\nexport type Fraction = { n: number; d: number };\n\nconst gcd = (a: number, b: number): number => { a = Math.abs(a); b = Math.abs(b); while (b) [a, b] = [b, a % b]; return a || 1; };\n\nexport function fraction(n: number, d = 1): Fraction {\n if (!Number.isInteger(n) || !Number.isInteger(d) || d === 0) throw new Error(`Invalid fraction ${n}/${d}`);\n if (d < 0) { n = -n; d = -d; }\n const g = gcd(n, d);\n return { n: n / g, d: d / g };\n}\n\n/** The closest rational with a bounded denominator (continued fractions); exact for tuplet-sized values. */\nexport function fromNumber(value: number, maxDenominator = 30240): Fraction {\n if (!Number.isFinite(value)) throw new Error(`Invalid beat ${value}`);\n const sign = value < 0 ? -1 : 1;\n let x = Math.abs(value);\n let [h0, h1, k0, k1] = [0, 1, 1, 0];\n for (let i = 0; i < 64; i++) {\n const a = Math.floor(x);\n const h2 = a * h1 + h0, k2 = a * k1 + k0;\n if (k2 > maxDenominator) break;\n [h0, h1, k0, k1] = [h1, h2, k1, k2];\n const rest = x - a;\n if (rest < 1e-12 || Math.abs(h1 / k1 - Math.abs(value)) < 1e-12) break;\n x = 1 / rest;\n }\n return fraction(sign * h1, k1 || 1);\n}\n\n/** Parses \"5/2\", \"3\", \"2.5\" or \"-1/4\"; undefined for anything else. */\nexport function parseFraction(text: unknown): Fraction | undefined {\n if (typeof text !== 'string') return undefined;\n const rational = /^\\s*(-?\\d{1,9})(?:\\s*\\/\\s*(\\d{1,9}))?\\s*$/.exec(text);\n if (rational) return rational[2] === undefined ? fraction(Number(rational[1])) : Number(rational[2]) > 0 ? fraction(Number(rational[1]), Number(rational[2])) : undefined;\n const decimal = /^\\s*(-?\\d{1,9})\\.(\\d{1,6})\\s*$/.exec(text);\n if (decimal) { const scale = 10 ** decimal[2].length; return fraction(Number(decimal[1]) * scale + Math.sign(Number(decimal[1] + '1')) * Number(decimal[2]), scale); }\n return undefined;\n}\n\nexport const addFraction = (a: Fraction, b: Fraction) => fraction(a.n * b.d + b.n * a.d, a.d * b.d);\nexport const subFraction = (a: Fraction, b: Fraction) => fraction(a.n * b.d - b.n * a.d, a.d * b.d);\nexport const compareFraction = (a: Fraction, b: Fraction) => Math.sign(a.n * b.d - b.n * a.d);\nexport const fractionValue = (a: Fraction) => a.n / a.d;\nexport const formatFraction = (a: Fraction) => a.d === 1 ? String(a.n) : `${a.n}/${a.d}`;\nexport const ZERO: Fraction = { n: 0, d: 1 };\n","/**\n * A small, strict, streaming (SAX-style) XML 1.0 tokenizer with no DOM dependency, so MusicXML can be read in a\n * worker (workers have no DOMParser). It reports start tags (with source offsets, so callers can splice the original\n * text), end tags and character data, and rejects what a browser's DOMParser rejects for the documents we read:\n * mismatched or unclosed tags, malformed or duplicate attributes, undefined entities, bad character references,\n * misplaced declarations, `--` in comments, `]]>` in text, illegal control characters and content outside the root.\n *\n * Not supported (rejected as invalid, like most non-validating browser parsers would mis-handle anyway): parameter\n * entities and entity values containing markup. Internal-subset general entities with plain text values are expanded.\n *\n * Character data follows the XML spec: line ends are normalized to LF, attribute values have literal tab/LF\n * normalized to a space (CDATA attribute type, since no external DTD is loaded) and references are decoded.\n */\n\nexport class XmlError extends Error {\n constructor(readonly detail: string, readonly offset: number) { super('This file is not valid XML.'); }\n}\n\nexport type XmlAttribute = {\n /** Qualified name, as written. */\n name: string;\n /** Normalized, decoded value. */\n value: string;\n /** Offset of the attribute name and one past its closing quote, for splicing. */\n start: number; end: number;\n};\n\nexport type XmlHandler = {\n /**\n * A start tag. `start` is the offset of `<`, `end` one past `>`. `attributes` is reused by the tokenizer only if\n * the handler does not keep it; the tokenizer always passes a fresh array.\n */\n startElement(name: string, attributes: XmlAttribute[], start: number, end: number, selfClosing: boolean): void;\n /** An end tag (also sent right after a self-closing start tag, with the same offsets). */\n endElement(name: string, start: number, end: number): void;\n /** Character data inside the root element (text and CDATA), decoded. Optional: skipped when absent. */\n text?(value: string): void;\n /** The general entities the DOCTYPE's internal subset declares (name → replacement text), once it is read. */\n doctype?(entities: Readonly<Record<string, string>>): void;\n};\n\nconst PREDEFINED: Record<string, string> = { lt: '<', gt: '>', amp: '&', apos: \"'\", quot: '\"' };\n/** Characters XML 1.0 forbids anywhere in a document (C0 controls other than tab/LF/CR, and U+FFFE/U+FFFF). */\nconst ILLEGAL_CHARS = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]/;\n\nconst isWhite = (c: number) => c === 0x20 || c === 0x0A || c === 0x09 || c === 0x0D;\nconst isNameStart = (c: number) => (c >= 0x61 && c <= 0x7A) || (c >= 0x41 && c <= 0x5A) || c === 0x5F || c === 0x3A || (c >= 0xC0 && c !== 0xD7 && c !== 0xF7);\nconst isNameChar = (c: number) => isNameStart(c) || (c >= 0x30 && c <= 0x39) || c === 0x2D || c === 0x2E || c === 0xB7;\n\n/** Local name of a qualified name (`mx:note` → `note`). */\nexport const localNameOf = (name: string) => { const colon = name.indexOf(':'); return colon < 0 ? name : name.slice(colon + 1); };\n\nfunction validCodePoint(code: number): boolean {\n return code === 0x9 || code === 0xA || code === 0xD || (code >= 0x20 && code <= 0xD7FF) || (code >= 0xE000 && code <= 0xFFFD) || (code >= 0x10000 && code <= 0x10FFFF);\n}\n\n/**\n * Tokenize `text`, calling `handler` for each start tag, end tag and run of character data. Throws XmlError when\n * the document is not well-formed. Returns the qualified name of the root element.\n */\nexport function scanXml(text: string, handler: XmlHandler): string {\n if (ILLEGAL_CHARS.test(text)) throw new XmlError('illegal character', text.search(ILLEGAL_CHARS));\n const n = text.length;\n let i = text.charCodeAt(0) === 0xFEFF ? 1 : 0;\n const bodyStart = i;\n const entities: Record<string, string> = Object.create(null);\n const stack: string[] = [];\n let root: string | undefined;\n let rootClosed = false;\n let sawDoctype = false;\n const fail = (detail: string, at = i): never => { throw new XmlError(detail, at); };\n\n /** Decode references in `raw` (offset `at` for errors). */\n const decode = (raw: string, at: number): string => {\n let out = '';\n let from = 0;\n for (let amp = raw.indexOf('&'); amp >= 0; amp = raw.indexOf('&', from)) {\n const semi = raw.indexOf(';', amp + 1);\n if (semi < 0) fail('unterminated reference', at + amp);\n const ref = raw.slice(amp + 1, semi);\n let value: string | undefined;\n if (ref.charCodeAt(0) === 0x23) {\n const hex = ref.charCodeAt(1) === 0x78;\n const digits = ref.slice(hex ? 2 : 1);\n if (!digits || !(hex ? /^[0-9A-Fa-f]+$/ : /^[0-9]+$/).test(digits)) fail('bad character reference', at + amp);\n const code = parseInt(digits, hex ? 16 : 10);\n if (!validCodePoint(code)) fail('character reference to an illegal character', at + amp);\n value = String.fromCodePoint(code);\n } else {\n if (!ref || !isNameStart(ref.charCodeAt(0)) || ![...ref].every(ch => isNameChar(ch.charCodeAt(0)))) fail('bad entity reference', at + amp);\n value = PREDEFINED[ref] ?? entities[ref];\n if (value === undefined) fail(`undefined entity &${ref};`, at + amp);\n }\n out += raw.slice(from, amp) + value;\n from = semi + 1;\n }\n return from ? out + raw.slice(from) : raw;\n };\n const normalizeLines = (raw: string) => raw.indexOf('\\r') < 0 ? raw : raw.replace(/\\r\\n?/g, '\\n');\n const attributeValue = (raw: string, at: number) => {\n if (raw.indexOf('<') >= 0) fail('\"<\" in an attribute value', at);\n const literal = /[\\t\\n\\r]/.test(raw) ? normalizeLines(raw).replace(/[\\t\\n]/g, ' ') : raw;\n return literal.indexOf('&') < 0 ? literal : decode(literal, at);\n };\n const readName = (): string => {\n const start = i;\n if (i >= n || !isNameStart(text.charCodeAt(i))) fail('expected a name');\n i++;\n while (i < n && isNameChar(text.charCodeAt(i))) i++;\n return text.slice(start, i);\n };\n const skipWhite = () => { while (i < n && isWhite(text.charCodeAt(i))) i++; };\n const expect = (literal: string) => { if (!text.startsWith(literal, i)) fail(`expected \"${literal}\"`); i += literal.length; };\n const quoted = (): string => {\n const quote = text.charCodeAt(i);\n if (quote !== 0x22 && quote !== 0x27) fail('expected a quoted value');\n const close = text.indexOf(quote === 0x22 ? '\"' : \"'\", i + 1);\n if (close < 0) fail('unterminated quoted value');\n const value = text.slice(i + 1, close);\n i = close + 1;\n return value;\n };\n\n const characterData = (start: number, end: number) => {\n const raw = text.slice(start, end);\n if (!stack.length) {\n if (!/^[ \\t\\r\\n]*$/.test(raw)) fail('text outside the root element', start);\n return;\n }\n if (raw.indexOf(']]>') >= 0) fail('\"]]>\" in text', start + raw.indexOf(']]>'));\n const lines = normalizeLines(raw);\n const value = lines.indexOf('&') < 0 ? lines : decode(lines, start);\n handler.text?.(value);\n };\n\n const doctype = () => {\n if (sawDoctype || root) fail('misplaced DOCTYPE');\n sawDoctype = true;\n i += 9;\n if (!isWhite(text.charCodeAt(i))) fail('expected whitespace after DOCTYPE');\n skipWhite(); readName(); skipWhite();\n if (text.startsWith('SYSTEM', i)) { i += 6; skipWhite(); quoted(); skipWhite(); }\n else if (text.startsWith('PUBLIC', i)) { i += 6; skipWhite(); quoted(); skipWhite(); quoted(); skipWhite(); }\n if (text.charCodeAt(i) === 0x5B) {\n i++;\n // Internal subset: markup declarations, comments, PIs and parameter-entity references.\n for (;;) {\n skipWhite();\n if (i >= n) fail('unterminated DOCTYPE');\n if (text.charCodeAt(i) === 0x5D) { i++; break; }\n if (text.startsWith('<!--', i)) { comment(); continue; }\n if (text.startsWith('<?', i)) { processingInstruction(); continue; }\n if (text.charCodeAt(i) === 0x25) fail('parameter entities are not supported');\n if (text.startsWith('<!ENTITY', i)) {\n i += 8;\n if (!isWhite(text.charCodeAt(i))) fail('expected whitespace in ENTITY');\n skipWhite();\n if (text.charCodeAt(i) === 0x25) fail('parameter entities are not supported');\n const name = readName(); skipWhite();\n if (text.charCodeAt(i) === 0x22 || text.charCodeAt(i) === 0x27) {\n const at = i;\n const raw = quoted();\n if (raw.indexOf('<') >= 0) fail('entity values with markup are not supported', at);\n // The first declaration of an entity is binding.\n if (!(name in entities)) entities[name] = decode(normalizeLines(raw), at);\n } else {\n // External entity: not loaded, so references to it are undefined (like a browser parser).\n if (text.startsWith('SYSTEM', i)) { i += 6; skipWhite(); quoted(); }\n else if (text.startsWith('PUBLIC', i)) { i += 6; skipWhite(); quoted(); skipWhite(); quoted(); }\n else fail('bad ENTITY declaration');\n skipWhite();\n if (text.startsWith('NDATA', i)) { i += 5; skipWhite(); readName(); }\n }\n skipWhite(); expect('>');\n continue;\n }\n if (text.startsWith('<!', i)) {\n // ELEMENT / ATTLIST / NOTATION: skip, honouring quoted strings.\n i += 2;\n while (i < n && text.charCodeAt(i) !== 0x3E) { if (text.charCodeAt(i) === 0x22 || text.charCodeAt(i) === 0x27) quoted(); else i++; }\n expect('>');\n continue;\n }\n fail('bad internal subset');\n }\n skipWhite();\n }\n expect('>');\n handler.doctype?.(entities);\n };\n function comment() {\n const close = text.indexOf('--', i + 4);\n if (close < 0) fail('unterminated comment');\n if (text.charCodeAt(close + 2) !== 0x3E) fail('\"--\" in a comment', close);\n i = close + 3;\n }\n function processingInstruction() {\n const start = i;\n i += 2;\n const target = readName();\n if (target.toLowerCase() === 'xml' && (start !== bodyStart || target !== 'xml')) fail('misplaced XML declaration', start);\n const close = text.indexOf('?>', i);\n if (close < 0) fail('unterminated processing instruction');\n if (close > i && !isWhite(text.charCodeAt(i))) fail('bad processing instruction');\n i = close + 2;\n }\n\n while (i < n) {\n const lt = text.indexOf('<', i);\n if (lt < 0) { characterData(i, n); i = n; break; }\n if (lt > i) characterData(i, lt);\n i = lt;\n const next = text.charCodeAt(i + 1);\n if (next === 0x2F) {\n // End tag.\n const start = i;\n i += 2;\n const name = readName();\n skipWhite(); expect('>');\n const open = stack.pop();\n if (open !== name) fail(open ? `</${name}> closes <${open}>` : `unexpected </${name}>`, start);\n if (!stack.length) rootClosed = true;\n handler.endElement(name, start, i);\n } else if (next === 0x21) {\n if (text.startsWith('<!--', i)) comment();\n else if (text.startsWith('<![CDATA[', i)) {\n if (!stack.length) fail('CDATA outside the root element');\n const close = text.indexOf(']]>', i + 9);\n if (close < 0) fail('unterminated CDATA section');\n handler.text?.(normalizeLines(text.slice(i + 9, close)));\n i = close + 3;\n } else if (text.startsWith('<!DOCTYPE', i)) doctype();\n else fail('bad markup declaration');\n } else if (next === 0x3F) processingInstruction();\n else {\n // Start tag.\n const start = i;\n i++;\n if (rootClosed) fail('content after the root element', start);\n const name = readName();\n const attributes: XmlAttribute[] = [];\n let selfClosing = false;\n for (;;) {\n const white = i < n && isWhite(text.charCodeAt(i));\n skipWhite();\n const c = text.charCodeAt(i);\n if (c === 0x3E) { i++; break; }\n if (c === 0x2F) { i++; expect('>'); selfClosing = true; break; }\n if (i >= n) fail('unterminated start tag', start);\n if (!white) fail('expected whitespace between attributes');\n const attributeStart = i;\n const attributeName = readName();\n skipWhite(); expect('='); skipWhite();\n const valueAt = i + 1;\n const raw = quoted();\n for (const other of attributes) if (other.name === attributeName) fail(`duplicate attribute ${attributeName}`, attributeStart);\n attributes.push({ name: attributeName, value: attributeValue(raw, valueAt), start: attributeStart, end: i });\n }\n root ??= name;\n stack.push(name);\n handler.startElement(name, attributes, start, i, selfClosing);\n if (selfClosing) {\n stack.pop();\n if (!stack.length) rootClosed = true;\n handler.endElement(name, start, i);\n }\n }\n }\n if (!root) fail('no root element');\n if (stack.length) fail(`unclosed <${stack.at(-1)}>`, n);\n return root!;\n}\n\n/** A light element tree for a captured subtree; it mirrors the parts of the DOM Element API the importers use. */\nexport class XmlElement {\n readonly localName: string;\n readonly children: XmlElement[] = [];\n /** Child elements and text, in document order (for textContent). */\n private readonly content: (XmlElement | string)[] = [];\n private readonly attributeMap: Map<string, string>;\n constructor(readonly name: string, attributes: readonly XmlAttribute[], readonly parentElement: XmlElement | null = null) {\n this.localName = localNameOf(name);\n this.attributeMap = new Map(attributes.map(attribute => [attribute.name, attribute.value]));\n }\n getAttribute(name: string): string | null { return this.attributeMap.get(name) ?? null; }\n hasAttribute(name: string): boolean { return this.attributeMap.has(name); }\n setAttribute(name: string, value: string): void { this.attributeMap.set(name, value); }\n /** Concatenated character data of the subtree, like Node.textContent. */\n get textContent(): string {\n if (this.content.length === 1 && typeof this.content[0] === 'string') return this.content[0];\n let out = '';\n for (const item of this.content) out += typeof item === 'string' ? item : item.textContent;\n return out;\n }\n append(item: XmlElement | string): void {\n if (typeof item === 'string') {\n const last = this.content.length - 1;\n if (last >= 0 && typeof this.content[last] === 'string') this.content[last] += item;\n else this.content.push(item);\n } else { this.children.push(item); this.content.push(item); }\n }\n /** Descendant elements in document order (like getElementsByTagName('*')). */\n descendants(): XmlElement[] {\n const out: XmlElement[] = [];\n const walk = (element: XmlElement) => { for (const item of element.children) { out.push(item); walk(item); } };\n walk(this);\n return out;\n }\n}\n\n/** Builds light trees for subtrees a caller chooses to capture while a document streams past. */\nexport class XmlTreeBuilder {\n private current: XmlElement | null = null;\n /** Whether a captured subtree is open. */\n get capturing(): boolean { return this.current !== null; }\n /** Open an element: a new capture root when `capture` is set and nothing is captured, or a child of the open one. */\n open(name: string, attributes: readonly XmlAttribute[], capture: boolean): XmlElement | null {\n if (!this.current && !capture) return null;\n const element = new XmlElement(name, attributes, this.current);\n this.current?.append(element);\n this.current = element;\n return element;\n }\n /** Close the open element; returns it when it was a capture root (the subtree is complete). */\n close(): XmlElement | null {\n const element = this.current;\n if (!element) return null;\n this.current = element.parentElement;\n return this.current ? null : element;\n }\n text(value: string): void { this.current?.append(value); }\n}\n\n/** Parse a whole (small) document into a light tree; throws XmlError when it is not well-formed. */\nexport function parseXmlTree(text: string): XmlElement {\n const builder = new XmlTreeBuilder();\n let root: XmlElement | null = null;\n scanXml(text, {\n startElement: (name, attributes) => { builder.open(name, attributes, true); },\n endElement: () => { root = builder.close() || root; },\n text: value => builder.text(value),\n });\n return root!;\n}\n","import type { BarlineNavigation, MeasureNavigation, Score } from '../score';\nimport { formatFraction, fraction, fromNumber } from '../playback/fraction';\nimport { parseXmlTree } from './xml-stream';\n\n/**\n * Source-format readers for written navigation (repeats, endings, segno/coda,\n * D.C./D.S., Fine). Every importer fills Measure.navigation with these, and the\n * playback roadmap is built from that one format-neutral shape.\n */\nexport type NavigationWord = 'daCapo' | 'dalSegno' | 'toCoda' | 'fine' | 'coda' | 'segno';\n\n\n/** Volta numbers: \"1\", \"1, 2\", \"1,3\", \"1-2\", \"1.\" */\nexport function endingNumbers(value: string | null | undefined): number[] {\n const result = (value || '').replace(/[^\\d,\\-\\s]/g, ' ').split(/[\\s,]+/).flatMap(token => {\n const range = /^(\\d+)-(\\d+)$/.exec(token);\n if (range) return Array.from({ length: Math.max(0, Math.min(16, Number(range[2]) - Number(range[1]) + 1)) }, (_, i) => Number(range[1]) + i);\n const number = Number(token); return Number.isInteger(number) && number > 0 ? [number] : [];\n });\n return [...new Set(result)];\n}\n\n/**\n * Navigation meaning of a text direction. Anchored at the start so \"both hands\"\n * or \"Winds\" never trigger D.S. and \"Coda\" inside other words is ignored.\n * ABC decoration names (\"D.C.alfine\", \"D.S.alcoda\") use the same spelling.\n */\nexport function navigationWord(text: string): NavigationWord | undefined {\n const words = text.trim();\n if (/^(?:D\\.\\s*C\\.?|Da\\s+Capo)(?![a-z])/i.test(words)) return 'daCapo';\n if (/^(?:D\\.\\s*S\\.?|Dal\\s+Segno)(?![a-z])/i.test(words)) return 'dalSegno';\n if (/^to\\s*(?:the\\s+)?(?:coda|\\u{1D10C})/iu.test(words)) return 'toCoda';\n if (/^fine\\.?$/i.test(words)) return 'fine';\n if (/^(?:\\u{1D10C}\\s*)?coda\\.?$/iu.test(words) || words === '\\u{1D10C}') return 'coda';\n if (/^(?:\\u{1D10B}\\s*)?segno$/iu.test(words) || words === '\\u{1D10B}') return 'segno';\n return undefined;\n}\n\nexport const isEmptyNavigation = (nav: MeasureNavigation | undefined) => !nav || Object.keys(nav).length === 0;\n\n/** Copies each measure's navigation onto every part, so hiding any part keeps it. */\nexport function attachNavigation(score: Score, navigation: MeasureNavigation[]) {\n for (const part of score.parts) part.measures.forEach((measure, index) => {\n const nav = navigation[index];\n if (isEmptyNavigation(nav)) delete measure.navigation;\n else measure.navigation = JSON.parse(JSON.stringify(nav));\n });\n}\n\n/**\n * Formats that print one coda sign both at the jump (\"To Coda\") and at the\n * coda itself (MEI repeatMark, ABC !coda!): a sign before the first D.C./D.S.\n * is the jump when another sign follows the D.C./D.S.\n */\nexport function resolveCodaSigns(navigation: MeasureNavigation[]) {\n const jump = navigation.findIndex(nav => nav.daCapo || nav.dalSegno);\n if (jump < 0 || !navigation.slice(jump + 1).some(nav => nav.coda)) return;\n navigation.forEach((nav, i) => { if (i < jump && nav.coda) { delete nav.coda; nav.toCoda = true; } });\n}\n\n/** The parts of a DOM Element the MusicXML readers use; the streaming light tree (xml-stream.ts) has the same shape. */\nexport type ElementLike = {\n readonly localName: string;\n readonly children: ArrayLike<ElementLike> & Iterable<ElementLike>;\n getAttribute(name: string): string | null;\n hasAttribute(name: string): boolean;\n readonly textContent: string | null;\n};\nconst likeChildren = (el: ElementLike, name: string) => Array.from(el.children).filter(item => item.localName === name);\nconst likeFirst = (el: ElementLike, name: string) => likeChildren(el, name)[0] as ElementLike | undefined;\n\n/**\n * MusicXML navigation is read from the source, never inferred from SVG.\n * Explicit <sound> attributes are authoritative; when a measure has none,\n * <segno/>/<coda/> glyphs and anchored words (\"D.S. al Coda\", \"To Coda\", \"Fine\")\n * are used. Repeat barlines with location=\"middle\" keep their exact offset.\n *\n * The reader is fed the first part's measures in order (for a timewise score, each measure's first <part>); it\n * carries the open ending and divisions from one measure to the next.\n */\nexport function musicXmlNavigationReader(): (measure: ElementLike, diagnostics: string[]) => MeasureNavigation {\n const SOUND = ['dacapo', 'dalsegno', 'tocoda', 'fine', 'segno', 'coda'];\n let ending: number[] = [];\n let divisions = 1;\n return (measure, diagnostics) => {\n const nav: MeasureNavigation = {};\n // Offsets of middle barlines, in divisions; exact as long as durations are integers.\n let cursor = 0;\n const barlines: BarlineNavigation[] = [];\n for (const item of Array.from(measure.children)) {\n const name = item.localName;\n const duration = Number(likeFirst(item, 'duration')?.textContent) || 0;\n if (name === 'attributes') { const d = Number(likeFirst(item, 'divisions')?.textContent); if (d > 0) divisions = d; }\n else if (name === 'note') { if (likeFirst(item, 'chord')) continue; if (!likeFirst(item, 'grace')) cursor += duration; }\n else if (name === 'backup') cursor = Math.max(0, cursor - duration);\n else if (name === 'forward') cursor += duration;\n else if (name === 'barline' && item.getAttribute('location') === 'middle') {\n const repeat = likeFirst(item, 'repeat');\n if (!repeat) continue;\n const at = Number.isInteger(cursor) ? fraction(cursor, divisions) : fromNumber(cursor / divisions);\n const beat = formatFraction(at);\n const barline: BarlineNavigation = barlines.find(entry => entry.beat === beat) || { beat };\n if (!barlines.includes(barline)) barlines.push(barline);\n if (repeat.getAttribute('direction') === 'forward') barline.repeatStart = true;\n else if (repeat.getAttribute('direction') === 'backward') { barline.repeatEnd = true; const times = Number(repeat.getAttribute('times')); if (times > 0) barline.repeatTimes = Math.max(2, Math.min(16, times)); }\n if (likeFirst(item, 'ending')) diagnostics.push('An ending on a middle barline is not supported; it was ignored.');\n }\n }\n if (barlines.length) nav.barlines = barlines;\n for (const barline of likeChildren(measure, 'barline')) {\n if (barline.getAttribute('location') === 'middle') continue;\n const end = likeFirst(barline, 'ending');\n if (end?.getAttribute('type') === 'start') ending = endingNumbers(end.getAttribute('number'));\n if (end?.getAttribute('type') === 'stop' && barline.getAttribute('location') === 'left') ending = [];\n const repeat = likeFirst(barline, 'repeat');\n if (repeat?.getAttribute('direction') === 'forward') nav.repeatStart = true;\n if (repeat?.getAttribute('direction') === 'backward') {\n nav.repeatEnd = true;\n const times = Number(repeat.getAttribute('times'));\n if (times > 0) nav.repeatTimes = Math.max(2, Math.min(16, times));\n }\n }\n if (ending.length) nav.endings = [...ending];\n const directions = likeChildren(measure, 'direction');\n const sounds = [...likeChildren(measure, 'sound'), ...directions.flatMap(direction => likeChildren(direction, 'sound'))];\n const explicit = sounds.some(sound => SOUND.some(name => sound.hasAttribute(name)));\n for (const sound of sounds) {\n if (sound.getAttribute('dacapo') === 'yes') nav.daCapo = true;\n if (sound.hasAttribute('dalsegno')) nav.dalSegno = true;\n if (sound.hasAttribute('tocoda')) nav.toCoda = true;\n if (sound.hasAttribute('fine') && sound.getAttribute('fine') !== 'no') nav.fine = true;\n if (sound.hasAttribute('segno')) nav.segno = true;\n if (sound.hasAttribute('coda')) nav.coda = true;\n }\n let codaGlyph = false;\n if (!explicit) for (const direction of directions) {\n const types = likeChildren(direction, 'direction-type');\n const words = types.flatMap(type => likeChildren(type, 'words')).map(item => (item.textContent || '').trim()).filter(Boolean).join(' ').trim();\n const segnoGlyph = types.some(type => likeFirst(type, 'segno'));\n const hasCodaGlyph = types.some(type => likeFirst(type, 'coda'));\n const word = navigationWord(words);\n if (word === 'daCapo') nav.daCapo = true;\n else if (word === 'dalSegno') nav.dalSegno = true;\n else if (word === 'toCoda' || (hasCodaGlyph && /^to$/i.test(words))) nav.toCoda = true;\n else if (word === 'fine') nav.fine = true;\n else if (word === 'coda' || (hasCodaGlyph && !words)) codaGlyph = true;\n if (segnoGlyph || word === 'segno') nav.segno = true;\n }\n // A coda glyph printed beside \"To Coda\" marks the jump, not its target.\n if (codaGlyph && !nav.toCoda) nav.coda = true;\n for (const barline of likeChildren(measure, 'barline')) {\n const end = likeFirst(barline, 'ending');\n if (end && ['stop', 'discontinue'].includes(end.getAttribute('type') || '') && barline.getAttribute('location') !== 'left') ending = [];\n }\n return nav;\n };\n}\n\n/** Navigation of a MusicXML document (partwise: the first part's measures; timewise: each measure's first part). */\nexport function musicXmlNavigation(root: ElementLike, measureCount: number, diagnostics: string[]): MeasureNavigation[] {\n const navigation = Array.from({ length: measureCount }, () => ({} as MeasureNavigation));\n const sourceMeasures = root.localName === 'score-timewise'\n ? likeChildren(root, 'measure').map(measure => likeFirst(measure, 'part') || measure)\n : likeChildren(likeFirst(root, 'part') || root, 'measure');\n const read = musicXmlNavigationReader();\n sourceMeasures.slice(0, measureCount).forEach((measure, i) => { navigation[i] = read(measure, diagnostics); });\n return navigation;\n}\n\n/** Parses MusicXML text for navigation (used when a caller supplies XML instead of a Score). Works without a DOM. */\nexport function musicXmlTextNavigation(xml: string, measureCount: number, diagnostics: string[]): MeasureNavigation[] {\n let root: ElementLike;\n try { root = parseXmlTree(xml); }\n catch { diagnostics.push('MusicXML navigation could not be parsed.'); return Array.from({ length: measureCount }, () => ({})); }\n return musicXmlNavigation(root, measureCount, diagnostics);\n}\n\n/**\n * MEI: measure @left/@right repeat barlines, <ending n> containers,\n * <repeatMark func> and anchored <dir> words. `barlines` are mid-measure\n * <barLine form> offsets found while walking the first layer.\n */\nexport function meiNavigation(measures: Element[], barlines: Map<number, BarlineNavigation[]>): MeasureNavigation[] {\n const navigation = measures.map(() => ({} as MeasureNavigation));\n const FUNC: Record<string, NavigationWord> = { segno: 'segno', coda: 'coda', fine: 'fine', dacapo: 'daCapo', dalsegno: 'dalSegno' };\n measures.forEach((measure, i) => {\n const nav = navigation[i];\n const left = measure.getAttribute('left'), right = measure.getAttribute('right');\n if (left === 'rptstart' || left === 'rptboth') nav.repeatStart = true;\n if ((left === 'rptend' || left === 'rptboth') && i > 0) navigation[i - 1].repeatEnd = true;\n if (right === 'rptend' || right === 'rptboth') nav.repeatEnd = true;\n if (right === 'rptboth' && i + 1 < navigation.length) navigation[i + 1].repeatStart = true;\n let ancestor = measure.parentElement;\n while (ancestor && ancestor.localName !== 'ending' && ancestor.localName !== 'score') ancestor = ancestor.parentElement;\n if (ancestor?.localName === 'ending') {\n const numbers = endingNumbers(ancestor.getAttribute('n') || ancestor.getAttribute('label'));\n if (numbers.length) nav.endings = numbers;\n }\n const marks = Array.from(measure.children);\n for (const mark of marks) {\n if (mark.localName === 'repeatMark') {\n const text = (mark.textContent || '').trim();\n const word = FUNC[(mark.getAttribute('func') || '').toLowerCase()] || navigationWord(text);\n if (word === 'coda' && navigationWord(text) === 'toCoda') nav.toCoda = true;\n else if (word) nav[word] = true;\n } else if (mark.localName === 'dir') {\n const word = navigationWord(mark.textContent || '');\n if (word) nav[word] = true;\n }\n }\n const inside = barlines.get(i);\n if (inside?.length) nav.barlines = inside;\n });\n resolveCodaSigns(navigation);\n return navigation;\n}\n\n/** abcjs decoration names that carry navigation. */\nexport function abcDecorationWord(decoration: string): NavigationWord | undefined {\n const name = decoration.trim();\n if (name === 'segno') return 'segno';\n if (name === 'coda') return 'coda';\n if (name === 'fine') return 'fine';\n return /^D\\.[CS]\\./.test(name) ? navigationWord(name) : undefined;\n}\n","import { gmProgramForNumber, gmProgramForVirtualName, instrumentForName, midiPitch, pitch, ucfirst, type MeasureNavigation, type Measure, type Part, type Score, type ScoreNote, type Transposition } from '../score';\nimport { attachNavigation, musicXmlNavigationReader } from './navigation';\nimport { localNameOf, scanXml, XmlElement, XmlError, XmlTreeBuilder, type XmlAttribute } from './xml-stream';\nimport type { NoteMark, PedalChange, PlaybackMarks } from '../playback/source-marks';\n\n/**\n * Single-pass MusicXML reader (docs/specs/large-score-performance.md, Phase 2). One streaming pass over the source\n * text produces everything the reader needs, with no DOM, so it runs in a worker:\n *\n * - the Score model (identical to the former DOM importer's, enforced by validation/parser-diff.mjs),\n * - the engraving text: the source with stable note IDs and multi-measure rests expanded, made by splicing the\n * original text (so it parses to the same document the former DOM edit + XMLSerializer produced),\n * - the source feature inventory, navigation marks, and the playback marks (articulations, fermatas, cue notes,\n * pedals) the timeline reads.\n *\n * Only `<measure>` subtrees (and the small top-level header elements) are held as light trees, one at a time, so\n * memory stays bounded on very large scores. Timewise scores are first converted to partwise text.\n */\n\nexport type SourceDiagnostic = { feature: string; status: 'retained' | 'partial' | 'unsupported'; location: string; message: string };\nexport type FeatureInventory = { featureCounts: Record<string, number>; diagnostics: SourceDiagnostic[] };\nexport type MusicXmlRead = {\n /** The Score model, without its source document. */\n score: Score;\n /** Engraving copy: the source with note IDs and expanded multi-measure rests (the source itself when unchanged). */\n engravingText: string;\n inventory: FeatureInventory;\n /** Navigation that could not be honoured. */\n diagnostics: SourceDiagnostic[];\n playback: PlaybackMarks;\n};\n\nconst FAMILIES: Record<string, string[]> = {\n voices: ['voice', 'layer', 'backup', 'forward'], beams: ['beam'], lyrics: ['lyric', 'verse', 'syl'],\n percussion: ['unpitched', 'midi-unpitched', 'notehead'], tuplets: ['time-modification', 'tuplet'],\n navigation: ['repeat', 'ending', 'segno', 'coda'], expression: ['dynamics', 'wedge', 'pedal', 'sound'],\n ornaments: ['ornaments', 'articulations', 'tremolo'], notation: ['slur', 'tie', 'glissando', 'arpeggiate'],\n specialized: ['technical', 'scordatura', 'bend', 'fingering', 'string', 'fret', 'staff-tuning', 'image'],\n};\n/** Feature inventory from element counts by local name (see sourceFeatureInventory in document.ts). */\nexport function inventoryFromCounts(names: Map<string, number>, rootLocalName: string): FeatureInventory {\n const featureCounts = Object.fromEntries(Object.entries(FAMILIES).map(([family, tags]) => [family, tags.reduce((total, tag) => total + (names.get(tag) || 0), 0)]));\n const diagnostics: SourceDiagnostic[] = [];\n if (rootLocalName === 'score-timewise') diagnostics.push({ feature: 'timewise', status: 'retained', location: '/score-timewise', message: 'Original timewise score retained; a partwise view is used for engraving.' });\n for (const [family, count] of Object.entries(featureCounts)) {\n if (!count) continue;\n diagnostics.push({ feature: family, status: 'retained', location: `/${rootLocalName}`, message: `${count} source element${count === 1 ? '' : 's'} retained in the original document; engraving and performance require separate verification.` });\n }\n return { featureCounts, diagnostics };\n}\n/** Count elements by local name (and find the root) in one pass; throws XmlError when the text is not well-formed. */\nexport function countElements(text: string): { names: Map<string, number>; root: string } {\n const names = new Map<string, number>();\n const root = scanXml(text, { startElement: name => { const local = localNameOf(name); names.set(local, (names.get(local) || 0) + 1); }, endElement: () => {} });\n return { names, root: localNameOf(root) };\n}\n\nconst children = (node: XmlElement, tag: string) => node.children.filter(el => el.localName === tag);\nconst child = (node: XmlElement, tag: string): XmlElement | undefined => { for (const el of node.children) if (el.localName === tag) return el; return undefined; };\nconst value = (node: XmlElement, tag: string) => child(node, tag)?.textContent?.trim() || '';\nconst number = (node: XmlElement, tag: string, fallback = 0) => { const raw = value(node, tag); return raw !== '' && Number.isFinite(Number(raw)) ? Number(raw) : fallback; };\nconst firstDescendant = (node: XmlElement, tag: string): XmlElement | undefined => {\n for (const el of node.children) { if (el.localName === tag) return el; const deep = firstDescendant(el, tag); if (deep) return deep; }\n return undefined;\n};\nconst musicXmlTranspose = (node?: XmlElement): Transposition | undefined => {\n if (!node) return undefined;\n const octaves = number(node, 'octave-change');\n return { semitones: number(node, 'chromatic') + octaves * 12, diatonic: child(node, 'diatonic') ? number(node, 'diatonic') + octaves * 7 : undefined };\n};\nconst empty = (index: number, beats: number): Measure => ({ index, beats, notes: [] });\nexport const durationBeats = (dur: string, dots = 0) => ({ longa: 16, breve: 8, '1': 4, '2': 2, '4': 1, '8': .5, '16': .25, '32': .125, '64': .0625, '128': .03125, whole: 4, half: 2, quarter: 1, eighth: .5, '16th': .25, '32nd': .125 }[dur] || 1) * (dots ? 2 - 1 / (2 ** dots) : 1);\nconst accidental = (alter: number) => alter > 0 ? '♯'.repeat(alter) : '♭'.repeat(-alter);\nfunction musicXmlHarmony(element: XmlElement): string {\n const root = child(element, 'root');\n const step = root && value(root, 'root-step');\n if (!step) return '';\n const kinds: Record<string, string> = { major: '', minor: 'm', dominant: '7', 'major-seventh': 'maj7', 'minor-seventh': 'm7', diminished: 'dim', augmented: 'aug', 'half-diminished': 'm7♭5', 'diminished-seventh': 'dim7', 'suspended-fourth': 'sus4', 'suspended-second': 'sus2', 'major-sixth': '6', 'minor-sixth': 'm6', power: '5' };\n const kind = child(element, 'kind');\n const suffix = kind?.getAttribute('text') ?? kinds[kind?.textContent?.trim() || ''] ?? '';\n const bass = child(element, 'bass');\n const bassStep = bass && value(bass, 'bass-step');\n return `${step}${accidental(number(root!, 'root-alter'))}${suffix}${bassStep ? `/${bassStep}${accidental(number(bass!, 'bass-alter'))}` : ''}`;\n}\n/** Common five-line drum-set staff positions mapped to General MIDI percussion keys. */\nconst drumPositions: Record<string, number> = { D4: 44, E4: 35, F4: 36, G4: 41, A4: 43, B4: 45, C5: 38, D5: 47, E5: 48, F5: 51, G5: 42, A5: 49, B5: 57, C6: 49 };\nconst defaultDrumMidi = (step: string, octave: number) => drumPositions[`${step.toUpperCase()}${octave}`] ?? 38;\nconst clefName = (clefElement: XmlElement) => { const sign = value(clefElement, 'sign'); return sign === 'F' ? 'bass' : sign === 'C' ? number(clefElement, 'line', 3) === 4 ? 'tenor' : 'alto' : sign === 'percussion' ? 'percussion' : 'treble'; };\n\n/** Pad every part to the longest, sort notes by onset and fit measure lengths to their content (shared by importers). */\nexport const normalizedScore = (score: Score): Score => {\n const count = Math.max(...score.parts.map(p => p.measures.length), 0);\n score.parts.forEach(part => {\n part.name = ucfirst(part.name.trim());\n for (let i = part.measures.length; i < count; i++) part.measures.push(empty(i, score.beats * 4 / score.beatType));\n part.measures.forEach(m => { m.notes.sort((a, b) => a.start - b.start); m.beats = Math.max(m.beats, ...m.notes.map(n => n.start + n.duration), 0); });\n });\n if (!count || !score.parts.length) throw new Error('No readable notes or measures were found.');\n return score;\n};\n\n/** The root element's name, read past the XML declaration, comments and DOCTYPE without parsing the document. */\nexport function rootElementName(text: string): string | undefined {\n const prolog = /\\s*(?:<\\?[\\s\\S]*?\\?>|<!--[\\s\\S]*?-->|<!DOCTYPE(?:[^[>]|\\[[\\s\\S]*?\\])*>)/y;\n let index = 0;\n for (prolog.lastIndex = 0; prolog.exec(text); prolog.lastIndex = index) index = prolog.lastIndex;\n const root = /\\s*<([A-Za-z_][\\w.:-]*)/y;\n root.lastIndex = index;\n return root.exec(text)?.[1];\n}\n\nconst escapeAttribute = (text: string) => text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"').replace(/\\t/g, '	').replace(/\\n/g, ' ').replace(/\\r/g, ' ');\nconst rawAttributes = (text: string, attributes: XmlAttribute[]) => attributes.map(attribute => ` ${text.slice(attribute.start, attribute.end)}`).join('');\nconst escapeMarkup = (text: string) => escapeAttribute(text).replace(/'/g, ''');\n/**\n * Replace references to internal-subset entities with their (escaped) replacement text, outside comments, CDATA\n * sections and PIs: copied markup must not depend on a DOCTYPE the new document does not carry.\n */\nfunction expandEntities(markup: string, entities: Readonly<Record<string, string>>): string {\n if (markup.indexOf('&') < 0) return markup;\n return markup.split(/(<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<!--[\\s\\S]*?-->|<\\?[\\s\\S]*?\\?>)/).map((piece, index) => index % 2 ? piece\n : piece.replace(/&([^\\s&;#]+);/g, (reference, name: string) => Object.prototype.hasOwnProperty.call(entities, name) ? escapeMarkup(entities[name]) : reference)).join('');\n}\n\n/**\n * Timewise → partwise, as text: the root's other children, then one <part> per part ID (part-list order, then any\n * found only in measures), each holding every measure's content for that part. Matches the former DOM conversion\n * (element children only; measures without a number get their position).\n */\nexport function timewiseToPartwise(text: string): { text: string; inventory: FeatureInventory } {\n const names = new Map<string, number>();\n type Measure = { attributes: string; parts: { id: string | null; content: string[] }[] };\n let rootAttributes = '';\n const header: string[] = [];\n const measures: Measure[] = [];\n const listedIds: string[] = [];\n let partListSeen = false, inFirstPartList = false;\n const stack: { local: string; start: number }[] = [];\n let entities: Readonly<Record<string, string>> = {};\n const copy = (markup: string) => expandEntities(markup, entities);\n const root = scanXml(text, {\n doctype: declared => { entities = declared; },\n startElement(name, attributes, start, end, selfClosing) {\n const local = localNameOf(name);\n names.set(local, (names.get(local) || 0) + 1);\n const depth = stack.length;\n if (depth === 0) rootAttributes = copy(rawAttributes(text, attributes));\n else if (depth === 1 && local === 'measure') measures.push({ attributes: copy(rawAttributes(text, attributes)) + (attributes.some(a => a.name === 'number') ? '' : ` number=\"${measures.length + 1}\"`), parts: [] });\n else if (depth === 1 && local === 'part-list' && !partListSeen) { partListSeen = true; inFirstPartList = true; }\n else if (depth === 2 && inFirstPartList && local === 'score-part') { const id = attributes.find(a => a.name === 'id')?.value; if (id) listedIds.push(id); }\n else if (depth === 2 && stack[1].local === 'measure' && local === 'part') measures.at(-1)!.parts.push({ id: attributes.find(a => a.name === 'id')?.value ?? null, content: [] });\n stack.push({ local, start });\n void end; void selfClosing;\n },\n endElement(_name, _start, end) {\n const frame = stack.pop()!;\n const depth = stack.length;\n if (depth === 1 && frame.local !== 'measure') { header.push(copy(text.slice(frame.start, end))); if (frame.local === 'part-list') inFirstPartList = false; }\n else if (depth === 3 && stack[1].local === 'measure' && stack[2].local === 'part') measures.at(-1)!.parts.at(-1)!.content.push(copy(text.slice(frame.start, end)));\n },\n });\n const rootLocal = localNameOf(root);\n if (rootLocal !== 'score-timewise') return { text, inventory: inventoryFromCounts(names, rootLocal) };\n const ids = [...new Set([...listedIds, ...measures.flatMap(measure => measure.parts.map(part => part.id).filter((id): id is string => Boolean(id)))])];\n const out: string[] = [`<score-partwise${rootAttributes}>`, ...header];\n for (const id of ids) {\n out.push(`<part id=\"${escapeAttribute(id)}\">`);\n for (const measure of measures) out.push(`<measure${measure.attributes}>`, ...(measure.parts.find(part => part.id === id)?.content || []), '</measure>');\n out.push('</part>');\n }\n out.push('</score-partwise>');\n return { text: out.join(''), inventory: inventoryFromCounts(names, rootLocal) };\n}\n\ntype PlaybackCollector = { notes: (element: XmlElement) => void; pedals: { begin(id: string): void; measure(element: XmlElement, index: number): void; end(): void }; result(): PlaybackMarks };\n/** Articulation, fermata and cue marks by note ID, and damper-pedal changes by source part (see timeline.ts). */\nfunction playbackCollector(): PlaybackCollector {\n const marks = new Map<string, NoteMark>();\n const markDiagnostics: string[] = [];\n const partPedals: { id: string; changes: PedalChange[]; diagnostics: string[] }[] = [];\n let current: { id: string; changes: PedalChange[]; diagnostics: string[]; divisions: number } | undefined;\n const visitNote = (note: XmlElement) => {\n const id = note.getAttribute('id');\n const notations = child(note, 'notations');\n // Cue notes are engraved for reference only and never sound.\n const silent = Boolean(child(note, 'cue'));\n if (!notations && !silent) return;\n const art = notations && child(notations, 'articulations');\n const names = art ? art.children.map(el => el.localName) : [];\n let durationScale = 1, velocityDelta = 0;\n if (names.includes('staccatissimo')) durationScale = .25;\n else if (names.includes('staccato')) durationScale = .5;\n else if (names.includes('detached-legato')) durationScale = .75;\n else if (names.includes('tenuto')) durationScale = .96;\n if (names.includes('strong-accent')) velocityDelta = 18;\n else if (names.includes('accent')) velocityDelta = 12;\n const fermata = Boolean(notations && child(notations, 'fermata'));\n const meaningful = durationScale !== 1 || velocityDelta || fermata || silent;\n if (id && meaningful) marks.set(id, { durationScale, velocityDelta, fermata, silent });\n else if (!id && meaningful) markDiagnostics.push('Some articulations lack MusicXML note IDs and could not be mapped to sound.');\n if (notations && child(notations, 'ornaments')) markDiagnostics.push('Ornaments are engraved but not synthesized.');\n };\n const walk = (element: XmlElement) => {\n if (element.localName === 'note') visitNote(element);\n for (const item of element.children) walk(item);\n };\n const duration = (el: XmlElement) => Number(child(el, 'duration')?.textContent) || 0;\n return {\n notes: walk,\n pedals: {\n begin(id) { current = { id, changes: [], diagnostics: [], divisions: 1 }; },\n measure(measure, measureIndex) {\n const state = current!;\n const { changes, diagnostics } = state;\n let cursor = 0;\n const damper = (sound: XmlElement | undefined, beat: number) => {\n if (sound?.hasAttribute('sostenuto-pedal')) diagnostics.push('Sostenuto pedal is engraved but not synthesized.');\n const value = sound?.getAttribute('damper-pedal');\n if (value === null || value === undefined) return;\n const down = value === 'yes' || (value !== 'no' && Number(value) > 0);\n changes.push({ measureIndex, beat, kind: down ? 'down' : 'up' });\n };\n for (const item of measure.children) {\n const name = item.localName;\n if (name === 'attributes') { const d = Number(child(item, 'divisions')?.textContent); if (d > 0) state.divisions = d; }\n else if (name === 'note') { if (!child(item, 'chord') && !child(item, 'grace')) cursor += duration(item) / state.divisions; }\n else if (name === 'backup') cursor = Math.max(0, cursor - duration(item) / state.divisions);\n else if (name === 'forward') cursor += duration(item) / state.divisions;\n else if (name === 'sound') damper(item, cursor);\n else if (name === 'direction') {\n const offset = child(item, 'offset');\n const beat = Math.max(0, cursor + (offset?.getAttribute('sound') === 'yes' ? (Number(offset.textContent) || 0) / state.divisions : 0));\n const pedals = children(item, 'direction-type').flatMap(type => children(type, 'pedal'));\n for (const pedal of pedals) {\n const type = pedal.getAttribute('type');\n if (type === 'start' || type === 'resume') changes.push({ measureIndex, beat, kind: 'down' });\n else if (type === 'stop' || type === 'discontinue') changes.push({ measureIndex, beat, kind: 'up' });\n else if (type === 'change') changes.push({ measureIndex, beat, kind: 'change' });\n else if (type === 'sostenuto') diagnostics.push('Sostenuto pedal is engraved but not synthesized.');\n }\n if (pedals.length) { if (child(item, 'sound')?.hasAttribute('sostenuto-pedal')) diagnostics.push('Sostenuto pedal is engraved but not synthesized.'); }\n else damper(child(item, 'sound'), beat);\n }\n }\n },\n end() { if (current) partPedals.push(current); current = undefined; },\n },\n result() {\n // A repeated part ID keeps its first position but the last part's changes (as a Map keyed by ID would).\n const last = new Map<string, number>();\n partPedals.forEach((entry, index) => last.set(entry.id, index));\n const pedals = new Map<string, PedalChange[]>();\n const pedalDiagnostics: string[] = [];\n for (const index of last.values()) {\n const entry = partPedals[index];\n pedalDiagnostics.push(...entry.diagnostics);\n if (entry.changes.length) pedals.set(entry.id, entry.changes);\n }\n return { marks, markDiagnostics, pedals, pedalDiagnostics };\n },\n };\n}\n\n/** Thrown when a header element the parts depend on (part-list, defaults, concert-score) follows a part. */\nclass LateHeader extends Error {}\n\n/**\n * Read a MusicXML document (partwise or timewise text) in one pass. Throws 'This file is not valid XML.' or\n * 'This file is not a MusicXML score.' like the former DOM importer.\n */\nexport function readMusicXml(text: string): MusicXmlRead {\n const name = rootElementName(text);\n let source = text;\n let inventory: FeatureInventory | undefined;\n if (!name || localNameOf(name) === 'score-timewise') {\n const converted = timewiseToPartwise(text);\n source = converted.text;\n inventory = converted.inventory;\n }\n try { return readPartwise(source, inventory); }\n catch (error) {\n if (!(error instanceof LateHeader)) throw error;\n // An out-of-order header: read it first, then read the document again with it known from the start.\n const prelude = new Map<string, XmlElement>();\n const builder = new XmlTreeBuilder();\n let depth = 0;\n scanXml(source, {\n startElement: (elementName, attributes) => { builder.open(elementName, attributes, depth === 1 && localNameOf(elementName) !== 'part'); depth++; },\n endElement: () => { depth--; const done = builder.close(); if (done && !prelude.has(done.localName)) prelude.set(done.localName, done); },\n text: value => builder.text(value),\n });\n return readPartwise(source, inventory, prelude);\n }\n}\n\ntype Frame = { local: string; start: number; kind: 'root' | 'top' | 'part' | 'measure' | 'part-other' | 'inner' | 'skip'; captured: boolean; childCount: number; onlyMultiRest: boolean };\ntype Edit = { start: number; end: number; text: string };\n\nfunction readPartwise(text: string, timewiseInventory: FeatureInventory | undefined, prelude?: Map<string, XmlElement>): MusicXmlRead {\n const names = new Map<string, number>();\n const stack: Frame[] = [];\n const edits: Edit[] = [];\n const builder = new XmlTreeBuilder();\n const playback = playbackCollector();\n const navigationMeasures: MeasureNavigation[] = [];\n const navigationNotes: string[][] = [];\n const readNavigation = musicXmlNavigationReader();\n let root: XmlElement | undefined;\n let partwise = false;\n let partNo = -1;\n let partsStarted = false;\n // identifyMusicXmlNotes state: IDs in use, and the measure/note counters of the note being read.\n const used = new Set<string>();\n let measureNo = -1, noteIndex = 0;\n\n // Score state (the former parseMusicXml, restructured per part and per measure).\n let concertScore = false;\n let scoreParts = new Map<string | null, XmlElement>();\n let partNames = new Map<string | null, string>();\n let beats = 4, beatType = 4, key = 0, tempo = 100;\n let keyMode: 'major' | 'minor' | undefined;\n let openingMeter = false, openingTempo = false;\n const parts: Part[] = [];\n type PartState = {\n element: XmlElement; id: string; name: string; definition?: XmlElement; channel10: boolean; unpitched: boolean;\n staffMap: Map<number, Part>; divisions: number; partKey: number; partKeyMode?: 'major' | 'minor'; partBeats: number; partBeatType: number; partClef: string;\n partTransposition: Transposition; staffTranspositions: Map<number, Transposition>;\n };\n let part: PartState | undefined;\n\n const header = (local: string) => prelude?.get(local) ?? (root && child(root, local));\n const instrumentFields = (state: PartState) => {\n const { definition, element, name } = state;\n const scoreInstruments = children(definition || element, 'score-instrument');\n const gmVirtual = scoreInstruments.map(item => child(item, 'virtual-instrument')).map(item => item && gmProgramForVirtualName(value(item, 'virtual-library'), value(item, 'virtual-name'))).find(Boolean);\n const hasOtherVirtual = scoreInstruments.some(item => {\n const library = value(child(item, 'virtual-instrument') || item, 'virtual-library');\n return library && library.toLowerCase().replace(/[^a-z]/g, '') !== 'generalmidi';\n });\n // Drum kits are often exported as program 1 on channel 10; never map them to piano.\n const drumKit = children(definition || element, 'midi-instrument').some(item => number(item, 'midi-channel') === 10) || state.unpitched;\n const midiProgram = !drumKit && !gmVirtual && !hasOtherVirtual ? children(definition || element, 'midi-instrument').map(item => gmProgramForNumber(number(item, 'midi-program', 0))).find(Boolean) : undefined;\n const gm = drumKit ? undefined : gmVirtual || midiProgram;\n return { instrument: drumKit ? 'drum-kit' : gm ? gm.icon as Part['instrument'] : instrumentForName(name), gmProgram: gm?.program, gmSoundfont: gm?.soundfont };\n };\n\n const beginPart = (element: XmlElement) => {\n if (!partsStarted) {\n partsStarted = true;\n const defaults = header('defaults');\n concertScore = Boolean(defaults ? child(defaults, 'concert-score') : header('concert-score'));\n const list = header('part-list');\n scoreParts = new Map((list ? children(list, 'score-part') : []).map(p => [p.getAttribute('id'), p]));\n partNames = new Map([...scoreParts].map(([id, p]) => [id, value(p, 'part-name')]));\n }\n partNo++;\n const id = element.getAttribute('id') || `P${partNo + 1}`;\n const definition = scoreParts.get(id);\n part = {\n element, id, name: partNames.get(id) || `Part ${partNo + 1}`, definition, unpitched: false,\n channel10: definition ? children(definition, 'midi-instrument').some(item => number(item, 'midi-channel') === 10) : false,\n staffMap: new Map(), divisions: 1, partKey: key, partBeats: 4, partBeatType: 4, partClef: '',\n partTransposition: { semitones: 0 }, staffTranspositions: new Map(),\n };\n playback.pedals.begin(element.getAttribute('id') || '');\n };\n\n const readMeasure = (m: XmlElement, index: number) => {\n const state = part!;\n const { id, name, definition, staffMap, staffTranspositions } = state;\n let cursor = 0;\n let last: ScoreNote | undefined;\n const harmonyByTime = new Map<number, string>();\n const attrs = child(m, 'attributes');\n const applyAttributes = (attributes: XmlElement) => {\n state.divisions = number(attributes, 'divisions', state.divisions);\n const time = child(attributes, 'time');\n if (time) {\n state.partBeats = number(time, 'beats', state.partBeats); state.partBeatType = number(time, 'beat-type', state.partBeatType);\n if (partNo === 0 && !openingMeter) { beats = state.partBeats; beatType = state.partBeatType; openingMeter = true; }\n }\n const k = child(attributes, 'key');\n if (k) { state.partKey = number(k, 'fifths', state.partKey); state.partKeyMode = value(k, 'mode') === 'minor' ? 'minor' : 'major'; if (partNo === 0 && index === 0) { key = state.partKey; keyMode = state.partKeyMode; } }\n const clefElement = children(attributes, 'clef').find(c => Number(c.getAttribute('number') || 1) === 1);\n if (clefElement) state.partClef = clefName(clefElement);\n const forPart = children(attributes, 'for-part').map(item => musicXmlTranspose(child(item, 'part-transpose'))).find(Boolean);\n if (concertScore && forPart) state.partTransposition = forPart;\n else for (const item of children(attributes, 'transpose')) {\n const interval = musicXmlTranspose(item)!;\n const staffNumber = Number(item.getAttribute('number'));\n if (staffNumber > 0) staffTranspositions.set(staffNumber, interval);\n else state.partTransposition = interval;\n }\n staffMap.forEach((staffPart, staff) => {\n const measure = staffPart.measures[index];\n if (!measure) return;\n const staffClef = children(attributes, 'clef').find(c => Number(c.getAttribute('number') || 1) === staff);\n if (staffClef) staffPart.clef = clefName(staffClef);\n measure.key = state.partKey; if (state.partKeyMode) measure.keyMode = state.partKeyMode; measure.clef = staffPart.clef; measure.beatsPerBar = state.partBeats; measure.beatType = state.partBeatType;\n measure.nominalBeats = state.partBeats * 4 / state.partBeatType;\n });\n };\n if (attrs) applyAttributes(attrs);\n const measureBeats = state.partBeats * 4 / state.partBeatType;\n const ensure = (staff: number) => {\n const transposition = staffTranspositions.get(staff) || state.partTransposition;\n if (!staffMap.has(staff)) {\n const clefEl = attrs && children(attrs, 'clef').find(c => Number(c.getAttribute('number') || 1) === staff);\n const clef = clefEl ? clefName(clefEl) : state.partClef || (/bass/i.test(name) ? 'bass' : 'treble');\n const provisional = instrumentFields(state);\n staffMap.set(staff, { id: `${id}-${staff}`, name: staff === 1 ? name : `${name} · ${staff}`, clef, key: state.partKey, ...(state.partKeyMode ? { keyMode: state.partKeyMode } : {}), instrument: provisional.instrument, gmProgram: provisional.gmProgram, gmSoundfont: provisional.gmSoundfont, pitchBasis: concertScore ? 'concert' : 'written', transposition, measures: Array.from({ length: index }, (_, i) => empty(i, measureBeats)) });\n }\n const p = staffMap.get(staff)!;\n if (!p.measures[index]) p.measures[index] = { ...empty(index, measureBeats), nominalBeats: measureBeats, number: m.getAttribute('number') || String(index + 1), implicit: m.getAttribute('implicit') === 'yes', key: state.partKey, ...(state.partKeyMode ? { keyMode: state.partKeyMode } : {}), clef: p.clef, beatsPerBar: state.partBeats, beatType: state.partBeatType };\n p.measures[index].transposition = transposition;\n return p.measures[index];\n };\n staffMap.forEach((_, staff) => ensure(staff));\n for (const item of m.children) {\n if (item.localName === 'attributes') { if (item !== attrs) applyAttributes(item); continue; }\n if (item.localName === 'harmony') {\n const symbol = musicXmlHarmony(item);\n if (symbol) harmonyByTime.set(cursor + number(item, 'offset') / state.divisions, symbol);\n }\n if (item.localName === 'direction') {\n const sound = child(item, 'sound');\n const metronome = child(item, 'direction-type') && child(child(item, 'direction-type')!, 'metronome');\n const metronomeUnit = metronome && value(metronome, 'beat-unit');\n const unitLength = metronomeUnit ? durationBeats(metronomeUnit, metronome ? children(metronome, 'beat-unit-dot').length : 0) : 1;\n const t = Number(sound?.getAttribute('tempo') || (metronome ? value(metronome, 'per-minute') : 0)) * (sound?.hasAttribute('tempo') ? 1 : unitLength);\n if (t > 0 && partNo === 0 && !openingTempo) { tempo = t; openingTempo = true; }\n const dynamics = children(item, 'direction-type').flatMap(type => children(type, 'dynamics')).flatMap(mark => mark.children);\n const measure = ensure(number(item, 'staff', 1));\n const start = Math.max(0, cursor + number(item, 'offset') / state.divisions);\n const symbols = dynamics.map(mark => (mark.localName === 'other-dynamics' ? mark.textContent || '' : mark.localName).trim().toLowerCase()).filter(Boolean);\n const text = children(item, 'direction-type').flatMap(type => children(type, 'words')).map(word => word.textContent?.trim() || '').filter(Boolean).join(' ');\n const wedge = children(item, 'direction-type').flatMap(type => children(type, 'wedge'))[0];\n const soundDynamics = sound?.hasAttribute('dynamics') ? Number(sound.getAttribute('dynamics')) : undefined;\n if (symbols.length || text || wedge || t > 0 || soundDynamics !== undefined) (measure.directions ||= []).push({ start, symbols, text, placement: item.getAttribute('placement') === 'above' ? 'above' : 'below', voice: value(item, 'voice') || undefined, wedge: wedge ? { type: wedge.getAttribute('type') || '', number: wedge.getAttribute('number') || '1' } : undefined, soundDynamics, tempo: t > 0 ? t : undefined });\n for (const symbol of symbols) (measure.dynamics ||= []).push({ start, symbol });\n }\n if (item.localName === 'backup') { cursor = Math.max(0, cursor - number(item, 'duration') / state.divisions); last = undefined; }\n if (item.localName === 'forward') { cursor += number(item, 'duration') / state.divisions; last = undefined; }\n if (item.localName !== 'note') continue;\n const staff = number(item, 'staff', 1);\n const measure = ensure(staff);\n const chord = Boolean(child(item, 'chord'));\n const grace = Boolean(child(item, 'grace'));\n const dots = children(item, 'dot').length;\n const duration = grace ? 0 : child(item, 'duration') ? number(item, 'duration') / state.divisions : durationBeats(value(item, 'type'), dots);\n const p = child(item, 'pitch');\n const unpitched = child(item, 'unpitched');\n const rest = Boolean(child(item, 'rest'));\n const primaryBeam = children(item, 'beam').find(beam => Number(beam.getAttribute('number') || 1) === 1)?.textContent?.trim().toLowerCase();\n const beamStart = primaryBeam === 'begin';\n const beamEnd = primaryBeam === 'end';\n const accidentalElement = child(item, 'accidental');\n const sourceId = item.getAttribute('id') || undefined;\n const instrumentId = child(item, 'instrument')?.getAttribute('id');\n const midiInstrument = definition && children(definition, 'midi-instrument').find(instrument => instrument.getAttribute('id') === instrumentId) || definition && children(definition, 'midi-instrument')[0];\n const midiUnpitched = midiInstrument ? number(midiInstrument, 'midi-unpitched', 0) : 0;\n const displayStep = unpitched ? value(unpitched, 'display-step') || 'C' : undefined;\n const displayOctave = unpitched ? number(unpitched, 'display-octave', 4) : undefined;\n const basePitch = p ? pitch(value(p, 'step') || 'C', number(p, 'octave', 4), number(p, 'alter')) : unpitched ? { ...midiPitch(midiUnpitched ? midiUnpitched - 1 : defaultDrumMidi(displayStep!, displayOctave!)), unpitched: true, displayStep, displayOctave } : undefined;\n const ties = children(item, 'tie');\n const notePitch = basePitch && !rest ? { ...basePitch, sourceId, accidental: accidentalElement?.textContent?.trim(), cautionary: accidentalElement?.getAttribute('cautionary') === 'yes' || accidentalElement?.getAttribute('parentheses') === 'yes', tieStart: ties.some(t => t.getAttribute('type') === 'start'), tieStop: ties.some(t => t.getAttribute('type') === 'stop') } : undefined;\n const notations = child(item, 'notations');\n const timeModification = child(item, 'time-modification');\n const tuplets = children(notations || item, 'tuplet');\n const tuplet = timeModification ? { actual: number(timeModification, 'actual-notes', 3), normal: number(timeModification, 'normal-notes', 2), number: tuplets[0]?.getAttribute('number') || '1', start: tuplets.some(t => t.getAttribute('type') === 'start'), stop: tuplets.some(t => t.getAttribute('type') === 'stop') } : undefined;\n // A MusicXML <chord> can contain notes with different durations. Only\n // combine equal-duration pitches; keep the others as concurrent voices.\n const onset = chord && last ? last.start : cursor;\n if (chord && last && notePitch && last.voice === (value(item, 'voice') || '1') && Math.abs(last.duration - duration) < .001) {\n last.pitches.push(notePitch);\n last.beamStart ||= beamStart;\n last.beamEnd ||= beamEnd;\n }\n else {\n const slurs = children(notations || item, 'slur');\n last = { id: `${id}-${staff}-${index}-${measure.notes.length}`, sourceId, start: onset, duration, pitches: notePitch ? [notePitch] : [], transposition: staffTranspositions.get(staff) || state.partTransposition, chordSymbol: harmonyByTime.get(onset), rest, dotted: Boolean(child(item, 'dot')), dots, writtenType: value(item, 'type') || undefined, voice: value(item, 'voice') || '1', stem: value(item, 'stem') || undefined, grace, tuplet, slurStart: slurs.filter(s => s.getAttribute('type') === 'start').map(s => s.getAttribute('number') || '1'), slurStop: slurs.filter(s => s.getAttribute('type') === 'stop').map(s => s.getAttribute('number') || '1'), tieStart: notePitch?.tieStart, tieStop: notePitch?.tieStop };\n measure.notes.push(last);\n }\n if (!chord && !grace) cursor += duration;\n }\n for (const staffPart of staffMap.values()) {\n const measure = staffPart.measures[index];\n if (measure?.implicit) measure.beats = Math.max(cursor, ...measure.notes.map(note => note.start + note.duration), 0);\n }\n };\n\n const endPart = () => {\n const state = part!;\n // Instrument fields depend on an <unpitched> anywhere in the part, known only now.\n const fields = instrumentFields(state);\n for (const staffPart of state.staffMap.values()) Object.assign(staffPart, fields);\n parts.push(...Array.from(state.staffMap.values()).sort((a, b) => Number(a.id.split('-').pop()) - Number(b.id.split('-').pop())));\n playback.pedals.end();\n part = undefined;\n };\n\n /** The engraving note ID for a structural <note> (identifyMusicXmlNotes); records the edit that writes it. */\n const identify = (attributes: XmlAttribute[], end: number, selfClosing: boolean): string => {\n const idAttribute = attributes.find(a => a.name === 'id');\n const native = idAttribute?.value || attributes.find(a => a.name === 'xml:id')?.value || '';\n let id = native || `mx_p${partNo + 1}_m${measureNo + 1}_n${++noteIndex}`;\n if (native) noteIndex++;\n if (used.has(id)) id = `${id}_${partNo + 1}_${measureNo + 1}_${noteIndex}`;\n used.add(id);\n if (!idAttribute) edits.push({ start: end - (selfClosing ? 2 : 1), end: end - (selfClosing ? 2 : 1), text: ` id=\"${escapeAttribute(id)}\"` });\n else if (idAttribute.value !== id) edits.push({ start: idAttribute.start, end: idAttribute.end, text: `id=\"${escapeAttribute(id)}\"` });\n return id;\n };\n\n const completed = (element: XmlElement, kind: Frame['kind']) => {\n playback.notes(element);\n if (kind === 'top') {\n root!.append(element);\n // The parts read part-list and defaults (or a root-level concert-score) when the first part starts.\n if (partsStarted && !prelude && ['part-list', 'defaults', 'concert-score'].includes(element.localName) && child(root!, element.localName) === element) throw new LateHeader();\n } else if (kind === 'measure') {\n readMeasure(element, measureNo);\n playback.pedals.measure(element, measureNo);\n if (partNo === 0) { const notes: string[] = []; navigationMeasures[measureNo] = readNavigation(element, notes); navigationNotes[measureNo] = notes; }\n } else if (kind === 'part-other') part!.element.append(element);\n };\n\n scanXml(text, {\n startElement(name, attributes, start, end, selfClosing) {\n const local = localNameOf(name);\n if (!timewiseInventory) names.set(local, (names.get(local) || 0) + 1);\n const parent = stack.at(-1);\n if (parent) { parent.childCount++; if (local !== 'multiple-rest') parent.onlyMultiRest = false; }\n let kind: Frame['kind'];\n let element: XmlElement | null = null;\n if (!parent) {\n kind = 'root';\n partwise = local === 'score-partwise';\n root = new XmlElement(name, attributes);\n } else if (!partwise) kind = 'skip';\n else if (parent.kind === 'root') {\n if (local === 'part') {\n kind = 'part'; measureNo = -1;\n beginPart(new XmlElement(name, attributes));\n } else { kind = 'top'; element = builder.open(name, attributes, true); }\n } else if (parent.kind === 'part') {\n if (local === 'measure') { kind = 'measure'; measureNo++; noteIndex = 0; }\n else kind = 'part-other';\n element = builder.open(name, attributes, true);\n } else {\n kind = 'inner';\n element = builder.open(name, attributes, false);\n if (local === 'note' && parent.kind === 'measure') element!.setAttribute('id', identify(attributes, end, selfClosing));\n if (local === 'unpitched' && part) part.unpitched = true;\n }\n stack.push({ local, start, kind, captured: element !== null, childCount: 0, onlyMultiRest: true });\n },\n endElement(_name, _start, end) {\n const frame = stack.pop()!;\n // A removal replaces any edit inside the removed span (nested multi-rests, the hint inside its measure-style).\n if (frame.local === 'multiple-rest' || (frame.local === 'measure-style' && frame.childCount > 0 && frame.onlyMultiRest)) {\n while (edits.length && edits.at(-1)!.start >= frame.start) edits.pop();\n edits.push({ start: frame.start, end, text: '' });\n }\n if (frame.captured) { const done = builder.close(); if (done) completed(done, frame.kind); }\n if (frame.kind === 'part') endPart();\n },\n text: value => builder.text(value),\n });\n if (!partwise) throw new Error('This file is not a MusicXML score.');\n\n const scoreRoot = root!;\n const credits = children(scoreRoot, 'credit');\n const identification = child(scoreRoot, 'identification');\n const credit = (type: string) => { const match = credits.find(c => children(c, 'credit-type').some(t => t.textContent?.trim().toLowerCase() === type)); return (match && firstDescendant(match, 'credit-words'))?.textContent?.trim() || ''; };\n const creators = children(identification || scoreRoot, 'creator');\n const movementTitle = value(scoreRoot, 'movement-title');\n const title = value(child(scoreRoot, 'work') || scoreRoot, 'work-title') || movementTitle || credit('title');\n const subtitle = credit('subtitle') || (movementTitle && movementTitle !== title ? movementTitle : '');\n const composer = creators.find(e => e.getAttribute('type') === 'composer')?.textContent?.trim() || credit('composer');\n const otherCredits = creators.filter(e => e.getAttribute('type') !== 'composer').map(e => {\n const name = e.textContent?.trim();\n const type = e.getAttribute('type');\n return name ? `${type ? type[0].toUpperCase() + type.slice(1) + ': ' : ''}${name}` : '';\n }).filter(Boolean);\n const rights = value(identification || scoreRoot, 'rights');\n if (rights) otherCredits.push(rights);\n const shown = new Set([title, subtitle, composer, ...otherCredits].filter(Boolean).map(s => s.trim()));\n for (const line of credits.flatMap(c => c.descendants().filter(e => e.localName === 'credit-words').map(e => e.textContent?.trim() || ''))) {\n if (line && !shown.has(line)) { otherCredits.push(line); shown.add(line); }\n }\n // Builder-style scores can contain many placeholder instruments with only\n // rests. They obscure the playable staves in the continuous reader. A silent\n // staff is kept only when its directions shape playback: a tempo, or\n // dynamics/wedges that apply to a sounding sibling staff of the same part.\n // Plain words (e.g. a template's \"(Easy 3)\" label) do not make it playable.\n const sounding = (p: Part) => p.measures.some(measure => measure.notes.some(note => note.pitches.length > 0));\n const sourcePart = (p: Part) => p.id.replace(/-\\d+$/, '');\n const soundingSources = new Set(parts.filter(sounding).map(sourcePart));\n const shapesPlayback = (p: Part) => p.measures.some(measure => measure.directions?.some(direction => (direction.tempo ?? 0) > 0\n || (soundingSources.has(sourcePart(p)) && (direction.symbols?.length || direction.wedge || direction.soundDynamics !== undefined))));\n const playableParts = parts.filter(p => sounding(p) || shapesPlayback(p));\n const score = normalizedScore({ title, subtitle, composer, credits: otherCredits, source: 'MusicXML', tempo, beats, beatType, key, ...(keyMode ? { keyMode } : {}), parts: playableParts.length ? playableParts : parts });\n // Navigation is read once from the first source part and shared by every staff.\n const measureCount = score.parts[0].measures.length;\n const navigation = Array.from({ length: measureCount }, (_, i) => navigationMeasures[i] || {});\n attachNavigation(score, navigation);\n const notes = navigationNotes.slice(0, measureCount).flat();\n\n let engravingText = text;\n if (edits.length) {\n const pieces: string[] = [];\n let from = 0;\n for (const edit of edits) { pieces.push(text.slice(from, edit.start), edit.text); from = edit.end; }\n pieces.push(text.slice(from));\n engravingText = pieces.join('');\n }\n return {\n score, engravingText,\n inventory: timewiseInventory || inventoryFromCounts(names, localNameOf(scoreRoot.name)),\n diagnostics: [...new Set(notes)].map(message => ({ feature: 'navigation', status: 'unsupported', location: '/', message })),\n playback: playback.result(),\n };\n}\n\n/** Playback marks of a MusicXML text (articulations, fermatas, cue notes, pedals); empty when it cannot be read. */\nexport function readPlaybackMarks(text: string | undefined): PlaybackMarks {\n const collector = playbackCollector();\n if (!text) return collector.result();\n const builder = new XmlTreeBuilder();\n const stack: ('root' | 'part' | 'measure' | 'other')[] = [];\n let timewise = false, measureIndex = -1;\n /** Timewise: part ID → its measures' <part> elements, in order (pedals are per part). */\n const timewiseParts = new Map<string, XmlElement[]>();\n try {\n scanXml(text, {\n startElement(name, attributes) {\n const local = localNameOf(name);\n const parent = stack.at(-1);\n if (!parent) { timewise = local === 'score-timewise'; stack.push('root'); return; }\n if (parent === 'root' && !timewise && local === 'part') { collector.pedals.begin(attributes.find(a => a.name === 'id')?.value || ''); measureIndex = -1; stack.push('part'); return; }\n const measure = parent === 'part' && local === 'measure';\n if (measure) measureIndex++;\n builder.open(name, attributes, parent === 'root' || parent === 'part');\n stack.push(measure ? 'measure' : 'other');\n },\n endElement() {\n const kind = stack.pop()!;\n if (kind === 'root') return;\n if (kind === 'part') { collector.pedals.end(); return; }\n const done = builder.close();\n if (!done) return;\n collector.notes(done);\n if (kind === 'measure') collector.pedals.measure(done, measureIndex);\n else if (timewise && done.localName === 'measure') for (const item of children(done, 'part')) { const id = item.getAttribute('id') || ''; timewiseParts.set(id, [...(timewiseParts.get(id) || []), item]); }\n },\n text: value => builder.text(value),\n });\n } catch (error) {\n if (error instanceof XmlError) return playbackCollector().result();\n throw error;\n }\n return timewise ? timewiseMarks(collector, timewiseParts) : collector.result();\n}\nfunction timewiseMarks(collector: PlaybackCollector, parts: Map<string, XmlElement[]>): PlaybackMarks {\n for (const [id, measures] of parts) {\n collector.pedals.begin(id);\n measures.forEach((measure, index) => collector.pedals.measure(measure, index));\n collector.pedals.end();\n }\n return collector.result();\n}\n","/**\n * Drum-set notation for General MIDI percussion (channel 10) on a five-line percussion staff, following the common\n * drum-set convention (PAS / MuseScore default kit): kick in the bottom space, snare in the third space, toms around\n * them, cymbals above the staff with x noteheads. Positions are written as treble-clef pitches; `loc` is the MEI staff\n * position (0 = bottom line, 1 = bottom space, ... 8 = top line).\n */\nexport type DrumHead = 'x' | 'diamond';\nexport type DrumNotation = { name: string; step: string; octave: number; head?: DrumHead };\n\nconst drum = (name: string, position: string, head?: DrumHead): DrumNotation => ({ name, step: position[0], octave: Number(position.slice(1)), ...(head ? { head } : {}) });\n\nexport const GM_DRUM_NOTATION: Readonly<Record<number, DrumNotation>> = {\n 35: drum('Acoustic Bass Drum', 'E4'),\n 36: drum('Bass Drum 1', 'F4'),\n 37: drum('Side Stick', 'C5', 'x'),\n 38: drum('Acoustic Snare', 'C5'),\n 39: drum('Hand Clap', 'B4', 'x'),\n 40: drum('Electric Snare', 'C5'),\n 41: drum('Low Floor Tom', 'G4'),\n 42: drum('Closed Hi-Hat', 'G5', 'x'),\n 43: drum('High Floor Tom', 'A4'),\n 44: drum('Pedal Hi-Hat', 'D4', 'x'),\n 45: drum('Low Tom', 'B4'),\n 46: drum('Open Hi-Hat', 'G5', 'x'),\n 47: drum('Low-Mid Tom', 'D5'),\n 48: drum('Hi-Mid Tom', 'E5'),\n 49: drum('Crash Cymbal 1', 'A5', 'x'),\n 50: drum('High Tom', 'E5'),\n 51: drum('Ride Cymbal 1', 'F5', 'x'),\n 52: drum('Chinese Cymbal', 'B5', 'x'),\n 53: drum('Ride Bell', 'F5', 'diamond'),\n 54: drum('Tambourine', 'E5', 'x'),\n 55: drum('Splash Cymbal', 'B5', 'x'),\n 56: drum('Cowbell', 'D5', 'diamond'),\n 57: drum('Crash Cymbal 2', 'A5', 'x'),\n 59: drum('Ride Cymbal 2', 'F5', 'x'),\n};\n/** Any other GM percussion sound: a diamond in the top space, apart from the kit. */\nexport const DRUM_FALLBACK: DrumNotation = drum('Percussion', 'E5', 'diamond');\n\nexport const drumNotation = (midi: number): DrumNotation => GM_DRUM_NOTATION[midi] ?? DRUM_FALLBACK;\n\n/** MEI @loc of a written treble-clef position on a five-line staff (E4 = 0, the bottom line). */\nexport function staffLoc(step: string, octave: number): number {\n return octave * 7 + 'CDEFGAB'.indexOf(step.toUpperCase()) - (4 * 7 + 2);\n}\n","import type { Part, Score, ScoreNote } from '../score';\nimport { countElements, inventoryFromCounts, type FeatureInventory, type SourceDiagnostic } from './musicxml-source';\nimport { XmlError } from './xml-stream';\nimport { drumNotation, staffLoc } from './drum-map';\n\nexport type { SourceDiagnostic };\nexport type SourceFormat = 'musicxml' | 'mxl' | 'mei' | 'abc' | 'midi' | 'sample';\nexport type EngravingFormat = 'musicxml' | 'mei';\nexport type SourceIdentity = {\n /** Legacy settings key -> source part and staff. */\n staffIdToSource: Record<string, { partId: string; staff: number; sourceId?: string }>;\n /** Source element ID -> existing ScoreNote ID. Several source pitches can share a chord ID. */\n sourceIdToNoteId: Record<string, string>;\n /** Existing ScoreNote ID -> first source note element ID. */\n noteIdToSourceId: Record<string, string>;\n};\nexport type SourceDocument = Readonly<{\n format: SourceFormat;\n engravingFormat: EngravingFormat;\n /** Original XML or ABC text; for MXL this is the extracted score member. Decoded on demand for imported files. */\n originalText?: string;\n /** Direct-import XML/MEI; it may contain IDs or timewise normalization. Decoded on demand for imported files. */\n engravingText: string;\n /** UTF-8 bytes of engravingText, without decoding it (what the Verovio worker is sent). */\n engravingBytes: () => Uint8Array;\n /** SHA-256 of original file bytes (archive bytes for MXL). */\n sha256?: string;\n filename?: string;\n featureCounts: Readonly<Record<string, number>>;\n diagnostics: readonly SourceDiagnostic[];\n identity: SourceIdentity;\n readOriginalBytes: () => Uint8Array;\n}>;\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst xmlId = (id: string) => `n_${id.replace(/[^A-Za-z0-9_.-]/g, '_')}`;\n/** Deterministic MEI staffDef ID for a Score part, so views can hide staves by identity. */\nexport const staffDefXmlId = (partId: string) => `staff_${partId.replace(/[^A-Za-z0-9_.-]/g, '_')}`;\nconst escape = (value: string) => value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\n/** Source feature inventory of an XML source (MusicXML, MXL member or MEI), read with the streaming tokenizer. */\nexport function sourceFeatureInventory(text: string, format: SourceFormat): FeatureInventory {\n if (!['musicxml', 'mxl', 'mei'].includes(format)) return { featureCounts: {}, diagnostics: [] };\n try {\n const { names, root } = countElements(text);\n return inventoryFromCounts(names, root);\n } catch (error) {\n if (!(error instanceof XmlError)) throw error;\n return { featureCounts: {}, diagnostics: [{ feature: 'xml', status: 'unsupported', location: '/', message: 'Source XML could not be parsed.' }] };\n }\n}\n\n/** A text held as UTF-8 bytes (imported files keep bytes, not strings, on the main thread) or as a string. */\nexport type SourceText = string | { bytes: Uint8Array; decode?: () => string };\nconst textOf = (source: SourceText) => typeof source === 'string' ? source : source.decode ? source.decode() : decoder.decode(source.bytes);\n\nexport function makeSourceDocument(args: {\n format: SourceFormat; engravingFormat: EngravingFormat; originalBytes?: Uint8Array; originalText?: SourceText;\n engravingText: SourceText; filename?: string; sha256?: string; identity?: SourceIdentity;\n diagnostics?: readonly SourceDiagnostic[];\n /** A feature inventory already taken of the same source (by the import worker, or re-wrapping a document), so it is not read again. */\n inventory?: { featureCounts: Readonly<Record<string, number>>; diagnostics: readonly SourceDiagnostic[] };\n}): SourceDocument {\n // Binary sources (MXL archives, MIDI) keep their bytes, owned by the document; a text source's bytes are its text,\n // encoded on demand rather than held as a second copy. Imported files keep only bytes: their texts are decoded on\n // demand, so the main thread holds no copy of a large source as a string.\n const bytes = args.originalBytes;\n const original = args.originalText;\n const engraving = args.engravingText;\n const inventory = args.inventory || sourceFeatureInventory(original !== undefined ? textOf(original) || textOf(engraving) : textOf(engraving), args.format);\n const document = {\n format: args.format, engravingFormat: args.engravingFormat, filename: args.filename, sha256: args.sha256,\n featureCounts: Object.freeze({ ...inventory.featureCounts }), diagnostics: Object.freeze([...inventory.diagnostics, ...(args.diagnostics || [])]),\n identity: args.identity || { staffIdToSource: {}, sourceIdToNoteId: {}, noteIdToSourceId: {} },\n engravingBytes: () => typeof engraving === 'string' ? encoder.encode(engraving) : engraving.bytes,\n readOriginalBytes: () => bytes ? bytes.slice() : encoder.encode(original === undefined ? '' : textOf(original)),\n };\n Object.defineProperty(document, 'originalText', { enumerable: true, get: () => original === undefined ? undefined : textOf(original) });\n Object.defineProperty(document, 'engravingText', { enumerable: true, get: () => textOf(engraving) });\n return Object.freeze(document) as SourceDocument;\n}\n\n/** Builds a SourceIdentity part by part (identityForScore in one go, or incrementally as a score arrives in chunks). */\nexport class IdentityBuilder {\n readonly identity: SourceIdentity = { staffIdToSource: {}, sourceIdToNoteId: {}, noteIdToSourceId: {} };\n part(part: Pick<Part, 'id'>): void {\n const match = /^(.*)-(\\d+)$/.exec(part.id);\n this.identity.staffIdToSource[part.id] = { partId: match?.[1] || part.id, staff: match ? Number(match[2]) : 1 };\n }\n notes(measures: Part['measures']): void {\n const identity = this.identity;\n for (const measure of measures) for (const note of measure.notes) {\n const sourceIds = [note.sourceId, ...note.pitches.map(p => p.sourceId)].filter((id): id is string => Boolean(id));\n if (!sourceIds.length) sourceIds.push(...(note.pitches.length > 1 ? note.pitches.map((_, index) => `${xmlId(note.id)}_p${index + 1}`) : [xmlId(note.id)]));\n identity.noteIdToSourceId[note.id] = sourceIds[0];\n for (const id of sourceIds) identity.sourceIdToNoteId[id] = note.id;\n }\n }\n}\n\ntype Segment = { note: ScoreNote; start: number; duration: number; continuation: number };\nfunction durationPieces(beats: number): { beats: number; dur: string; dots?: number }[] {\n const values = [4, 3, 2, 1.5, 1, .75, .5, .375, .25, .1875, .125, .0625];\n const result: { beats: number; dur: string; dots?: number }[] = [];\n let left = Math.round(beats * 64) / 64;\n while (left > 1e-6) {\n const value = values.find(v => v <= left + 1e-6) || .0625;\n const base = [4, 2, 1, .5, .25, .125, .0625].find(v => value === v || value === v * 1.5) || .0625;\n result.push({ beats: value, dur: String(4 / base), dots: value === base * 1.5 ? 1 : undefined });\n left -= value;\n }\n return result;\n}\n/**\n * Staff position and notehead of a percussion pitch: its written (display) position when the source had one (ABC,\n * unpitched MusicXML-style pitches), else the GM drum map for its MIDI note (MIDI channel 10).\n */\nfunction percussionPosition(pitch: ScoreNote['pitches'][number]): { loc: number; head?: string } {\n if (pitch.displayStep) return { loc: staffLoc(pitch.displayStep, pitch.displayOctave ?? 4) };\n const notation = drumNotation(pitch.midi);\n return { loc: staffLoc(notation.step, notation.octave), head: notation.head };\n}\nfunction meiPitch(note: ScoreNote, index: number, continuation: number, dur: string, dots?: number, pieceIndex = 0, percussion = false): string {\n const pitch = note.pitches[index];\n const source = xmlId(note.id) + (note.pitches.length > 1 ? `_p${index + 1}` : '') + (continuation ? `_c${continuation}` : '') + (pieceIndex ? `_s${pieceIndex}` : '');\n const accidental = pitch.alter === 2 ? 'ss' : pitch.alter === -2 ? 'ff' : pitch.alter === 1 ? 's' : pitch.alter === -1 ? 'f' : 'n';\n const tie = continuation ? 'm' : pitch.tieStart && pitch.tieStop ? 'm' : pitch.tieStart ? 'i' : pitch.tieStop ? 't' : undefined;\n // Percussion is unpitched: placed by staff position (@loc) with no pname/oct, so Verovio's transpose leaves it alone.\n const position = percussion ? percussionPosition(pitch) : undefined;\n const placement = position\n ? `loc=\"${position.loc}\"${position.head ? ` head.shape=\"${position.head}\"` : ''}`\n : `pname=\"${escape(pitch.step.toLowerCase())}\" oct=\"${pitch.octave}\" ${pitch.alter ? `accid.ges=\"${accidental}\"` : ''} ${pitch.accidental ? `accid=\"${accidental}\"` : ''}`;\n return `<note xml:id=\"${escape(source)}\" ${placement} ${tie ? `tie=\"${tie}\"` : ''} ${note.pitches.length === 1 ? `dur=\"${dur}\"${dots ? ` dots=\"${dots}\"` : ''}` : ''}/>`;\n}\nfunction meiEvent(note: ScoreNote, continuation: number, dur: string, dots?: number, pieceIndex = 0, percussion = false): string {\n if (!note.pitches.length) return `<rest dur=\"${dur}\"${dots ? ` dots=\"${dots}\"` : ''}/>`;\n const lyric = note.lyric && !continuation ? `<verse n=\"1\"><syl>${escape(note.lyric)}</syl></verse>` : '';\n if (note.pitches.length === 1) return meiPitch(note, 0, continuation, dur, dots, pieceIndex, percussion).replace('/>', `>${lyric}</note>`);\n return `<chord xml:id=\"${escape(xmlId(note.id) + (continuation ? `_c${continuation}` : '') + (pieceIndex ? `_s${pieceIndex}` : ''))}\" dur=\"${dur}\"${dots ? ` dots=\"${dots}\"` : ''}>${note.pitches.map((_, index) => meiPitch(note, index, continuation, dur, dots, pieceIndex, percussion)).join('')}${lyric}</chord>`;\n}\nfunction layerXml(segments: Segment[], beats: number, percussion = false): string {\n let cursor = 0;\n const tokens: string[] = [];\n // Open beam/tuplet wrappers, innermost last. MEI needs proper nesting, so a beam that\n // ends inside a tuplet is closed when that tuplet closes.\n const open: ('beam' | 'tuplet')[] = [];\n let tupletKey = '';\n let beamEndPending = false;\n const closeTop = () => { const top = open.pop(); if (top) tokens.push(`</${top}>`); if (top === 'tuplet') tupletKey = ''; };\n const closeTuplet = () => {\n if (!open.includes('tuplet')) return;\n while (open.length && open.at(-1) !== 'tuplet') closeTop();\n closeTop();\n if (beamEndPending && open.at(-1) === 'beam') { closeTop(); beamEndPending = false; }\n };\n const closeBeam = () => {\n if (!open.includes('beam')) return;\n if (open.at(-1) === 'beam') closeTop(); else beamEndPending = true;\n };\n const rests = (length: number) => durationPieces(length).map(piece => `<rest dur=\"${piece.dur}\"${piece.dots ? ` dots=\"${piece.dots}\"` : ''}/>`);\n for (const segment of segments.sort((a, b) => a.start - b.start || a.note.id.localeCompare(b.note.id))) {\n const gap = Math.max(0, segment.start - cursor);\n if (gap > 1e-6) { closeTuplet(); tokens.push(...rests(gap)); }\n const tuplet = segment.note.tuplet;\n // Tuplet notes carry sounding durations; engrave their written value inside a <tuplet> wrapper.\n const written = tuplet && tuplet.actual > 0 && tuplet.normal > 0 && !segment.continuation && Math.abs(segment.duration - segment.note.duration) < 1e-6\n ? durationPieces(segment.duration * tuplet.actual / tuplet.normal) : undefined;\n const inTuplet = !!written && written.length === 1;\n const key = inTuplet ? `${tuplet!.actual}/${tuplet!.normal}` : '';\n if (!inTuplet || (tuplet!.start && open.includes('tuplet')) || (tupletKey && tupletKey !== key)) closeTuplet();\n if (segment.note.beamStart && !open.includes('beam')) { tokens.push('<beam>'); open.push('beam'); beamEndPending = false; }\n if (inTuplet && !open.includes('tuplet')) { tokens.push(`<tuplet num=\"${tuplet!.actual}\" numbase=\"${tuplet!.normal}\">`); open.push('tuplet'); tupletKey = key; }\n const pieces = inTuplet ? written! : durationPieces(segment.duration);\n for (const [pieceIndex, piece] of pieces.entries()) tokens.push(meiEvent(segment.note, segment.continuation, piece.dur, piece.dots, pieceIndex, percussion));\n if (inTuplet && tuplet!.stop) closeTuplet();\n if (segment.note.beamEnd) closeBeam();\n cursor = Math.max(cursor, segment.start + segment.duration);\n }\n closeTuplet();\n while (open.length) closeTop();\n if (beats - cursor > 1e-6) tokens.push(...rests(beats - cursor));\n return tokens.join('');\n}\n\n/** A semantic MEI adapter for the reduced ABC/MIDI/demo model. Never use this for MusicXML or MEI originals. */\nexport function scoreToMei(score: Score): string {\n const count = Math.max(0, ...score.parts.map(part => part.measures.length));\n const meter = `meter.count=\"${score.beats}\" meter.unit=\"${score.beatType}\"`;\n const key = (score.key ? ` key.sig=\"${Math.abs(score.key)}${score.key > 0 ? 's' : 'f'}\"` : ' key.sig=\"0\"') + (score.keyMode === 'minor' ? ' key.mode=\"minor\"' : '');\n const staffDefs = score.parts.map((part, index) => `<staffDef xml:id=\"${escape(staffDefXmlId(part.id))}\" n=\"${index + 1}\" lines=\"5\" label=\"${escape(part.name)}\" clef.shape=\"${part.clef === 'bass' ? 'F' : part.clef === 'alto' ? 'C' : part.clef === 'percussion' ? 'perc' : 'G'}\" clef.line=\"${part.clef === 'bass' ? 4 : part.clef === 'alto' || part.clef === 'percussion' ? 3 : 2}\"/>`).join('');\n const navigation = Array.from({ length: count }, (_, index) => score.parts[0]?.measures[index]?.navigation);\n const jumpTarget = navigation.some(nav => nav?.toCoda) ? ' al Coda' : navigation.some(nav => nav?.fine) ? ' al Fine' : '';\n const measures = Array.from({ length: count }, (_, measureIndex) => {\n const staves = score.parts.map((part, staffIndex) => {\n const measure = part.measures[measureIndex];\n const beats = measure?.implicit ? measure.beats : measure?.nominalBeats || score.beats * 4 / score.beatType;\n const incoming: Segment[] = [];\n for (let sourceMeasure = 0; sourceMeasure <= measureIndex; sourceMeasure++) {\n const source = part.measures[sourceMeasure]; if (!source) continue;\n const nominal = source.nominalBeats || score.beats * 4 / score.beatType;\n for (const note of source.notes) {\n const absolute = sourceMeasure * nominal + note.start;\n const measureStart = measureIndex * nominal;\n const overlapStart = Math.max(absolute, measureStart);\n const overlapEnd = Math.min(absolute + note.duration, measureStart + beats);\n if (overlapEnd > overlapStart + 1e-6) incoming.push({ note, start: overlapStart - measureStart, duration: overlapEnd - overlapStart, continuation: sourceMeasure === measureIndex ? 0 : measureIndex - sourceMeasure });\n }\n }\n // Separate overlapping voices while retaining each ABC voice where present.\n const layers: Segment[][] = [];\n const ends: number[] = [];\n for (const segment of incoming.sort((a, b) => a.start - b.start || a.note.id.localeCompare(b.note.id))) {\n const preferred = segment.note.voice ? Number(segment.note.voice) - 1 : -1;\n let layer = preferred >= 0 && ends[preferred] <= segment.start + 1e-6 ? preferred : ends.findIndex(end => end <= segment.start + 1e-6);\n if (layer < 0) layer = ends.length;\n (layers[layer] ||= []).push(segment); ends[layer] = segment.start + segment.duration;\n }\n return `<staff n=\"${staffIndex + 1}\">${(layers.length ? layers : [[]]).map((layer, index) => `<layer n=\"${index + 1}\">${layerXml(layer, beats, part.clef === 'percussion')}</layer>`).join('')}</staff>`;\n }).join('');\n const harmonies = score.parts.flatMap((part, index) => part.measures[measureIndex]?.notes.filter(note => note.chordSymbol).map(note => `<harm staff=\"${index + 1}\" tstamp=\"${1 + note.start}\" >${escape(note.chordSymbol || '')}</harm>`) || []).join('');\n // A SMuFL quarter-note glyph (metNoteQuarterUp) followed by the beats per minute.\n const tempo = measureIndex === 0 ? `<tempo tstamp=\"1\" staff=\"1\" midi.bpm=\"${score.tempo}\" mm=\"${score.tempo}\" mm.unit=\"4\"><rend glyph.auth=\"smufl\"></rend> = ${score.tempo}</tempo>` : '';\n const nav = navigation[measureIndex] || {};\n const reference = score.parts[0]?.measures[measureIndex];\n const lastBeat = Math.max(1, Math.round(((reference?.beats || score.beats * 4 / score.beatType) * score.beatType / 4) * 1000) / 1000);\n const text = (words: string, tstamp: number) => `<dir tstamp=\"${tstamp}\" staff=\"1\" place=\"above\">${escape(words)}</dir>`;\n const marks = [\n nav.segno ? '<repeatMark func=\"segno\" tstamp=\"1\" staff=\"1\" place=\"above\"/>' : '',\n nav.coda ? '<repeatMark func=\"coda\" tstamp=\"1\" staff=\"1\" place=\"above\"/>' : '',\n nav.toCoda ? text('To Coda', lastBeat) : '',\n nav.fine ? text('Fine', lastBeat) : '',\n nav.daCapo ? text(`D.C.${jumpTarget}`, lastBeat) : '',\n nav.dalSegno ? text(`D.S.${jumpTarget}`, lastBeat) : '',\n ].join('');\n // Repeat barlines: a repeat end followed by a repeat start is one rptboth barline.\n const startsRepeat = nav.repeatStart && !navigation[measureIndex - 1]?.repeatEnd;\n const right = nav.repeatEnd ? (navigation[measureIndex + 1]?.repeatStart ? 'rptboth' : 'rptend') : '';\n const bars = `${startsRepeat ? ' left=\"rptstart\"' : ''}${right ? ` right=\"${right}\"` : ''}`;\n return `<measure n=\"${measureIndex + 1}\"${bars}>${staves}${harmonies}${tempo}${marks}</measure>`;\n });\n // Consecutive measures of one volta bracket are wrapped in an MEI <ending>.\n let sectionXml = '';\n for (let i = 0; i < measures.length;) {\n const endings = navigation[i]?.endings;\n if (!endings?.length) { sectionXml += measures[i++]; continue; }\n const key = endings.join(',');\n let j = i;\n while (j < measures.length && navigation[j]?.endings?.join(',') === key) j++;\n sectionXml += `<ending n=\"${key}\" label=\"${escape(endings.join(', '))}.\">${measures.slice(i, j).join('')}</ending>`;\n i = j;\n }\n return `<?xml version=\"1.0\" encoding=\"utf-8\"?><mei xmlns=\"http://www.music-encoding.org/ns/mei\" meiversion=\"5.0\"><meiHead><fileDesc><titleStmt><title>${escape(score.title)}</title>${score.composer ? `<respStmt><persName role=\"composer\">${escape(score.composer)}</persName></respStmt>` : ''}</titleStmt><pubStmt/></fileDesc></meiHead><music><body><mdiv><score><scoreDef ${meter}${key}><staffGrp>${staffDefs}</staffGrp></scoreDef><section>${sectionXml}</section></score></mdiv></body></music></mei>`;\n}\n\n/** Attach a semantic MEI engraving document to a model-only score (for example the built-in sample). */\nexport function withEngravingDocument<T extends Score>(score: T, format: SourceFormat = 'sample'): T {\n if (score.document) return score;\n const engravingText = scoreToMei(score);\n return { ...score, document: makeSourceDocument({ format, engravingFormat: 'mei', originalText: engravingText, engravingText, identity: identityForScore(score) }) };\n}\n\nexport function identityForScore(score: Score): SourceIdentity {\n const builder = new IdentityBuilder();\n for (const part of score.parts) { builder.part(part); builder.notes(part.measures); }\n return builder.identity;\n}\n","/**\n * Stave scale (zoom): rendered px per Verovio layout unit at Verovio `scale: 100`,\n * i.e. an absolute stave size. `1` is Verovio's natural size (a 72px five-line staff).\n * The layout width is `(viewport width - first-system gutter) / zoom`, so Verovio\n * reflows the score to fill the viewport at the chosen stave size.\n */\nexport type DeviceClass = 'desktop' | 'compact';\n\n/** Slider and pinch range; matches the score-state schema. The floor is low enough for many-staff height fits (Cielito, 12 staves, fits at about 0.22 on desktop). */\nexport const STAVE_SCALE_MIN = .2;\nexport const STAVE_SCALE_MAX = 4;\nexport const STAVE_SCALE_STEP = .05;\n/**\n * Round to the slider step within the range. `min` is the effective minimum: a many-staff height fit can sit below\n * STAVE_SCALE_MIN, and the slider then reaches down to it (the fit is never clamped up).\n */\nexport const clampStaveScale = (value: number, min = STAVE_SCALE_MIN) => Math.max(min, Math.min(STAVE_SCALE_MAX, Math.round(value / STAVE_SCALE_STEP) / Math.round(1 / STAVE_SCALE_STEP)));\n/** Smallest stave scale a saved record may hold (a user can keep a very small height fit). */\nexport const STAVE_SCALE_FLOOR = .02;\n\n/** Desktop: a fine pointer and a viewport wider than 850px. Everything else (phones, tablets) is compact. */\n// Known v1 limitation: this still queries the viewport, not the .pepperscore root (layout CSS sizes from the root).\nexport const DESKTOP_QUERY = '(pointer: fine) and (min-width: 851px)';\nexport const deviceClass = (): DeviceClass => typeof window !== 'undefined' && window.matchMedia?.(DESKTOP_QUERY).matches ? 'desktop' : 'compact';\n\n/**\n * Endless default stave scale (unchanged from the fixed device defaults): desktop is 75% of the sample's former\n * rendered scale of 1 (a 72px staff at 1280x800); phones and tablets keep 1. Vertical does not use it.\n */\nexport const ENDLESS_STAVE_SCALE: Record<DeviceClass, number> = { desktop: .75, compact: 1 };\n/**\n * Vertical default: the largest stave scale at which this many bars fit the first system beside the staff controls at\n * their minimum width, so Auto shows that many per line (`barFitZoom` in render.ts). It depends on the viewport, not the\n * score length: a shorter score is drawn at the same size on a shorter, centred system.\n */\nexport const DEFAULT_VERTICAL_BARS = 4;\n/**\n * Readable floor for the Vertical default on compact devices (phones, tablets): the rendered five-line staff is at least\n * this many px, so a phone shows fewer bars per line (2-3) rather than an unreadably small four-bar fit.\n * Only the default is floored; a user can still zoom below it.\n */\nexport const COMPACT_MIN_DEFAULT_STAVE_PX = 40;\n/** Smallest Vertical default stave scale for a device class (the staff is 72px at stave scale 1, render.ts STAFF_UNITS). */\nexport const minimumDefaultStaveScale = (device: DeviceClass) => device === 'compact' ? Math.ceil(COMPACT_MIN_DEFAULT_STAVE_PX / 72 * 1000) / 1000 : 0;\n/** Scores with more than this many staves default to the full-stack height fit, capped at the default above. */\nexport const HEIGHT_FIT_STAVES = 4;\n/*\n * Without a user-chosen zoom the reader requests 'fit', which render.ts resolves per layout: Vertical fits\n * DEFAULT_VERTICAL_BARS bars, Endless uses ENDLESS_STAVE_SCALE, and many staves take min(that, height fit); on compact\n * devices the Vertical result is then raised to minimumDefaultStaveScale (readability wins over fit). The default\n * is re-resolved on every layout (resize, rotation, mode), while a user-chosen zoom stays fixed and is the only one saved.\n * An explicit bars per line replaces DEFAULT_VERTICAL_BARS in that fit (see BARS_FIT_MAX_STAVE_SCALE).\n */\n\n/**\n * Without a user zoom, an explicit bars per line in Vertical view sets the stave scale: the largest at which that many\n * bars fit the first system at their minimum width (render.ts barFitZoom), so N bars fill the width. This caps it: a\n * single bar on a wide reader stays a large but sane staff, and its bar is stretched to fill the width instead. Busy\n * bars on a narrow reader go down to STAVE_SCALE_MIN, below which the system is width-fitted.\n */\nexport const BARS_FIT_MAX_STAVE_SCALE = 2.5;\n","import type { FileSettings } from './file-state';\n\n/** Explicit bars per line (`barsPerLine`) range; Auto is capped separately (render.ts AUTO_BAR_CAP). */\nexport const BARS_PER_LINE_MIN = 1;\nexport const BARS_PER_LINE_MAX = 8;\n/** Round and clamp an explicit bar count into range. */\nexport const clampBarsPerLine = (value: number) => Math.max(BARS_PER_LINE_MIN, Math.min(BARS_PER_LINE_MAX, Math.round(value)));\n\n/** Reader settings; `zoom` is the score's explicit stave scale, or null for the device default (see stave-scale.ts). */\nexport type Prefs = FileSettings & { zoom: number | null };\nexport const defaults: Prefs = { mode: 'portrait', notationFont: 'Bravura', barsPerLine: 'auto', overlap: 1, names: false, chordSymbols: false, inferChordSymbols: false, counts: false, subdivisions: false, annotationFont: 'Sans', bpm: 96, zoom: null, semitones: 0, scorePitch: 'written', keyFlip: false };\n\n/** Saved global prefs, repaired. Zoom is per score (score-db), so a legacy global zoom is ignored. */\nexport function sanitizeSavedPrefs(raw: unknown): Prefs {\n const { zoom: _legacyZoom, ...saved } = (raw && typeof raw === 'object' ? raw : {}) as Record<string, unknown>;\n const next = { ...defaults, ...saved, zoom: null } as Prefs;\n if (typeof next.barsPerLine === 'number') next.barsPerLine = Number.isFinite(next.barsPerLine) ? clampBarsPerLine(next.barsPerLine) : 'auto';\n else if (next.barsPerLine !== 'auto') next.barsPerLine = 'auto';\n if (!Number.isInteger(next.semitones)) next.semitones = 0;\n next.semitones = Math.max(-12, Math.min(12, next.semitones));\n if (!['written', 'concert'].includes(next.scorePitch)) next.scorePitch = 'written';\n if (typeof next.keyFlip !== 'boolean') next.keyFlip = false;\n if (!['Sans', 'Serif', 'Mono'].includes(next.annotationFont)) next.annotationFont = 'Sans';\n return next;\n}\n\n/** Initial reader settings a host passes as `settings` (spec names). Changing a key in the prop re-applies that key. */\nexport type PepperScoreSettings = Partial<{\n noteNames: boolean; chordSymbols: boolean; inferChords: boolean; beatCounts: boolean; subdivisions: boolean;\n musicFont: 'Bravura' | 'Petaluma'; staveFont: 'Sans' | 'Serif' | 'Mono';\n /** 'auto', or 1-8 bars per line in Vertical view. Without a zoom, an explicit count also sets the stave size: that many bars fill the width. */\n barsPerLine: 'auto' | number;\n /** Explicit stave scale (clamped to the slider range when applied), or null for the device default. */\n zoom: number | null;\n semitones: number; concert: boolean; overlap: number;\n}>;\nconst clamp = (value: number, low: number, high: number) => Math.max(low, Math.min(high, Math.round(value)));\n\nexport function settingsToPrefs(settings: PepperScoreSettings = {}): Partial<Prefs> {\n const out: Partial<Prefs> = {};\n if (settings.noteNames !== undefined) out.names = settings.noteNames;\n if (settings.chordSymbols !== undefined) out.chordSymbols = settings.chordSymbols;\n if (settings.inferChords !== undefined) out.inferChordSymbols = settings.inferChords;\n if (settings.beatCounts !== undefined) out.counts = settings.beatCounts;\n if (settings.subdivisions !== undefined) out.subdivisions = settings.subdivisions;\n if (settings.musicFont !== undefined) out.notationFont = settings.musicFont;\n if (settings.staveFont !== undefined) out.annotationFont = settings.staveFont;\n if (settings.barsPerLine !== undefined) out.barsPerLine = settings.barsPerLine === 'auto' ? 'auto' : clampBarsPerLine(settings.barsPerLine);\n if (settings.zoom !== undefined) out.zoom = settings.zoom;\n if (settings.semitones !== undefined) out.semitones = clamp(settings.semitones, -12, 12);\n if (settings.concert !== undefined) out.scorePitch = settings.concert ? 'concert' : 'written';\n if (settings.overlap !== undefined) out.overlap = clamp(settings.overlap, 0, 3);\n return out;\n}\nexport const viewToMode = (view: 'vertical' | 'endless'): Prefs['mode'] => view === 'endless' ? 'landscape' : 'portrait';\n","import { isGmSoundfont, type InstrumentId, type Score } from './score';\nimport { STAVE_SCALE_FLOOR, STAVE_SCALE_MAX, type DeviceClass } from './stave-scale';\nimport { BARS_PER_LINE_MAX, BARS_PER_LINE_MIN } from './prefs';\n\nexport type FileSource = { name: string; size: number; sha256: string; format: string };\nexport type FileSettings = {\n mode: 'portrait' | 'landscape'; notationFont: 'Bravura' | 'Petaluma'; barsPerLine: 'auto' | number;\n overlap: number; names: boolean; chordSymbols: boolean; inferChordSymbols: boolean;\n counts: boolean; subdivisions: boolean; annotationFont: 'Sans' | 'Serif' | 'Mono'; bpm: number; semitones: number; scorePitch: 'written' | 'concert';\n /** Spell the transposed view in the enharmonic key (F# major shown as Gb major); optional on read, default false. */\n keyFlip: boolean;\n};\n/** Saved view: an absolute stave scale and the device class it was chosen on (see stave-scale.ts). */\nexport type ScoreView = { zoom: number; zoomDevice: DeviceClass };\nexport type PartState = { visible: boolean; instrument: InstrumentId; gmSoundfont?: string; volume?: number };\n/** Per-score record (schema: file-state.schema.json). Only settings and hashes, never score content. */\nexport type FileState = {\n version: 2;\n source: FileSource;\n /** Epoch ms of the last time the score was opened; the store keeps the most recent records. */\n lastOpened: number;\n settings: FileSettings;\n parts: Record<string, PartState>;\n view?: ScoreView;\n};\n/** The localStorage v1 record: zoom was a multiplier of the width fit and lived in settings. */\nexport type FileStateV1 = { version: 1; source: FileSource; settings: FileSettings & { zoom: number }; parts: Record<string, PartState> };\n\nexport const MIN_BPM = 30, MAX_BPM = 240;\n/** The reader's BPM control range; saved and source tempos outside it are clamped. */\nexport const clampBpm = (bpm: number) => Math.max(MIN_BPM, Math.min(MAX_BPM, bpm));\n/** The localStorage key of a v1 record; `prefix` is the reader's persist namespace (score-db keyPrefix). */\nexport const legacyStorageKey = (hash: string, prefix = 'scoreflow') => `${prefix}-file-v1:${hash}`;\nconst instruments = new Set<InstrumentId>(['piano', 'guitar', 'bassguitar', 'double-bass', 'drum-kit', 'alto-saxophone', 'tenor-saxophone', 'bari-saxophone', 'flute', 'clarinet', 'trumpet', 'trombone', 'violin', 'viola', 'cello', 'microphone']);\nconst legacyInstruments: Record<string, InstrumentId> = { bass: 'double-bass', drums: 'drum-kit', saxophone: 'alto-saxophone' };\nconst roundConstants = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n];\nconst rotate = (value: number, shift: number) => (value >>> shift) | (value << (32 - shift));\n\n/**\n * Incremental SHA-256 in plain JavaScript: it works on plain HTTP LAN origins, where Web Crypto's subtle API is\n * absent. Bytes are hashed as they are given (no padded copy of the whole input).\n */\nexport class Sha256 {\n private readonly hash = new Uint32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19]);\n private readonly words = new Uint32Array(64);\n private readonly block = new Uint8Array(64);\n private buffered = 0;\n private length = 0;\n update(bytes: Uint8Array): this {\n let offset = 0;\n this.length += bytes.length;\n if (this.buffered) {\n const take = Math.min(64 - this.buffered, bytes.length);\n this.block.set(bytes.subarray(0, take), this.buffered);\n this.buffered += take; offset = take;\n if (this.buffered < 64) return this;\n this.compress(this.block, 0);\n this.buffered = 0;\n }\n for (; offset + 64 <= bytes.length; offset += 64) this.compress(bytes, offset);\n if (offset < bytes.length) { this.block.set(bytes.subarray(offset)); this.buffered = bytes.length - offset; }\n return this;\n }\n hex(): string {\n const tail = new Uint8Array(this.buffered < 56 ? 64 : 128);\n tail.set(this.block.subarray(0, this.buffered));\n tail[this.buffered] = 0x80;\n new DataView(tail.buffer).setBigUint64(tail.length - 8, BigInt(this.length) * 8n);\n for (let offset = 0; offset < tail.length; offset += 64) this.compress(tail, offset);\n return Array.from(this.hash, value => value.toString(16).padStart(8, '0')).join('');\n }\n private compress(bytes: Uint8Array, offset: number): void {\n const { words, hash } = this;\n for (let i = 0; i < 16; i++) { const at = offset + i * 4; words[i] = ((bytes[at] << 24) | (bytes[at + 1] << 16) | (bytes[at + 2] << 8) | bytes[at + 3]) >>> 0; }\n for (let i = 16; i < 64; i++) {\n const x = words[i - 15], y = words[i - 2];\n const sigma0 = rotate(x, 7) ^ rotate(x, 18) ^ (x >>> 3);\n const sigma1 = rotate(y, 17) ^ rotate(y, 19) ^ (y >>> 10);\n words[i] = (words[i - 16] + sigma0 + words[i - 7] + sigma1) >>> 0;\n }\n let [a, b, c, d, e, f, g, h] = hash;\n for (let i = 0; i < 64; i++) {\n const sum1 = rotate(e, 6) ^ rotate(e, 11) ^ rotate(e, 25);\n const choose = (e & f) ^ (~e & g);\n const t1 = (h + sum1 + choose + roundConstants[i] + words[i]) >>> 0;\n const sum0 = rotate(a, 2) ^ rotate(a, 13) ^ rotate(a, 22);\n const majority = (a & b) ^ (a & c) ^ (b & c);\n const t2 = (sum0 + majority) >>> 0;\n h = g; g = f; f = e; e = (d + t1) >>> 0; d = c; c = b; b = a; a = (t1 + t2) >>> 0;\n }\n hash[0] = (hash[0] + a) >>> 0; hash[1] = (hash[1] + b) >>> 0;\n hash[2] = (hash[2] + c) >>> 0; hash[3] = (hash[3] + d) >>> 0;\n hash[4] = (hash[4] + e) >>> 0; hash[5] = (hash[5] + f) >>> 0;\n hash[6] = (hash[6] + g) >>> 0; hash[7] = (hash[7] + h) >>> 0;\n }\n}\n\nexport function sha256Hex(bytes: Uint8Array): string {\n return new Sha256().update(bytes).hex();\n}\n\n/** SHA-256 of `bytes`: Web Crypto when the context has it (secure origins; it runs off the calling thread), else JavaScript. */\nexport async function sha256Digest(bytes: Uint8Array): Promise<string> {\n const subtle = globalThis.crypto?.subtle;\n if (subtle) {\n try {\n const digest = await subtle.digest('SHA-256', bytes as Uint8Array<ArrayBuffer>);\n return Array.from(new Uint8Array(digest), value => value.toString(16).padStart(2, '0')).join('');\n } catch { /* fall back to JavaScript */ }\n }\n return sha256Hex(bytes);\n}\n\n/** Source identity of a file's bytes (the import worker hashes files once, in the worker). */\nexport async function fileSource(file: Pick<File, 'name' | 'size'>, bytes: Uint8Array): Promise<FileSource> {\n return fileSourceFor(file.name, file.size, await sha256Digest(bytes));\n}\nexport const fileSourceFor = (name: string, size: number, sha256: string): FileSource => ({ name, size, sha256, format: name.split('.').pop()?.toLowerCase() || '' });\n/** Source identity for text without a file (the sample, pasted ABC, the musicXml prop): a hash of the text with a format prefix. */\nexport function textSource(format: string, text: string, name: string): FileSource {\n const bytes = new TextEncoder().encode(`${format}:${text}`);\n return { name, size: bytes.length - format.length - 1, sha256: sha256Hex(bytes), format };\n}\n\nconst validZoom = (zoom: unknown): zoom is number => typeof zoom === 'number' && Number.isFinite(zoom) && zoom >= STAVE_SCALE_FLOOR && zoom <= STAVE_SCALE_MAX;\n/** Validate and normalise shared v1/v2 fields in place; false when the record is unusable. */\nfunction validSettingsAndParts(state: { settings: FileSettings; parts: Record<string, PartState> }): boolean {\n const settings = state.settings;\n if (!settings || !state.parts || typeof state.parts !== 'object') return false;\n if (!['portrait', 'landscape'].includes(settings.mode) || !['Bravura', 'Petaluma'].includes(settings.notationFont)) return false;\n if (settings.barsPerLine !== 'auto' && (!Number.isInteger(settings.barsPerLine) || settings.barsPerLine < BARS_PER_LINE_MIN || settings.barsPerLine > BARS_PER_LINE_MAX)) return false;\n if (!Number.isInteger(settings.overlap) || settings.overlap < 0 || settings.overlap > 3) return false;\n // Out-of-range tempos (e.g. cut-time 160 → 320 quarter BPM) are clamped, not a reason to drop the state.\n if (!Number.isFinite(settings.bpm)) return false;\n settings.bpm = clampBpm(settings.bpm);\n if (settings.semitones !== undefined && (!Number.isInteger(settings.semitones) || Math.abs(settings.semitones) > 12)) return false;\n if (settings.scorePitch !== undefined && !['written', 'concert'].includes(settings.scorePitch)) return false;\n if (settings.keyFlip !== undefined && typeof settings.keyFlip !== 'boolean') return false;\n if (settings.annotationFont !== undefined && !['Sans', 'Serif', 'Mono'].includes(settings.annotationFont)) return false;\n if (['names', 'chordSymbols', 'inferChordSymbols', 'counts', 'subdivisions'].some(key => typeof settings[key as keyof FileSettings] !== 'boolean')) return false;\n Object.values(state.parts).forEach(part => { part.instrument = legacyInstruments[part.instrument] || part.instrument; });\n if (Object.values(state.parts).some(part => typeof part.visible !== 'boolean' || !instruments.has(part.instrument) || (part.gmSoundfont !== undefined && !isGmSoundfont(part.gmSoundfont)) || (part.volume !== undefined && (!Number.isInteger(part.volume) || part.volume < 0 || part.volume > 100)))) return false;\n state.settings = { ...settings, annotationFont: settings.annotationFont ?? 'Sans', semitones: settings.semitones ?? 0, scorePitch: settings.scorePitch ?? 'written', keyFlip: settings.keyFlip ?? false };\n return true;\n}\n\n/** Validate a stored v1 (legacy localStorage) record for `sha256`. */\nexport function parseLegacyFileState(raw: unknown, sha256: string): FileStateV1 | null {\n try {\n const state = (typeof raw === 'string' ? JSON.parse(raw) : raw) as FileStateV1;\n if (!state || state.version !== 1 || state.source?.sha256 !== sha256) return null;\n if (!validZoom(state.settings?.zoom)) return null;\n const zoom = state.settings.zoom;\n if (!validSettingsAndParts(state)) return null;\n state.settings.zoom = zoom;\n return state;\n } catch { return null; }\n}\n\n/**\n * v1 → v2. A v1 zoom multiplied the width fit; for the default single-stave layouts\n * that fit was the baseline scale 1, so a changed v1 zoom carries over as an absolute\n * scale for the current device. The v1 default (1) becomes \"no saved view\".\n */\nexport function migrateFileState(legacy: FileStateV1, device: DeviceClass, lastOpened = Date.now()): FileState {\n const { zoom, ...settings } = legacy.settings;\n return { version: 2, source: legacy.source, lastOpened, settings, parts: legacy.parts, ...(zoom !== 1 ? { view: { zoom, zoomDevice: device } } : {}) };\n}\n\n/** Validate a stored v2 record for `sha256`. */\nexport function parseFileState(raw: unknown, sha256: string): FileState | null {\n try {\n const state = (typeof raw === 'string' ? JSON.parse(raw) : structuredClone(raw)) as FileState;\n if (!state || state.version !== 2 || state.source?.sha256 !== sha256 || !Number.isFinite(state.lastOpened)) return null;\n // An unusable view only loses the saved zoom, not the score's other settings.\n if (state.view !== undefined && (!validZoom(state.view?.zoom) || !['desktop', 'compact'].includes(state.view.zoomDevice))) delete state.view;\n if ('zoom' in (state.settings || {})) delete (state.settings as Partial<FileSettings> & { zoom?: number }).zoom;\n return validSettingsAndParts(state) ? state : null;\n } catch { return null; }\n}\n\n/** Read the legacy localStorage v1 record for a source. */\nexport function readFileState(source: FileSource): FileStateV1 | null {\n try { return parseLegacyFileState(localStorage.getItem(legacyStorageKey(source.sha256)), source.sha256); }\n catch { return null; }\n}\n\nexport function buildFileState(source: FileSource, settings: FileSettings, score: Score, hiddenIds: string[], volumes: Record<string, number> = {}, view?: ScoreView, lastOpened = Date.now()): FileState {\n const hidden = new Set(hiddenIds);\n const parts: FileState['parts'] = {};\n for (const part of score.parts) parts[part.id] = { visible: !hidden.has(part.id), instrument: part.instrument, ...(part.gmSoundfont ? { gmSoundfont: part.gmSoundfont } : {}), volume: volumes[part.id] ?? 100 };\n const { mode, notationFont, barsPerLine, overlap, names, chordSymbols, inferChordSymbols, counts, subdivisions, annotationFont, bpm, semitones, scorePitch, keyFlip } = settings;\n return { version: 2, source, lastOpened, settings: { mode, notationFont, barsPerLine, overlap, names, chordSymbols, inferChordSymbols, counts, subdivisions, annotationFont, bpm: clampBpm(bpm), semitones, scorePitch, keyFlip: !!keyFlip }, parts, ...(view ? { view } : {}) };\n}\n","import { strFromU8, unzipSync } from 'fflate';\nimport { parseXmlTree } from './notation/xml-stream';\n\nconst MB = 1024 * 1024;\n/** Largest score file accepted (MusicXML, MXL, MEI, ABC or MIDI). Orchestral MusicXML routinely runs to tens of MB. */\nexport const MAX_SCORE_FILE_BYTES = 64 * MB;\n/** Uncompressed size limit for an MXL score member; bounds decompression so a small archive cannot inflate without limit. */\nexport const MXL_MAX_SCORE_BYTES = 128 * MB;\nexport const formatMb = (bytes: number) => `${Math.round(bytes / MB * 10) / 10} MB`;\n\n/**\n * Reads the MusicXML member of an MXL archive without inflating anything else:\n * only META-INF/container.xml and the chosen score are decompressed, each with a\n * declared-size bound (fflate never writes past the declared size). DOM-free, so it runs in the import worker.\n */\nexport function extractMxlScore(bytes: Uint8Array): string {\n const entries: { name: string; originalSize: number }[] = [];\n let listing: Record<string, Uint8Array>;\n try {\n listing = unzipSync(bytes, { filter: file => { entries.push({ name: file.name, originalSize: file.originalSize }); return file.name === 'META-INF/container.xml' && file.originalSize <= 1_000_000; } });\n } catch { throw new Error('This MXL archive could not be opened.'); }\n const container = listing['META-INF/container.xml'];\n let path: string | undefined;\n if (container) {\n let declared: string | null | undefined;\n try {\n const root = parseXmlTree(strFromU8(container));\n declared = (root.localName === 'rootfile' ? root : root.descendants().find(el => el.localName === 'rootfile'))?.getAttribute('full-path');\n }\n catch { throw new Error('This MXL archive has an unreadable META-INF/container.xml.'); }\n if (declared) {\n try { path = decodeURIComponent(declared.trim()); } catch { path = declared.trim(); }\n path = path.replace(/^\\.\\//, '');\n if (path.startsWith('/') || path.split(/[\\\\/]/).includes('..')) throw new Error('This MXL archive declares an unsafe score path.');\n // Some writers percent-encode the path, others store it raw; accept either spelling.\n if (!entries.some(entry => entry.name === path) && entries.some(entry => entry.name === declared!.trim())) path = declared.trim();\n }\n }\n const target = path ? entries.find(entry => entry.name === path) : entries.find(entry => /\\.(xml|musicxml)$/i.test(entry.name) && !entry.name.startsWith('META-INF/'));\n if (!target) throw new Error(path ? `This MXL archive does not contain its declared score \"${path}\".` : 'This MXL archive has no MusicXML score.');\n if (!(target.originalSize <= MXL_MAX_SCORE_BYTES)) throw new Error(`The score inside this MXL archive is ${formatMb(target.originalSize)} uncompressed; the limit is ${formatMb(MXL_MAX_SCORE_BYTES)}.`);\n let files: Record<string, Uint8Array>;\n try { files = unzipSync(bytes, { filter: file => file.name === target.name && file.originalSize <= MXL_MAX_SCORE_BYTES }); }\n catch { throw new Error('The score inside this MXL archive could not be decompressed.'); }\n const entry = files[target.name];\n if (!entry || !entry.length) throw new Error('The score inside this MXL archive is empty.');\n return strFromU8(entry);\n}\n","/**\n * Enharmonic spelling policy (docs/specs/transpose-and-spelling.md): key choice by pitch class, the enharmonic key\n * flip, Verovio transposition intervals with quality, and key-relative spelling of notes and chord symbols.\n *\n * Pure: no DOM, no Verovio, type-only imports, so it runs in the worker, the main thread and Node tests alike.\n *\n * Notes in the key signature always keep the signature's spelling (E# in F# major, Cb in Gb major). The note rules\n * (flats-only/sharps-only, E#/B#/Fb/Cb, double accidentals) apply to notes outside the signature.\n */\nimport type { GmFamily, InstrumentId } from './score';\n\nexport type KeyMode = 'major' | 'minor';\nexport type Spelled = { step: string; alter: number };\nexport type SpelledPitch = Spelled & { octave: number };\nexport type SpellingKey = {\n /** Tonic name of this mode, e.g. 'F#' (F# major) or 'D#' (D# minor). */\n tonic: string;\n mode: KeyMode;\n /** Key signature: sharps > 0, flats < 0. */\n fifths: number;\n /** The signature's spelling of each letter, C to B. */\n scale: Spelled[];\n};\n/** 'sharp' parts spell pitch class 1 as C# instead of Db; everything else follows the default table. */\nexport type SpellingProfile = 'neutral' | 'sharp';\nexport type KeyOptions = { family?: SpellingProfile; flip?: boolean };\nexport type SpellContext = {\n /** The spelling the source (or Verovio's interval transposition of it) gives this note. */\n source?: Spelled;\n /** MIDI pitch of the previous and next notes in the same voice, for passing notes and upward resolution. */\n prev?: number;\n next?: number;\n /** True when a transposition or key flip was applied; untransposed source double accidentals are kept. */\n transposed?: boolean;\n};\n\nconst LETTERS = ['C', 'D', 'E', 'F', 'G', 'A', 'B'];\nconst NATURAL_PC: Record<string, number> = { C: 0, D: 2, E: 4, F: 5, G: 7, A: 9, B: 11 };\nconst SHARP_ORDER = 'FCGDAEB';\nconst FLAT_ORDER = 'BEADGCF';\nconst MAJOR_BY_FIFTHS = ['Cb', 'Gb', 'Db', 'Ab', 'Eb', 'Bb', 'F', 'C', 'G', 'D', 'A', 'E', 'B', 'F#', 'C#'];\nconst MINOR_BY_FIFTHS = ['Ab', 'Eb', 'Bb', 'F', 'C', 'G', 'D', 'A', 'E', 'B', 'F#', 'C#', 'G#', 'D#', 'A#'];\n/** Major key signature for each pitch class: the default table, and the sharp-leaning profile's one difference. */\nconst DEFAULT_MAJOR_FIFTHS = [0, -5, 2, -3, 4, -1, 6, 1, -4, 3, -2, 5];\nconst SHARP_MAJOR_FIFTHS = [0, 7, 2, -3, 4, -1, 6, 1, -4, 3, -2, 5];\n\nconst mod = (value: number, base: number) => ((value % base) + base) % base;\nconst accidentalText = (alter: number) => alter > 0 ? '#'.repeat(alter) : 'b'.repeat(-alter);\n\n/** Pitch class of a note name ('F#', 'Bb', 'Cb', 'E♯'). */\nexport function pitchClassOf(name: string): number {\n const match = /^([A-Ga-g])([#♯x𝄪b♭𝄫]*)$/.exec(name.trim());\n if (!match) throw new Error(`Not a note name: ${name}`);\n return mod(NATURAL_PC[match[1].toUpperCase()] + alterOf(match[2]), 12);\n}\nfunction alterOf(accidentals: string): number {\n let alter = 0;\n for (const char of accidentals) alter += char === '#' || char === '♯' ? 1 : char === 'x' || char === '𝄪' ? 2 : char === '𝄫' ? -2 : -1;\n return alter;\n}\n\nfunction signatureAlter(step: string, fifths: number): number {\n const order = fifths > 0 ? SHARP_ORDER : FLAT_ORDER;\n const index = order.indexOf(step);\n const count = index < Math.abs(fifths) ? Math.floor((Math.abs(fifths) - 1 - index) / 7) + 1 : 0;\n return fifths > 0 ? count : -count;\n}\n\n/** The key with this signature and mode (fifths within -7..7 for named tonics). */\nexport function keyFromFifths(fifths: number, mode: KeyMode = 'major'): SpellingKey {\n const names = mode === 'minor' ? MINOR_BY_FIFTHS : MAJOR_BY_FIFTHS;\n const tonic = names[fifths + 7];\n if (!tonic) throw new Error(`No key with ${fifths} fifths`);\n return { tonic, mode, fifths, scale: LETTERS.map(step => ({ step, alter: signatureAlter(step, fifths) })) };\n}\n\n/** The key with this tonic name and mode ('Gb' major, 'D#' minor). */\nexport function keyFromTonic(tonic: string, mode: KeyMode = 'major'): SpellingKey {\n const normalized = tonic.replace('♯', '#').replace('♭', 'b');\n const index = (mode === 'minor' ? MINOR_BY_FIFTHS : MAJOR_BY_FIFTHS).indexOf(normalized.charAt(0).toUpperCase() + normalized.slice(1));\n if (index < 0) throw new Error(`No ${mode} key on ${tonic}`);\n return keyFromFifths(index - 7, mode);\n}\n\n/** Pitch class of the key's relative major tonic. */\nconst majorPitchClass = (key: SpellingKey) => mod(pitchClassOf(key.tonic) + (key.mode === 'minor' ? 3 : 0), 12);\n\n/**\n * The enharmonic equivalent of a key (Db <-> C#, F# <-> Gb, B <-> Cb, and their relative minors), or null when the\n * other spelling would need more than 7 accidentals. Never offers the table's parenthesized keys.\n */\nexport function enharmonicFlip(key: SpellingKey): SpellingKey | null {\n const other = key.fifths > 0 ? key.fifths - 12 : key.fifths < 0 ? key.fifths + 12 : null;\n return other === null || Math.abs(other) > 7 ? null : keyFromFifths(other, key.mode);\n}\n\n/**\n * The key for a tonic pitch class (0 = C). A minor key takes its relative major's choice from the table, so ties\n * (Eb minor vs D# minor) follow the major-key preference. `flip` swaps to the enharmonic equivalent when one exists.\n */\nexport function chooseKey(pitchClass: number, mode: KeyMode = 'major', options: KeyOptions = {}): SpellingKey {\n const majorPc = mod(pitchClass + (mode === 'minor' ? 3 : 0), 12);\n const key = keyFromFifths((options.family === 'sharp' ? SHARP_MAJOR_FIFTHS : DEFAULT_MAJOR_FIFTHS)[majorPc], mode);\n return options.flip ? enharmonicFlip(key) ?? key : key;\n}\n\n/**\n * The interval Verovio's `transpose` option takes to move `from` to `to` by `semitones` (signed, any size): a\n * direction, a quality (P, M, m, A, d, AA, dd) and a number, e.g. C->F# up '+A4', C->Gb up '+d5', C->F# down '-d5',\n * +12 '+P8', Db->C# '-d2'. Empty when nothing moves.\n */\nexport function transposeInterval(from: string, to: string, semitones: number): string {\n const delta = mod(LETTERS.indexOf(to.charAt(0).toUpperCase()) - LETTERS.indexOf(from.charAt(0).toUpperCase()), 7);\n // Letter steps in the direction of travel, the octave count chosen to match the semitone size.\n const up = mod(-delta, 7);\n const steps = semitones > 0 ? delta + 7 * Math.max(0, Math.round((semitones * 7 / 12 - delta) / 7))\n : semitones < 0 ? -(up + 7 * Math.max(0, Math.round((-semitones * 7 / 12 - up) / 7)))\n : delta <= 3 ? delta : delta - 7;\n if (!semitones && !steps) return '';\n const size = Math.abs(semitones);\n const number = Math.abs(steps) + 1;\n const simple = Math.abs(steps) % 7;\n const reference = [0, 2, 4, 5, 7, 9, 11][simple] + 12 * Math.floor(Math.abs(steps) / 7);\n const perfect = simple === 0 || simple === 3 || simple === 4;\n const difference = size - reference;\n const quality = perfect\n ? ({ '-2': 'dd', '-1': 'd', 0: 'P', 1: 'A', 2: 'AA' } as Record<string, string>)[difference]\n : ({ '-3': 'dd', '-2': 'd', '-1': 'm', 0: 'M', 1: 'A', 2: 'AA' } as Record<string, string>)[difference];\n if (!quality) throw new Error(`No interval from ${from} to ${to} in ${semitones} semitones`);\n return `${semitones < 0 || (!semitones && steps < 0) ? '-' : '+'}${quality}${number}`;\n}\n\n/**\n * The target key and Verovio interval for transposing a source key by `semitones`, with the key flip and the part's\n * spelling profile. With no transposition and no flip the source key is kept as written (and the interval is empty).\n */\nexport function planTranspose(source: SpellingKey, semitones: number, options: KeyOptions = {}): { key: SpellingKey; interval: string } {\n const base = semitones ? chooseKey(mod(pitchClassOf(source.tonic) + semitones, 12), source.mode, { family: options.family }) : source;\n const key = options.flip ? enharmonicFlip(base) ?? base : base;\n return { key, interval: transposeInterval(source.tonic, key.tonic, semitones) };\n}\n\nfunction withOctave(midi: number, spelled: Spelled): SpelledPitch {\n return { ...spelled, octave: Math.round((midi - NATURAL_PC[spelled.step] - spelled.alter) / 12) - 1 };\n}\nconst spells = (midi: number, spelled: Spelled) => mod(NATURAL_PC[spelled.step] + spelled.alter, 12) === mod(midi, 12);\nconst letterIndex = (step: string) => LETTERS.indexOf(step);\n\n/** The note one letter above (+1) or below (-1) `step`, in diatonic distance from `neighbour`'s spelling. */\nfunction letterStep(from: string, neighbour: Spelled): number {\n const distance = mod(letterIndex(neighbour.step) - letterIndex(from), 7);\n return distance === 1 ? 1 : distance === 6 ? -1 : 0;\n}\n\n/**\n * Key-relative spelling of a MIDI pitch.\n * 1. A double accidental the source wrote is kept when nothing was transposed; otherwise doubles are respelled.\n * 2. Notes in the key signature keep its spelling.\n * 3. A minor key's raised 6th and 7th take the signature's letter raised (B# in C# minor, E# in F# minor), unless\n * that would be a double sharp (F## in G# minor is G). Chromatic notes resolving upward a step keep the source\n * spelling, except E#/B# (F and C) and Fb/Cb (rule 4).\n * 4. Otherwise flat keys use flats and naturals, sharp keys sharps and naturals, and C major / A minor the key table\n * (Db Eb F# Ab Bb). E and B are never Fb/Cb, except a stepwise passing note in a key with 6 or more flats.\n */\nexport function spellPitch(midi: number, key: SpellingKey, context: SpellContext = {}): SpelledPitch {\n const pc = mod(midi, 12);\n const source = context.source && spells(pc, context.source) ? context.source : undefined;\n if (source && Math.abs(source.alter) === 2 && !context.transposed) return withOctave(midi, source);\n const diatonic = key.scale.find(note => spells(pc, note));\n if (diatonic) return withOctave(midi, diatonic);\n // A source spelling kept for an upward resolution is never a double accidental, E#/B# or Fb/Cb (those follow rule 4).\n const allowed = (spelled: Spelled) => Math.abs(spelled.alter) <= 1 && !['E1', 'B1', 'F-1', 'C-1'].includes(spelled.step + spelled.alter);\n // Minor raised 6th and 7th: the signature's letter, one semitone higher.\n if (key.mode === 'minor') {\n const tonic = letterIndex(key.tonic.charAt(0));\n for (const degree of [5, 6]) {\n const letter = key.scale[(tonic + degree) % 7];\n const raised = { step: letter.step, alter: letter.alter + 1 };\n // Exempt from E#->F and B#->C (B# in C# minor), but never a double sharp (F## in G# minor falls through to G).\n if (spells(pc, raised) && Math.abs(raised.alter) <= 1) return withOctave(midi, raised);\n }\n }\n if (source && allowed(source) && context.next !== undefined && context.next - midi >= 1 && context.next - midi <= 2) return withOctave(midi, source);\n const white = Object.entries(NATURAL_PC).find(([, value]) => value === pc)?.[0];\n if (white) {\n // Fb (pc 4) and Cb (pc 11) as a passing note between letters on either side, in keys with 6+ flats.\n const flatSpelling = { step: LETTERS[(letterIndex(white) + 1) % 7], alter: -1 };\n if ((white === 'E' || white === 'B') && key.fifths <= -6 && context.prev !== undefined && context.next !== undefined) {\n const prev = spellPitch(context.prev, key), next = spellPitch(context.next, key);\n const sides = [letterStep(flatSpelling.step, prev), letterStep(flatSpelling.step, next)];\n if (sides.includes(1) && sides.includes(-1)) return withOctave(midi, flatSpelling);\n }\n return withOctave(midi, { step: white, alter: 0 });\n }\n const sharp = { step: LETTERS.find(step => NATURAL_PC[step] === pc - 1)!, alter: 1 };\n const flat = { step: LETTERS.find(step => NATURAL_PC[step] === pc + 1)!, alter: -1 };\n if (key.fifths > 0) return withOctave(midi, sharp);\n if (key.fifths < 0) return withOctave(midi, flat);\n return withOctave(midi, pc === 6 ? sharp : flat);\n}\n\n/** Respell a chord symbol's root and slash bass for a key ('A#m7' in F -> 'Bbm7'); suffix text is unchanged. */\nexport function spellChordSymbol(symbol: string, key: SpellingKey): string {\n const root = /^([A-G])([#♯b♭x𝄪𝄫]*)(.*)$/s.exec(symbol);\n if (!root) return symbol;\n const unicode = /[♯♭]/.test(symbol);\n const name = (step: string, accidentals: string) => {\n const spelled = spellPitch(60 + NATURAL_PC[step] + alterOf(accidentals), key);\n const text = accidentalText(spelled.alter);\n return spelled.step + (unicode ? text.replace(/#/g, '♯').replace(/b/g, '♭') : text);\n };\n const suffix = root[3].replace(/\\/([A-G])([#♯b♭x𝄪𝄫]*)/g, (_, step: string, accidentals: string) => `/${name(step, accidentals)}`);\n return name(root[1], root[2]) + suffix;\n}\n\n/** Spelling profile per GM family (gm-soundfont-manifest.json `family`). Strings and guitars lean sharp. */\nexport const INSTRUMENT_SPELLING: Record<GmFamily, SpellingProfile> = {\n Keyboard: 'neutral', Guitar: 'sharp', Voice: 'neutral', Percussion: 'neutral', Drums: 'neutral',\n Woodwinds: 'neutral', Brass: 'neutral', Strings: 'sharp', 'FX / Other': 'neutral',\n};\n/** GM family of each instrument id, for parts without a GM program (the manifest files basses under Strings). */\nexport const INSTRUMENT_FAMILY: Record<InstrumentId, GmFamily> = {\n piano: 'Keyboard', guitar: 'Guitar', bassguitar: 'Strings', 'double-bass': 'Strings', 'drum-kit': 'Drums',\n 'alto-saxophone': 'Woodwinds', 'tenor-saxophone': 'Woodwinds', 'bari-saxophone': 'Woodwinds', flute: 'Woodwinds', clarinet: 'Woodwinds',\n trumpet: 'Brass', trombone: 'Brass', violin: 'Strings', viola: 'Strings', cello: 'Strings', microphone: 'Voice',\n};\n/**\n * A part's spelling profile. Pass `family` when the part has a GM program (`GM_SOUNDS.find(s => s.program ===\n * part.gmProgram)?.family`); otherwise the instrument id decides.\n */\nexport function spellingProfileFor(part: { instrument: InstrumentId; family?: GmFamily }): SpellingProfile {\n return INSTRUMENT_SPELLING[part.family ?? INSTRUMENT_FAMILY[part.instrument]] ?? 'neutral';\n}\n","/**\n * Key choice and note respelling for a transposed or key-flipped view (docs/specs/transpose-and-spelling.md), shared\n * by the Verovio worker's view MEI pass (`mei-spelling.ts`) and the Score view (`transpose.ts` `scoreForView`), so\n * note-name labels spell exactly like the engraved noteheads.\n *\n * Pure: no DOM, no Verovio.\n */\nimport { chooseKey, enharmonicFlip, keyFromFifths, spellPitch, type KeyMode, type Spelled, type SpelledPitch, type SpellingKey, type SpellingProfile } from '../spelling';\n\nexport type Interval = { diatonic: number; chromatic: number };\n\nconst LETTERS = ['C', 'D', 'E', 'F', 'G', 'A', 'B'];\nconst NATURAL_PC = [0, 2, 4, 5, 7, 9, 11];\nconst mod = (value: number, base: number) => ((value % base) + base) % base;\n\n/** A Verovio interval string ('+A4', '-d5', '+P8', '') as letter steps and semitones. */\nexport function parseInterval(text: string): Interval {\n const match = /^([+-]?)(dd|d|m|M|P|A|AA)(\\d+)$/.exec(text.trim());\n if (!match) return { diatonic: 0, chromatic: 0 };\n const steps = Number(match[3]) - 1;\n const simple = steps % 7;\n const reference = NATURAL_PC[simple] + 12 * Math.floor(steps / 7);\n const perfect = simple === 0 || simple === 3 || simple === 4;\n const offset = (perfect ? { dd: -2, d: -1, P: 0, A: 1, AA: 2 } : { dd: -3, d: -2, m: -1, M: 0, A: 1, AA: 2 } as Record<string, number>)[match[2] as 'd'] ?? 0;\n const sign = match[1] === '-' ? -1 : 1;\n return { diatonic: sign * steps, chromatic: sign * (reference + offset) };\n}\n\n/** How many fifths an interval moves a key signature (M2 = +2, A4 = +6, d5 = -6, P8 = 0). */\nexport const intervalFifths = ({ diatonic, chromatic }: Interval) => 7 * chromatic - 12 * diatonic;\n\n/** A spelled pitch moved by an interval, keeping its letter relationship (Verovio's interval transposition). */\nexport function transposeSpelled(pitch: SpelledPitch, interval: Interval): SpelledPitch {\n if (!interval.diatonic && !interval.chromatic) return pitch;\n const index = LETTERS.indexOf(pitch.step) + interval.diatonic;\n const step = LETTERS[mod(index, 7)];\n const octave = pitch.octave + Math.floor(index / 7);\n const midi = midiOf(pitch) + interval.chromatic;\n return { step, octave, alter: midi - midiOf({ step, octave, alter: 0 }) };\n}\n\nexport const midiOf = (pitch: SpelledPitch) => (pitch.octave + 1) * 12 + NATURAL_PC[LETTERS.indexOf(pitch.step)] + pitch.alter;\n\n/** MEI key signature value ('3s', '2f', '0') as fifths; null when absent or not a plain count. */\nexport function fifthsOf(sig: string | null | undefined): number | null {\n if (sig === null || sig === undefined) return null;\n const match = /^\\s*(\\d+)\\s*([sf]?)\\s*$/.exec(sig);\n if (!match) return null;\n const count = Number(match[1]);\n return match[2] === 'f' ? -count : count;\n}\nexport const sigOf = (fifths: number) => fifths > 0 ? `${fifths}s` : fifths < 0 ? `${-fifths}f` : '0';\n\n/** Fifths folded into -7..7 (a key past 7 accidentals has an enharmonic within it). */\nexport const foldFifths = (fifths: number) => {\n let value = fifths;\n while (value > 7) value -= 12;\n while (value < -7) value += 12;\n return value;\n};\n\nexport type StaffSpelling = {\n /** Spelling profile of the staff's part ('neutral' in the concert view, where one global key applies). */\n profile: SpellingProfile;\n /** The staff's pitch moves in this view (a transposition, or a transposing part shown at concert pitch). */\n moved: boolean;\n};\n\n/**\n * The key a staff shows. `fifths` is the staff's key in this view before the global transposition and flip (the\n * source key, or its sounding key for a transposing part in the concert view). Transposed, a staff takes the key\n * table's choice for its pitch class (with the part's profile and the flip). Untransposed, it keeps that key (a\n * sounding key past 7 accidentals folded to its enharmonic, Fb -> E), or its enharmonic equivalent when flipped, so\n * a concert view shows a B♭ trumpet in the same key as the concert-pitch parts beside it.\n */\nexport function viewKey(fifths: number, semitones: number, mode: KeyMode, staff: StaffSpelling, flip: boolean): SpellingKey {\n if (semitones === 0) {\n const source = keyFromFifths(foldFifths(fifths), mode);\n return flip ? enharmonicFlip(source) ?? source : source;\n }\n const majorPc = mod(7 * (fifths + 7 * semitones), 12);\n return chooseKey(mod(majorPc - (mode === 'minor' ? 3 : 0), 12), mode, { family: staff.profile, flip });\n}\n\nexport type LineNote = {\n /** Sounding (view) MIDI pitch. */\n midi: number;\n /** The spelling the source gives it after the view's interval transposition. */\n source: SpelledPitch;\n key: SpellingKey;\n /** Part of a chord: chord tones are neither passing notes nor resolutions, so they get no neighbours. */\n chord: boolean;\n /** Index (into the same line) of the note this one is tied from; it takes that note's spelling. */\n tiedFrom?: number;\n};\n\n/** Key-relative spelling of one voice's notes in order, with neighbours for passing notes and upward resolutions. */\nexport function respellLine(notes: LineNote[]): SpelledPitch[] {\n const out: SpelledPitch[] = [];\n notes.forEach((note, index) => {\n if (note.tiedFrom !== undefined && out[note.tiedFrom] && midiOf(out[note.tiedFrom]) === note.midi) { out.push(out[note.tiedFrom]); return; }\n const single = (other?: LineNote) => other && !other.chord && !note.chord ? other.midi : undefined;\n out.push(spellPitch(note.midi, note.key, { source: note.source, prev: single(notes[index - 1]), next: single(notes[index + 1]), transposed: true }));\n });\n return out;\n}\n\n/** The key signature's alteration of a letter. */\nexport const signatureAlter = (key: SpellingKey, step: string) => key.scale[LETTERS.indexOf(step)]?.alter ?? 0;\n\nexport type DisplayNote = { pitch: SpelledPitch; onset: number; key: SpellingKey;\n /** Continuation of a tie: never shows an accidental and does not change the measure's accidentals. */\n tieEnd?: boolean;\n /** A cautionary or editorial accidental the source asked for: always shown. */\n cautionary?: boolean };\n\n/**\n * Which notes of one staff-measure show their accidental: a note shows one when its alteration differs from the\n * accidental in force on its line and octave (the key signature, or an earlier accidental in the measure). Notes\n * at the same onset are judged against what was in force before that onset.\n */\nexport function accidentalDisplay(notes: DisplayNote[]): boolean[] {\n const shown: boolean[] = new Array(notes.length).fill(false);\n const order = notes.map((_, index) => index).sort((a, b) => notes[a].onset - notes[b].onset || a - b);\n const state = new Map<string, number>();\n for (let start = 0; start < order.length;) {\n let end = start;\n while (end < order.length && Math.abs(notes[order[end]].onset - notes[order[start]].onset) < 1e-6) end++;\n const updates: [string, number][] = [];\n for (const index of order.slice(start, end)) {\n const { pitch, key, tieEnd, cautionary } = notes[index];\n const line = `${pitch.step}${pitch.octave}`;\n const inForce = state.get(line) ?? signatureAlter(key, pitch.step);\n if (tieEnd) continue;\n if (pitch.alter !== inForce || cautionary) { shown[index] = true; updates.push([line, pitch.alter]); }\n }\n for (const [line, alter] of updates) state.set(line, alter);\n start = end;\n }\n return shown;\n}\n\nconst NAME = /^([A-G])([#♯b♭x𝄪𝄫]*)/;\nconst alterOfText = (text: string) => [...text].reduce((sum, char) => sum + (char === '#' || char === '♯' ? 1 : char === 'x' || char === '𝄪' ? 2 : char === '𝄫' ? -2 : -1), 0);\n/** A chord symbol's root and slash bass moved by intervals (their spelling is then set by `spellChordSymbol`). */\nexport function moveChordSymbol(symbol: string, intervals: Interval[]): string {\n const move = (step: string, accidentals: string) => {\n const moved = intervals.reduce((current, interval) => transposeSpelled(current, interval), { step, alter: alterOfText(accidentals), octave: 4 });\n return moved.step + (moved.alter > 0 ? '#'.repeat(moved.alter) : 'b'.repeat(-moved.alter));\n };\n const root = NAME.exec(symbol);\n if (!root) return symbol;\n const rest = symbol.slice(root[0].length).replace(/\\/([A-G])([#♯b♭x𝄪𝄫]*)/g, (_, step: string, accidentals: string) => `/${move(step, accidentals)}`);\n return move(root[1], root[2]) + rest;\n}\n\nexport type { Spelled, SpelledPitch, SpellingKey };\n","import { GM_SOUNDS, pitch, type KeyMode, type Measure, type Part, type Pitch, type Score, type Transposition } from './score';\nimport { enharmonicFlip, keyFromFifths, spellChordSymbol, transposeInterval, spellingProfileFor, type SpellingKey, type SpellingProfile } from './spelling';\nimport type { SpellingSpec } from './notation/mei-spelling';\nimport { foldFifths, intervalFifths, moveChordSymbol, parseInterval, respellLine, transposeSpelled, viewKey, type Interval, type LineNote } from './notation/respell';\n\nexport type ScorePitchView = 'written' | 'concert';\n\n/**\n * How a Score view was transposed and spelled (set by `scoreForView`); the renderer hands the same plan to the Verovio\n * worker (`spellingSpecFor`), so the engraving and the Score's note names agree.\n */\nexport type PitchView = {\n view: ScorePitchView;\n semitones: number;\n flip: boolean;\n /** The Verovio interval with quality for the transposition (spelling.ts `planTranspose`). */\n interval: string;\n /** Part ids whose pitch the view itself moves (transposing parts at concert pitch). */\n viewMoved: string[];\n /** The Score this view was made from. */\n source: Score;\n};\n\nexport function transposeKey(fifths: number, semitones: number): number {\n if (!semitones) return fifths;\n const next = fifths + semitones * 7;\n return ((next + 6) % 12 + 12) % 12 - 6;\n}\n\nfunction sourceTransposition(part: Part, measure: Measure | undefined): Transposition {\n return measure?.transposition || part.transposition || { semitones: 0 };\n}\n\nexport function soundingMidi(part: Part, measure: Measure, note: Pitch, semitones: number): number {\n if (part.clef === 'percussion') return note.midi;\n return note.midi + semitones + (part.pitchBasis === 'concert' ? 0 : sourceTransposition(part, measure).semitones);\n}\n\n/** The interval a view moves a measure of a part by: written to sounding pitch in the concert view, else none. */\nfunction viewInterval(part: Part, measure: Measure | undefined, view: ScorePitchView): Interval {\n const transposition = sourceTransposition(part, measure);\n if (!transposition.semitones || part.pitchBasis === 'concert' || view !== 'concert') return { diatonic: 0, chromatic: 0 };\n return { diatonic: transposition.diatonic ?? Math.round(transposition.semitones * 7 / 12), chromatic: transposition.semitones };\n}\nconst movedByView = (part: Part, view: ScorePitchView) => part.clef !== 'percussion' && (part.measures.length ? part.measures : [undefined]).some(measure => viewInterval(part, measure, view).chromatic !== 0);\n\n/** A part's spelling profile in a view: its instrument's in the written view; one global (neutral) key at concert pitch. */\nexport function viewProfile(part: Part, view: ScorePitchView): SpellingProfile {\n if (view === 'concert') return 'neutral';\n return spellingProfileFor({ instrument: part.instrument, family: GM_SOUNDS.find(sound => sound.program !== null && sound.program === part.gmProgram)?.family });\n}\n\nconst sameMidi = (a: Pitch, midi: number) => a.midi === midi;\n/**\n * A Score as a view shows it: written or concert pitch, transposed by `semitones` and optionally spelled in the\n * enharmonic key. Spelling follows docs/specs/transpose-and-spelling.md through the same plan the Verovio worker uses\n * (notation/respell.ts), so note names match the engraved noteheads. Percussion is never moved.\n */\nexport function scoreForView(score: Score, view: ScorePitchView, semitones: number, flip = false): Score {\n const viewMoved = score.parts.filter(part => movedByView(part, view)).map(part => part.id);\n if (!semitones && !flip && !viewMoved.length) return score;\n // A flip only applies while the reference key has an enharmonic equivalent (or the score is transposed).\n if (flip && !semitones && !enharmonicFlip(referencePlan(score, view, 0, false).source)) flip = false;\n if (!semitones && !flip && !viewMoved.length) return score;\n const { source, key: target } = referencePlan(score, view, semitones, flip);\n const interval = transposeInterval(source.tonic, target.tonic, semitones);\n const global = parseInterval(interval);\n const pitchView: PitchView = { view, semitones, flip, interval, viewMoved, source: score };\n return { ...score, pitchView, parts: score.parts.map(part => {\n const moved = viewMoved.includes(part.id);\n if (part.clef === 'percussion' || (!moved && !semitones && !flip && !interval)) return part;\n const staff = { profile: viewProfile(part, view), moved };\n // Keys per measure, then every voice respelled as one line across measures.\n const measureKeys = part.measures.map(measure => {\n const shift = viewInterval(part, measure, view);\n return viewKey((measure.key ?? part.key ?? score.key) + intervalFifths(shift), semitones, measure.keyMode ?? part.keyMode ?? score.keyMode ?? 'major', staff, flip);\n });\n const lines = new Map<string, { measure: number; note: number; pitch: number; input: LineNote }[]>();\n part.measures.forEach((measure, measureIndex) => {\n const shift = viewInterval(part, measure, view);\n const order = measure.notes.map((note, index) => ({ note, index })).sort((a, b) => a.note.start - b.note.start);\n for (const { note, index } of order) {\n if (note.rest || !note.pitches.length) continue;\n const line = lines.get(note.voice || '1') ?? lines.set(note.voice || '1', []).get(note.voice || '1')!;\n note.pitches.forEach((source, pitchIndex) => {\n if (source.unpitched) return;\n const spelled = transposeSpelled(transposeSpelled({ step: source.step, alter: source.alter, octave: source.octave }, shift), global);\n const midi = source.midi + shift.chromatic + semitones;\n let tiedFrom: number | undefined;\n if (source.tieStop || note.tieStop) for (let back = line.length - 1; back >= 0 && back >= line.length - 8; back--) {\n const previous = part.measures[line[back].measure].notes[line[back].note].pitches[line[back].pitch];\n if (sameMidi({ ...previous, midi: line[back].input.midi }, midi) && (previous.tieStart || part.measures[line[back].measure].notes[line[back].note].tieStart)) { tiedFrom = back; break; }\n }\n line.push({ measure: measureIndex, note: index, pitch: pitchIndex, input: { midi, source: spelled, key: measureKeys[measureIndex], chord: note.pitches.length > 1, tiedFrom } });\n });\n }\n });\n const spelled = new Map<string, Pitch>();\n for (const line of lines.values()) {\n respellLine(line.map(entry => entry.input)).forEach((result, index) => {\n const entry = line[index];\n spelled.set(`${entry.measure}|${entry.note}|${entry.pitch}`, pitch(result.step, result.octave, result.alter));\n });\n }\n const measures = part.measures.map((measure, measureIndex) => {\n const key = measureKeys[measureIndex];\n const intervals = [viewInterval(part, measure, view), global];\n return { ...measure, key: key.fifths, keyMode: key.mode, notes: measure.notes.map((note, noteIndex) => ({\n ...note,\n pitches: note.pitches.map((source, pitchIndex) => {\n const result = spelled.get(`${measureIndex}|${noteIndex}|${pitchIndex}`);\n return result ? { ...source, ...result, accidental: undefined, cautionary: undefined } : source;\n }),\n chordSymbol: note.chordSymbol ? spellChordSymbol(moveChordSymbol(note.chordSymbol, intervals), key) : undefined,\n })) };\n });\n return { ...part, key: measures[0]?.key ?? part.key, keyMode: measures[0]?.keyMode ?? part.keyMode, measures };\n }) };\n}\n\n/**\n * The worker's spelling plan for a Score view (`scoreForView`'s result) with its staff numbers: the same interval,\n * flip, per-staff profiles and moved staves, and which staves are percussion (never given a key signature).\n */\nexport function spellingSpecFor(score: Score, staffOf: Map<string, string>): SpellingSpec {\n const pitchView = score.pitchView;\n const view = pitchView?.view ?? 'written';\n const staves: SpellingSpec['staves'] = {};\n for (const part of score.parts) {\n const n = staffOf.get(part.id);\n if (!n) continue;\n if (part.clef === 'percussion') { staves[n] = { profile: 'neutral', moved: false, percussion: true }; continue; }\n // The part's keys in this view before the transposition (its written keys, or sounding keys at concert pitch).\n const source = pitchView?.source.parts.find(item => item.id === part.id) ?? part;\n const keys: [number, number, KeyMode][] = [];\n source.measures.forEach((measure, index) => {\n const fifths = (measure.key ?? source.key ?? score.key) + intervalFifths(viewInterval(source, measure, view));\n const mode = measure.keyMode ?? source.keyMode ?? score.keyMode ?? 'major';\n const last = keys.at(-1);\n if (!last || last[1] !== fifths || last[2] !== mode) keys.push([index, fifths, mode]);\n });\n const moved = !!pitchView?.viewMoved.includes(part.id);\n const shift = moved ? viewInterval(source, source.measures[0], view) : undefined;\n staves[n] = { profile: viewProfile(part, view), moved, ...(keys.length ? { keys } : {}), ...(shift?.chromatic ? { shift: [shift.diatonic, shift.chromatic] as [number, number] } : {}) };\n }\n return { interval: pitchView?.interval ?? '', semitones: pitchView?.semitones ?? 0, concert: !!pitchView?.viewMoved.length, flip: !!pitchView?.flip, staves };\n}\n\n/** The key of a measure in a (view) Score, for app-side pitch text such as inferred chord symbols. */\nexport function measureKey(part: Part, measure: Measure, score: Score): SpellingKey {\n return keyFromFifths(foldFifths(measure.key ?? part.key ?? score.key), measure.keyMode ?? part.keyMode ?? score.keyMode ?? 'major');\n}\n\nexport type TransposeReadout = {\n /** The reference key shown (the first pitched part's key in this view after transposition and flip). */\n key: SpellingKey;\n /** The enharmonic key the flip button would switch to, or null when the key has none (button disabled). */\n flipTo: SpellingKey | null;\n /** Header readout, e.g. \"+2 · D\", \"0 · C\", \"-3 · Am\". */\n text: string;\n};\n\n/**\n * The reference key of a score view: the first pitched part's opening key in the view before transposition (`source`,\n * folded into -7..7) and the key it is shown in after the transposition and flip (`key`, as that staff is engraved).\n */\nexport function referencePlan(score: Score, view: ScorePitchView, semitones: number, flip: boolean): { source: SpellingKey; key: SpellingKey } {\n const part = score.parts.find(item => item.clef !== 'percussion');\n const first = part?.measures[0];\n const fifths = (first?.key ?? part?.key ?? score.key) + (part ? intervalFifths(viewInterval(part, first, view)) : 0);\n const mode = first?.keyMode ?? part?.keyMode ?? score.keyMode ?? 'major';\n const staff = { profile: part ? viewProfile(part, view) : 'neutral' as SpellingProfile, moved: !!part && movedByView(part, view) };\n return { source: keyFromFifths(foldFifths(fifths), mode), key: viewKey(fifths, semitones, mode, staff, flip) };\n}\n\n/** Header/drawer readout for a transposition and key flip (\"+2 · D\") and the key the flip offers. */\nexport function transposeReadout(score: Score, view: ScorePitchView, semitones: number, flip: boolean): TransposeReadout {\n const { key } = referencePlan(score, view, semitones, flip);\n const name = (item: SpellingKey) => `${item.tonic}${item.mode === 'minor' ? 'm' : ''}`;\n return { key, flipTo: enharmonicFlip(key), text: `${semitones > 0 ? '+' : ''}${semitones} · ${name(key)}` };\n}\n\n/** Spoken key name for labels: 'G flat major', 'D sharp minor'. */\nexport function spokenKey(key: SpellingKey): string {\n const accidental = key.tonic.slice(1) === '#' ? ' sharp' : key.tonic.slice(1) === 'b' ? ' flat' : '';\n return `${key.tonic.charAt(0)}${accidental} ${key.mode}`;\n}\n","import { readPlaybackMarks } from '../notation/musicxml-source';\n\n/**\n * Playback marks read from MusicXML source text: per-note articulation/fermata/cue marks and damper pedal changes.\n * The timeline consumes only this DOM-free shape, so it can be built in a worker. The import worker reads them in its\n * single pass over the source; other callers read them here with the same streaming reader.\n */\nexport type NoteMark = { durationScale: number; velocityDelta: number; fermata: boolean; silent: boolean };\nexport type PedalChange = { measureIndex: number; beat: number; kind: 'down' | 'up' | 'change' };\nexport type PlaybackMarks = { marks: Map<string, NoteMark>; markDiagnostics: string[]; pedals: Map<string, PedalChange[]>; pedalDiagnostics: string[] };\n\nexport const emptyPlaybackMarks = (): PlaybackMarks => ({ marks: new Map(), markDiagnostics: [], pedals: new Map(), pedalDiagnostics: [] });\n\n/** Marks of a MusicXML text (partwise or timewise); empty when there is none or it is not well-formed XML. */\nexport function musicXmlPlaybackMarks(xml: string | undefined): PlaybackMarks {\n return readPlaybackMarks(xml);\n}\n","import type { MeasureNavigation, Score } from '../score';\nimport { addFraction, compareFraction, formatFraction, fractionValue, fromNumber, parseFraction, ZERO, type Fraction } from './fraction';\n\n/**\n * A position in the written score: a measure index (not its printed number)\n * and an exact rational quarter-note offset from that measure's start.\n */\nexport type RoadmapPos = { bar: number; beat: string };\n/** One linear stretch of the written score, played from `from` up to (not including) `to`. */\nexport type RoadmapSegment = { from: RoadmapPos; to: RoadmapPos; ending?: number; pass?: number };\n/** The performed order of the written score. JSON-serializable, so a user or saved override can replace it. */\nexport type Roadmap = { version: 1; segments: RoadmapSegment[] };\n\n/** Caps for user-supplied roadmaps, so a malformed override cannot run away. */\nexport const ROADMAP_MAX_SEGMENTS = 2048;\nconst ROADMAP_MAX_REPLAY = 64;\n\n/** A span of one measure between navigation points; repeat barlines inside a bar split it. */\ntype Unit = {\n bar: number; from: Fraction; to: Fraction;\n repeatStart?: boolean; repeatEnd?: number; repeatInferred?: boolean; endings?: number[];\n segno?: boolean; coda?: boolean; toCoda?: boolean; daCapo?: boolean; dalSegno?: boolean; fine?: boolean;\n};\n\nexport function measureLengths(score: Score): Fraction[] {\n return (score.parts[0]?.measures || []).map(measure => {\n const beats = Number.isFinite(measure.beats) && measure.beats > 0 ? measure.beats : measure.notes.reduce((max, note) => Math.max(max, note.start + note.duration), 0);\n return fromNumber(Math.max(0, beats));\n });\n}\n\ntype Cut = { at: Fraction; start?: boolean; end?: number; inferred?: boolean };\n\n/**\n * Barline repeats recorded at a measure edge belong to the neighbouring\n * barline: a repeat end at beat 0 closes the previous measure, and a repeat\n * start at the bar end opens the next one. Returns, per measure, the repeat\n * start/end carried onto its own edges.\n */\nfunction edgeRepeats(navigation: (MeasureNavigation | undefined)[], lengths: Fraction[], diagnostics: string[]): { start?: boolean; end?: number; inferred?: boolean }[] {\n const edges = lengths.map(() => ({} as { start?: boolean; end?: number; inferred?: boolean }));\n lengths.forEach((length, bar) => {\n for (const barline of navigation[bar]?.barlines || []) {\n const at = parseFraction(barline.beat);\n if (!at || compareFraction(length, ZERO) <= 0) continue;\n if (barline.repeatEnd && compareFraction(at, ZERO) === 0) {\n if (bar > 0) { edges[bar - 1].end = barline.repeatTimes || 2; edges[bar - 1].inferred = !barline.repeatTimes; }\n else diagnostics.push('A repeat end at the score start has nothing to repeat; it was ignored.');\n }\n if (barline.repeatStart && compareFraction(at, length) === 0) {\n if (bar + 1 < lengths.length) edges[bar + 1].start = true;\n else diagnostics.push('A repeat start at the score end has nothing to repeat; it was ignored.');\n }\n }\n });\n return edges;\n}\n\nfunction units(navigation: (MeasureNavigation | undefined)[], lengths: Fraction[], diagnostics: string[]): Unit[] {\n const result: Unit[] = [];\n const edges = edgeRepeats(navigation, lengths, diagnostics);\n lengths.forEach((length, bar) => {\n const nav = navigation[bar] || {};\n const cuts = new Map<string, Cut>();\n for (const barline of nav.barlines || []) {\n const at = parseFraction(barline.beat);\n if (!at || compareFraction(at, ZERO) < 0 || compareFraction(at, length) > 0) { diagnostics.push(`A repeat barline at beat ${barline.beat} lies outside measure ${bar + 1}; it was ignored.`); continue; }\n const key = formatFraction(at);\n const cut = cuts.get(key) || { at };\n if (barline.repeatStart) cut.start = true;\n if (barline.repeatEnd) { cut.end = barline.repeatTimes || 2; cut.inferred = !barline.repeatTimes; }\n cuts.set(key, cut);\n }\n const edge = edges[bar];\n const inner = [...cuts.values()].filter(cut => compareFraction(cut.at, ZERO) > 0 && compareFraction(cut.at, length) < 0).sort((a, b) => compareFraction(a.at, b.at));\n const atStart = cuts.get('0'), atEnd = cuts.get(formatFraction(length));\n const points = [ZERO, ...inner.map(cut => cut.at), length];\n const first = result.length;\n for (let i = 0; i < points.length - 1; i++) {\n const unit: Unit = { bar, from: points[i], to: points[i + 1] };\n if (nav.endings?.length) unit.endings = [...nav.endings];\n if (i > 0 && inner[i - 1].start) unit.repeatStart = true;\n if (i < inner.length && inner[i].end) { unit.repeatEnd = inner[i].end; unit.repeatInferred = inner[i].inferred; }\n result.push(unit);\n }\n const head = result[first], tail = result[result.length - 1];\n if (nav.repeatStart || atStart?.start || edge.start) head.repeatStart = true;\n if (nav.repeatEnd) { tail.repeatEnd = Math.max(2, Math.min(16, nav.repeatTimes || 2)); tail.repeatInferred = !nav.repeatTimes; }\n else if (atEnd?.end) { tail.repeatEnd = atEnd.end; tail.repeatInferred = atEnd.inferred; }\n else if (edge.end) { tail.repeatEnd = edge.end; tail.repeatInferred = edge.inferred; }\n if (nav.segno) head.segno = true;\n if (nav.coda) head.coda = true;\n for (const key of ['toCoda', 'daCapo', 'dalSegno', 'fine'] as const) if (nav[key]) tail[key] = true;\n });\n return result;\n}\n\n/** The highest ending number of each consecutive group of volta brackets. */\nfunction lastEndings(list: Unit[]): number[] {\n const result = list.map(() => 0);\n for (let i = 0; i < list.length;) {\n if (!list[i].endings) { i++; continue; }\n let j = i, max = 0;\n while (j < list.length && list[j].endings && (j === i || list[j].bar === list[j - 1].bar || !(list[j].endings!.includes(1) && !list[j - 1].endings!.includes(1)))) { max = Math.max(max, ...list[j].endings!); j++; }\n for (let k = i; k < j; k++) result[k] = max;\n i = j;\n }\n return result;\n}\n\ntype Visit = { unit: number; pass: number; ending?: number };\n/**\n * Expands written navigation into the performed order: repeats (with times),\n * 1st/2nd/nth endings, segno, coda, To Coda, D.C., D.S. and Fine. After a\n * D.C./D.S. repeats are not taken and only the last ending of each group plays.\n */\nfunction traverse(list: Unit[], diagnostics: string[]): Visit[] {\n const visits: Visit[] = [];\n const count = list.length;\n let index = 0, trailingPass = 1, jumped = false, codaJumped = false;\n const repeatStack: { start: number; pass: number; implicit?: boolean }[] = [];\n /** The unit of the last completed repeat end: a backward repeat with no forward repeat goes back to just after it. */\n let lastRepeatEnd = -1;\n /** Backward repeats with no forward repeat that already played out; they are never taken again. */\n const spentImplicit = new Set<number>();\n let steps = 0;\n const limit = Math.max(64, count * 16);\n const segno = list.findIndex(unit => unit.segno);\n const finalEnding = lastEndings(list);\n while (index >= 0 && index < count && steps++ < limit) {\n const unit = list[index];\n if (!unit.endings && index > 0 && list[index - 1].endings) trailingPass = 1;\n if (!jumped && unit.repeatStart && !repeatStack.some(repeat => repeat.start === index)) repeatStack.push({ start: index, pass: 1 });\n const pass = repeatStack.at(-1)?.pass || trailingPass;\n const taken = jumped ? finalEnding[index] : pass;\n const endingSkipped = Boolean(unit.endings?.length && !unit.endings.includes(taken));\n if (!endingSkipped) visits.push({ unit: index, pass: jumped ? 1 : pass, ending: unit.endings?.length ? taken : undefined });\n if (!jumped && unit.repeatEnd && !(spentImplicit.has(index) && !repeatStack.length)) {\n if (!repeatStack.length) repeatStack.push({ start: lastRepeatEnd < index ? lastRepeatEnd + 1 : 0, pass: 1, implicit: true });\n const repeat = repeatStack.at(-1)!;\n // An unnumbered repeat that closes an ending repeats until the group's last ending.\n const times = unit.repeatInferred && unit.endings?.length ? Math.max(unit.repeatEnd, Math.min(16, finalEnding[index])) : unit.repeatEnd;\n if (!endingSkipped && repeat.pass < times) { repeat.pass++; index = repeat.start; continue; }\n trailingPass = repeat.pass;\n repeatStack.pop();\n if (repeat.implicit) spentImplicit.add(index);\n lastRepeatEnd = index;\n }\n if (!endingSkipped && !jumped && (unit.daCapo || unit.dalSegno)) {\n jumped = true; trailingPass = 1; repeatStack.length = 0;\n if (unit.dalSegno && segno < 0) diagnostics.push('D.S. has no segno; restarted from the beginning.');\n index = unit.dalSegno && segno >= 0 ? segno : 0;\n continue;\n }\n if (!endingSkipped && jumped && unit.toCoda && !codaJumped) {\n const after = list.findIndex((item, i) => item.coda && i > index);\n const target = after >= 0 ? after : list.findIndex(item => item.coda);\n if (target >= 0) { codaJumped = true; index = target; continue; }\n diagnostics.push('To Coda has no coda; playback continued.');\n }\n if (!endingSkipped && jumped && unit.fine) break;\n index++;\n }\n if (steps >= limit) diagnostics.push('Playback navigation exceeded its safety limit; the score was truncated.');\n return visits;\n}\n\nconst pos = (bar: number, beat: Fraction): RoadmapPos => ({ bar, beat: formatFraction(beat) });\n\n/** Builds the roadmap from per-measure navigation and exact measure lengths. */\nexport function roadmapFromNavigation(navigation: (MeasureNavigation | undefined)[], lengths: Fraction[], diagnostics: string[] = []): Roadmap {\n const list = units(navigation, lengths, diagnostics);\n const segments: RoadmapSegment[] = [];\n let previous = -2;\n for (const visit of traverse(list, diagnostics)) {\n const unit = list[visit.unit];\n // A zero-length stretch plays nothing: it never starts a segment, and a jump into one breaks continuity.\n if (compareFraction(unit.from, unit.to) >= 0) { previous = visit.unit === previous + 1 ? visit.unit : -2; continue; }\n const last = segments.at(-1);\n if (last && visit.unit === previous + 1) {\n last.to = pos(unit.bar, unit.to);\n if (visit.ending !== undefined && last.ending === undefined) last.ending = visit.ending;\n } else {\n const segment: RoadmapSegment = { from: pos(unit.bar, unit.from), to: pos(unit.bar, unit.to) };\n if (visit.ending !== undefined) segment.ending = visit.ending;\n if (visit.pass > 1) segment.pass = visit.pass;\n segments.push(segment);\n }\n previous = visit.unit;\n }\n return { version: 1, segments };\n}\n\n/** The performed roadmap of a score, from the first part's format-neutral navigation. */\nexport function buildRoadmap(score: Score, diagnostics: string[] = []): Roadmap {\n return roadmapFromNavigation((score.parts[0]?.measures || []).map(measure => measure.navigation), measureLengths(score), diagnostics);\n}\n\nexport type ResolvedSegment = { from: { bar: number; beat: Fraction }; to: { bar: number; beat: Fraction } };\n\n/** The segments of a generated roadmap (built by roadmapFromNavigation, so already valid), without validation. */\nexport function generatedSegments(roadmap: Roadmap): ResolvedSegment[] {\n const at = (position: RoadmapPos) => ({ bar: position.bar, beat: parseFraction(position.beat) || ZERO });\n return roadmap.segments.map(segment => ({ from: at(segment.from), to: at(segment.to) }));\n}\n/**\n * Checks a (possibly user-supplied) roadmap against the score: positions must\n * lie inside their measures, each segment must run forwards, and the total\n * length is capped. Returns undefined, with a diagnostic, when it is unusable.\n */\nexport function resolveRoadmap(roadmap: unknown, lengths: Fraction[], diagnostics: string[]): ResolvedSegment[] | undefined {\n const fail = (message: string) => { diagnostics.push(`Roadmap override ignored: ${message}`); return undefined; };\n if (!roadmap || typeof roadmap !== 'object') return fail('not an object.');\n const { version, segments } = roadmap as Partial<Roadmap>;\n if (version !== 1) return fail('unsupported version.');\n if (!Array.isArray(segments)) return fail('segments must be an array.');\n if (segments.length > ROADMAP_MAX_SEGMENTS) return fail(`more than ${ROADMAP_MAX_SEGMENTS} segments.`);\n const starts: Fraction[] = [];\n let total = ZERO;\n lengths.forEach(length => { starts.push(total); total = addFraction(total, length); });\n const absolute = (value: unknown, label: string): { bar: number; beat: Fraction; at: Fraction } | string => {\n if (!value || typeof value !== 'object') return `${label} is not a position.`;\n const { bar, beat } = value as Partial<RoadmapPos>;\n if (!Number.isInteger(bar) || bar! < 0 || bar! >= lengths.length) return `${label} bar ${String(bar)} is out of range.`;\n const offset = parseFraction(beat);\n if (!offset) return `${label} beat ${String(beat)} is not a rational number.`;\n if (compareFraction(offset, ZERO) < 0 || compareFraction(offset, lengths[bar!]) > 0) return `${label} beat ${beat} lies outside measure ${bar! + 1}.`;\n return { bar: bar!, beat: offset, at: addFraction(starts[bar!], offset) };\n };\n const resolved: ResolvedSegment[] = [];\n let performed = 0;\n for (const [i, segment] of segments.entries()) {\n const from = absolute((segment as RoadmapSegment)?.from, `segment ${i + 1} start`);\n const to = absolute((segment as RoadmapSegment)?.to, `segment ${i + 1} end`);\n if (typeof from === 'string') return fail(from);\n if (typeof to === 'string') return fail(to);\n if (compareFraction(from.at, to.at) >= 0) return fail(`segment ${i + 1} does not run forwards.`);\n performed += fractionValue(to.at) - fractionValue(from.at);\n if (performed > ROADMAP_MAX_REPLAY * Math.max(1, fractionValue(total))) return fail('the performed length exceeds the safety limit.');\n resolved.push({ from: { bar: from.bar, beat: from.beat }, to: { bar: to.bar, beat: to.beat } });\n }\n return resolved;\n}\n\n","import type { Part, Pitch, Score, ScoreDirection } from '../score';\nimport { soundingMidi } from '../transpose';\nimport { musicXmlTextNavigation } from '../notation/navigation';\nimport { musicXmlPlaybackMarks, type NoteMark, type PedalChange, type PlaybackMarks } from './source-marks';\nimport { fractionValue } from './fraction';\nimport { buildRoadmap, generatedSegments, measureLengths, resolveRoadmap, roadmapFromNavigation, type ResolvedSegment, type Roadmap } from './roadmap';\n\n/** A sounding pitch. Repeated visits to a written note have separate occurrences. */\nexport type PerformanceEvent = {\n id: string; noteId: string; pitchId: string; pitchIndex: number;\n partId: string; voice: string; measureIndex: number; occurrence: number;\n scoreBeat: number; endScoreBeat: number; startSeconds: number;\n /** Written (articulated) release: drives highlighting and the visual segments. */\n endSeconds: number;\n /**\n * Audible release. Equals endSeconds unless the sustain pedal holds the note\n * past its written release (or a same-pitch re-attack cuts that tail short).\n * Schedule audio with this; never highlight with it.\n */\n soundEndSeconds: number;\n midi: number; velocity: number; visualNoteIds: string[];\n visualSegments: { noteId: string; startSeconds: number; endSeconds: number }[];\n};\nexport type PlaybackPosition = {\n seconds: number; scoreBeat: number; measureIndex: number; occurrence: number;\n measureBeat: number; noteId: string | null; activeNoteIds: string[];\n};\nexport type PerformanceTimeline = {\n events: PerformanceEvent[]; positions: PlaybackPosition[]; durationSeconds: number;\n initialBpm: number; diagnostics: string[];\n /** The roadmap that was performed: the override when it was valid, else the one built from the score. */\n roadmap: Roadmap;\n};\nexport type TimelineOptions = {\n bpm: number; semitones?: number; musicXml?: string; verovioTimemap?: unknown;\n /**\n * The complete, unfiltered score when `score` is a view with hidden parts.\n * Tempo changes, fermata holds and sibling-staff dynamics are read from it so\n * hiding a part never changes the performance of the parts that remain.\n */\n fullScore?: Score;\n /**\n * A user or saved performance order that replaces the one built from the\n * score's navigation. It is validated; an unusable one is diagnosed and the\n * built roadmap is used instead.\n */\n roadmap?: Roadmap;\n};\n\nconst EPS = 1e-7;\n/** Extra hold added by a fermata, as a fraction of the held note's length. */\nconst FERMATA_HOLD = .5;\n/** Grace notes steal at most this many beats from the beat they ornament. */\nconst GRACE_BEATS = .125, GRACE_TOTAL = .25;\nconst dynamics: Record<string, number> = { pppp: 20, ppp: 28, pp: 39, p: 52, mp: 66, mf: 82, f: 96, ff: 108, fff: 118, ffff: 124, sf: 112, sfz: 112, fz: 112, fp: 96, sforzando: 112 };\n\nfunction scoreOffsets(lengths: number[]): number[] {\n let offset = 0;\n return lengths.map(length => { const here = offset; offset += length; return here; });\n}\n\n/** One measure's share of a roadmap segment, with its performed occurrence of that measure. */\ntype Slice = { measureIndex: number; from: number; to: number; occurrence: number; linearIn: boolean; linearOut: boolean };\n/**\n * Splits roadmap segments into per-measure slices. A slice that continues the\n * previous one exactly (next measure start, or the same offset in the same\n * measure) is linear: ties and sounding notes carry across it. Any other\n * entry into a measure is a new occurrence of that measure.\n */\nfunction slices(segments: ResolvedSegment[], lengths: number[]): Slice[] {\n const result: Slice[] = [];\n const occurrences = new Map<number, number>();\n for (const segment of segments) {\n for (let bar = segment.from.bar; bar <= segment.to.bar; bar++) {\n const from = bar === segment.from.bar ? fractionValue(segment.from.beat) : 0;\n const to = bar === segment.to.bar ? fractionValue(segment.to.beat) : lengths[bar];\n if (to <= from + EPS) continue;\n const previous = result.at(-1);\n const sameBar = Boolean(previous && previous.measureIndex === bar && Math.abs(previous.to - from) < EPS);\n const nextBar = Boolean(previous && previous.measureIndex + 1 === bar && from < EPS && Math.abs(previous.to - lengths[previous.measureIndex]) < EPS);\n let occurrence: number;\n if (sameBar) occurrence = previous!.occurrence;\n else { occurrence = occurrences.get(bar) || 0; occurrences.set(bar, occurrence + 1); }\n if (previous) previous.linearOut = sameBar || nextBar;\n result.push({ measureIndex: bar, from, to, occurrence, linearIn: sameBar || nextBar, linearOut: false });\n }\n }\n return result;\n}\n\ntype TempoPoint = { beat: number; bpm: number };\nfunction tempoPoints(score: Score, offsets: number[], diagnostics: string[]): TempoPoint[] {\n const byBeat = new Map<number, number>();\n for (const part of score.parts) for (const measure of part.measures) for (const direction of measure.directions || []) {\n if (direction.tempo && direction.tempo > 0 && offsets[measure.index] !== undefined) {\n const beat = offsets[measure.index] + direction.start;\n const old = byBeat.get(beat);\n if (old && Math.abs(old - direction.tempo) > EPS) diagnostics.push(`Conflicting tempos at score beat ${beat}; first part wins.`);\n else if (!old) byBeat.set(beat, direction.tempo);\n }\n }\n const points = [...byBeat].map(([beat, bpm]) => ({ beat, bpm })).sort((a, b) => a.beat - b.beat);\n if (!points.length || points[0].beat > EPS) points.unshift({ beat: 0, bpm: score.tempo > 0 ? score.tempo : 120 });\n return points;\n}\nfunction tempoAt(points: TempoPoint[], beat: number): number {\n let bpm = points[0].bpm;\n for (const point of points) { if (point.beat > beat + EPS) break; bpm = point.bpm; }\n return bpm;\n}\n\n/** MusicXML <sound dynamics> is a percentage of forte, which is MIDI velocity 90. */\nfunction directionVelocity(direction: ScoreDirection): number | undefined {\n if (direction.soundDynamics !== undefined && Number.isFinite(direction.soundDynamics)) return Math.max(1, Math.min(127, Math.round(direction.soundDynamics * .9)));\n for (const symbol of direction.symbols || []) if (dynamics[symbol] !== undefined) return dynamics[symbol];\n return undefined;\n}\n\ntype DynamicPoint = { beat: number; staffId: string; voice?: string; velocity?: number; wedge?: { type: string; number: string } };\n/** The source part (not staff) a Score part came from; piano staves share dynamics. */\nfunction sourcePartId(score: Score, part: Part): string {\n return score.document?.identity?.staffIdToSource?.[part.id]?.partId || part.id;\n}\nfunction dynamicPoints(score: Score, offsets: number[]): Map<string, DynamicPoint[]> {\n const groups = new Map<string, DynamicPoint[]>();\n for (const part of score.parts) {\n const list = groups.get(sourcePartId(score, part)) || [];\n groups.set(sourcePartId(score, part), list);\n for (const measure of part.measures) {\n const offset = offsets[measure.index];\n if (offset === undefined) continue;\n const directions = measure.directions || [];\n const explicit = directions.some(direction => direction.symbols?.length || direction.soundDynamics !== undefined);\n for (const direction of directions) {\n const velocity = directionVelocity(direction);\n if (velocity !== undefined || direction.wedge) list.push({ beat: offset + direction.start, staffId: part.id, voice: direction.voice, velocity, wedge: direction.wedge });\n }\n // Older imports only filled measure.dynamics; directions win when present.\n if (!explicit) for (const mark of measure.dynamics || []) {\n if (dynamics[mark.symbol] !== undefined) list.push({ beat: offset + mark.start, staffId: part.id, velocity: dynamics[mark.symbol] });\n }\n }\n }\n for (const list of groups.values()) list.sort((a, b) => a.beat - b.beat);\n return groups;\n}\nfunction velocityFor(points: DynamicPoint[], staffId: string, targetBeat: number, voice: string): number {\n let value = 82, valueBeat = -Infinity, valueOwn = false;\n const openWedges = new Map<string, { start: number; velocity: number; type: string }>();\n const completed: { start: number; end: number; velocity: number; type: string }[] = [];\n for (const point of points) {\n if (point.beat > targetBeat + EPS) break;\n const own = point.staffId === staffId;\n // Voice-specific marks only filter notes on their own staff.\n if (own && point.voice && point.voice !== voice) continue;\n if (point.wedge) {\n const key = `${point.staffId}:${point.wedge.number}`;\n const type = point.wedge.type;\n if (type === 'crescendo' || type === 'diminuendo') openWedges.set(key, { start: point.beat, velocity: value, type });\n else if (type === 'stop') {\n const open = openWedges.get(key);\n if (open) { completed.push({ ...open, end: point.beat }); openWedges.delete(key); }\n }\n }\n if (point.velocity === undefined) continue;\n // At the same instant, a mark on the note's own staff beats a sibling staff's.\n if (Math.abs(point.beat - valueBeat) < EPS && valueOwn && !own) continue;\n value = point.velocity; valueBeat = point.beat; valueOwn = own;\n }\n const wedge = [...completed, ...[...openWedges.values()].map(open => ({ ...open, end: targetBeat + 4 }))].find(span => span.start <= targetBeat && span.end > targetBeat);\n if (wedge) {\n const progress = Math.max(0, Math.min(1, (targetBeat - wedge.start) / Math.max(.01, wedge.end - wedge.start)));\n value = Math.round(wedge.velocity + (wedge.type === 'crescendo' ? 22 : -22) * progress);\n }\n return Math.max(1, Math.min(127, value));\n}\n\n\n/** Prefer the identified partwise engraving text: it carries generated note IDs and normalized timewise layout. */\nfunction documentXml(score: Score): string | undefined {\n const document = score.document;\n for (const xml of [document?.engravingText, document?.originalText]) {\n if (xml && /<\\s*(?:\\w+:)?score-(?:partwise|timewise)\\b/.test(xml)) return xml;\n }\n return undefined;\n}\n\n/** Grace notes sound for at least this long, in seconds at the score's opening tempo. */\nconst GRACE_FLOOR_SECONDS = .03;\ntype PerformedPedal = { seconds: number; kind: PedalChange['kind'] };\n\n/**\n * The performance built once per score, independent of BPM, transposition and hidden parts.\n *\n * Every `...Seconds` field (events, visual segments, positions, `durationSeconds`, pedal times) is in performed\n * beats at the score's opening tempo: where the tempo doubles, a written beat counts 1/2. Playback seconds are\n * those values times 60 / bpm (playbackScale), so a BPM change never rebuilds the timeline. MIDI numbers are at\n * 0 semitones; playback adds the transposition to every event of a non-percussion part.\n *\n * Plain data (arrays and Maps of plain values), so a worker can build it and post it.\n */\nexport type BaseTimeline = PerformanceTimeline & {\n /** Source part (pedal scope) of each event, parallel to `events`. */\n eventSources: string[];\n /** Pedal changes in performed time per source part, in performed order. */\n performedPedals: Map<string, PerformedPedal[]>;\n /** End of the performed roadmap, before the last notes' tails. */\n pieceEnd: number;\n /** Parts whose events are never transposed (percussion). */\n percussionPartIds: string[];\n /** Diagnostics not tied to one part, in the order they were found. */\n headDiagnostics: string[];\n /** Per-part diagnostics (unmatched ties), in the order they were found. */\n partDiagnostics: { partId: string; message: string }[];\n};\n\nexport type BaseTimelineOptions = {\n /** A caller's own MusicXML: navigation, marks and pedals are read from it instead of the score. */\n musicXml?: string;\n roadmap?: Roadmap;\n /** Note marks and pedals already read from the source (for example by the import worker). */\n marks?: PlaybackMarks;\n /** Parts to perform; all parts of the score by default. Tempo, fermatas and dynamics always come from the whole score. */\n parts?: Part[];\n};\n\n/** Build the BPM-independent performance of `full` (see BaseTimeline). */\nexport function buildBaseTimeline(full: Score, options: BaseTimelineOptions = {}): BaseTimeline {\n const diagnostics: string[] = [];\n const partDiagnostics: { partId: string; message: string }[] = [];\n const parts = options.parts || full.parts;\n // Measure lengths, navigation and the roadmap come from the full score, so hiding a part never changes them.\n const exactLengths = measureLengths(full);\n const lengths = exactLengths.map(fractionValue);\n const offsets = scoreOffsets(lengths);\n const points = tempoPoints(full, offsets, diagnostics);\n const initialBpm = tempoAt(points, 0);\n /** Timeline units (opening-tempo beats) per written beat at a score beat. */\n const unitsPerBeat = (beat: number) => initialBpm / tempoAt(points, beat);\n const source = options.marks || musicXmlPlaybackMarks(options.musicXml || documentXml(full));\n const marks = source.marks;\n diagnostics.push(...source.markDiagnostics);\n const markFor = (note: { sourceId?: string; pitches: (Pitch & { sourceId?: string })[] }) => [note.sourceId, ...note.pitches.map(p => p.sourceId)].map(id => id ? marks.get(id) : undefined).find((item): item is NoteMark => Boolean(item));\n const dynamicGroups = dynamicPoints(full, offsets);\n // Navigation lives on the Score; an explicit musicXml option (a caller's own source) is read instead.\n const built = options.musicXml\n ? roadmapFromNavigation(musicXmlTextNavigation(options.musicXml, lengths.length, diagnostics), exactLengths, diagnostics)\n : buildRoadmap(full, diagnostics);\n const override = options.roadmap ? resolveRoadmap(options.roadmap, exactLengths, diagnostics) : undefined;\n const roadmap = override ? options.roadmap! : built;\n // Only a user override is validated; a rejected one falls back to the generated roadmap, which always plays.\n const performedSlices = slices(override || generatedSegments(built), lengths);\n const pedals = source.pedals;\n diagnostics.push(...source.pedalDiagnostics);\n const performedPedals = new Map<string, PerformedPedal[]>();\n const eventSource = new Map<PerformanceEvent, string>();\n const events: PerformanceEvent[] = [];\n const positions: PlaybackPosition[] = [];\n const openTies = new Map<string, PerformanceEvent>();\n // The floor is in timeline units, so it scales with BPM like every other duration: 30 ms at the opening tempo.\n const graceFloor = GRACE_FLOOR_SECONDS * initialBpm / 60;\n let elapsed = 0;\n for (const slice of performedSlices) {\n const { measureIndex, from, to } = slice;\n const length = lengths[measureIndex];\n const offset = offsets[measureIndex];\n // A slice continued within the same measure lets its notes sound on past `to`, so time is mapped up to the bar end.\n const horizon = slice.linearOut ? Math.max(to, length) : to;\n const localTempos = points.filter(point => point.beat > offset + from + EPS && point.beat < offset + horizon - EPS);\n const boundaries = [from, ...localTempos.map(point => point.beat - offset), horizon];\n const times = [0];\n for (let i = 1; i < boundaries.length; i++) times.push(times[i - 1] + (boundaries[i] - boundaries[i - 1]) * unitsPerBeat(offset + boundaries[i - 1] + EPS));\n const baseAt = (beat: number) => {\n const limited = Math.max(from, Math.min(horizon, beat));\n let segment = boundaries.length - 2;\n for (let i = 0; i < boundaries.length - 1; i++) if (limited < boundaries[i + 1] - EPS) { segment = i; break; }\n return elapsed + times[segment] + (limited - boundaries[segment]) * unitsPerBeat(offset + boundaries[segment] + EPS);\n };\n const secondsPerBeat = (beat: number) => unitsPerBeat(offset + beat + EPS);\n const inSlice = (beat: number) => beat >= from - EPS && beat < to - EPS;\n // Fermatas hold the music: time is inserted where the shortest held note of\n // each fermata onset ends, so later notes wait instead of overlapping.\n const fermataStarts = new Map<string, { start: number; duration: number }>();\n for (const part of full.parts) for (const note of part.measures[measureIndex]?.notes || []) {\n if (note.grace || note.duration <= 0 || !inSlice(note.start) || !markFor(note)?.fermata) continue;\n const key = note.start.toFixed(6);\n const old = fermataStarts.get(key);\n if (!old || note.duration < old.duration) fermataStarts.set(key, { start: note.start, duration: note.duration });\n }\n const holdMap = new Map<string, { beat: number; seconds: number }>();\n for (const { start, duration } of fermataStarts.values()) {\n const beat = Math.min(to, start + duration);\n const seconds = (baseAt(beat) - baseAt(start)) * FERMATA_HOLD;\n const key = beat.toFixed(6);\n holdMap.set(key, { beat, seconds: Math.max(seconds, holdMap.get(key)?.seconds || 0) });\n }\n const holds = [...holdMap.values()].sort((a, b) => a.beat - b.beat);\n const heldBefore = (beat: number, inclusive: boolean) => holds.reduce((sum, hold) => sum + (hold.beat < beat - EPS || (inclusive && hold.beat <= beat + EPS) ? hold.seconds : 0), 0);\n const secondsAt = (beat: number) => baseAt(beat) + heldBefore(beat, true);\n // A note is cut where a segment ends in a jump; a linear continuation lets it sound on.\n const release = (beat: number) => slice.linearOut ? beat : Math.min(to, beat);\n\n // Ties survive a repeat/D.S. jump only if the target note stops the tie.\n const carried = slice.linearIn ? undefined : new Map(openTies);\n const positionBeats = [...new Set([...boundaries.filter(beat => beat < to - EPS), to, ...holds.map(hold => hold.beat)].map(beat => beat.toFixed(9)))].map(Number).sort((a, b) => a - b);\n for (const beat of positionBeats) {\n const base = { scoreBeat: offset + beat, measureIndex, occurrence: slice.occurrence, measureBeat: beat, noteId: null, activeNoteIds: [] };\n if (holds.some(hold => Math.abs(hold.beat - beat) < 1e-6)) positions.push({ ...base, seconds: baseAt(beat) + heldBefore(beat, false) });\n positions.push({ ...base, seconds: secondsAt(beat) });\n }\n // Pedal marks are placed per performed occurrence, so repeats and jumps re-pedal.\n // A mark exactly at a slice end belongs to the slice that continues from there, if any.\n for (const [sourceId, changes] of pedals) for (const change of changes) {\n if (change.measureIndex !== measureIndex) continue;\n const atEnd = change.beat >= to - EPS && (to >= length - EPS || (!slice.linearOut && change.beat <= to + EPS));\n if (!inSlice(change.beat) && !atEnd) continue;\n const list = performedPedals.get(sourceId) || [];\n list.push({ seconds: secondsAt(Math.min(to, change.beat)), kind: change.kind });\n performedPedals.set(sourceId, list);\n }\n for (const part of parts) {\n const measure = part.measures[measureIndex];\n if (!measure) continue;\n const graceGroups = new Map<string, string[]>();\n for (const note of measure.notes) if (note.grace) {\n const key = `${note.voice || '1'}:${note.start.toFixed(6)}`;\n graceGroups.set(key, [...(graceGroups.get(key) || []), note.id]);\n }\n const graceBeat = (n: number) => Math.min(GRACE_BEATS, GRACE_TOTAL / Math.max(1, n));\n const dynamicList = dynamicGroups.get(sourcePartId(full, part)) || dynamicGroups.get(part.id) || [];\n const pedalSource = sourcePartId(full, part);\n for (const note of measure.notes) {\n if (note.rest || !note.pitches.length) continue;\n if (note.duration <= 0 && !note.grace) continue;\n // Only notes that start inside the slice sound in it; a note begun before a jump target is not re-attacked.\n if (!inSlice(note.start)) continue;\n const voice = note.voice || '1';\n let start: number, end: number;\n if (note.grace) {\n const group = graceGroups.get(`${voice}:${note.start.toFixed(6)}`) || [note.id];\n const n = group.length, i = Math.max(0, group.indexOf(note.id));\n const step = graceBeat(n) * secondsPerBeat(note.start);\n const principal = secondsAt(note.start);\n // Graces on the downbeat delay their principal; others steal from the previous beat.\n if (note.start <= EPS) { start = principal + i * step; end = principal + (i + 1) * step; }\n else { start = Math.max(baseAt(from), principal - (n - i) * step); end = principal - (n - i - 1) * step; }\n end = Math.max(start + graceFloor, end);\n } else {\n const opening = note.start <= EPS ? (graceGroups.get(`${voice}:${note.start.toFixed(6)}`)?.length || 0) : 0;\n start = secondsAt(note.start) + (opening ? opening * graceBeat(opening) * secondsPerBeat(0) : 0);\n end = secondsAt(release(note.start + note.duration));\n }\n const mark = markFor(note);\n if (mark?.silent) continue;\n note.pitches.forEach((pitch: Pitch & { sourceId?: string }, pitchIndex) => {\n const midi = soundingMidi(part, measure, pitch, 0);\n const pitchMark = (pitch.sourceId ? marks.get(pitch.sourceId) : undefined) || mark;\n const soundingEnd = start + (end - start) * (pitchMark?.durationScale ?? 1);\n const tieKey = `${part.id}:${voice}:${midi}`;\n const old = openTies.get(tieKey);\n if (pitch.tieStop && old) {\n old.endSeconds = Math.max(old.endSeconds, soundingEnd);\n old.endScoreBeat = offset + note.start + note.duration;\n if (!old.visualNoteIds.includes(note.id)) old.visualNoteIds.push(note.id);\n old.visualSegments.push({ noteId: note.id, startSeconds: start, endSeconds: soundingEnd });\n if (!pitch.tieStart) openTies.delete(tieKey);\n return;\n }\n if (pitch.tieStop && !old) partDiagnostics.push({ partId: part.id, message: `Unmatched tie stop at ${note.id}, pitch ${pitchIndex}.` });\n const event: PerformanceEvent = {\n id: `${note.id}:${pitchIndex}:${slice.occurrence}`, noteId: note.id,\n pitchId: pitch.sourceId || `${note.id}:${pitchIndex}`, pitchIndex, partId: part.id, voice,\n measureIndex, occurrence: slice.occurrence, scoreBeat: offset + note.start,\n endScoreBeat: offset + note.start + note.duration, startSeconds: start, endSeconds: soundingEnd, soundEndSeconds: soundingEnd,\n midi, velocity: Math.max(1, Math.min(127, velocityFor(dynamicList, part.id, offset + note.start, voice) + (pitchMark?.velocityDelta || 0))), visualNoteIds: [note.id],\n visualSegments: [{ noteId: note.id, startSeconds: start, endSeconds: soundingEnd }],\n };\n events.push(event);\n eventSource.set(event, pedalSource);\n if (pitch.tieStart) openTies.set(tieKey, event);\n });\n }\n }\n if (carried) for (const [key, event] of carried) if (openTies.get(key) === event) openTies.delete(key);\n elapsed = secondsAt(to);\n }\n events.sort((a, b) => a.startSeconds - b.startSeconds || a.partId.localeCompare(b.partId) || a.pitchIndex - b.pitchIndex);\n const eventSources = events.map(event => eventSource.get(event)!);\n applySustainPedal(events, eventSources, performedPedals, elapsed);\n return {\n events, positions, durationSeconds: timelineEnd(events, elapsed), initialBpm,\n diagnostics: [...new Set([...diagnostics, ...partDiagnostics.map(item => item.message)])], roadmap,\n eventSources, performedPedals, pieceEnd: elapsed, percussionPartIds: parts.filter(part => part.clef === 'percussion').map(part => part.id),\n headDiagnostics: diagnostics, partDiagnostics,\n };\n}\n\nfunction timelineEnd(events: PerformanceEvent[], pieceEnd: number): number {\n let end = pieceEnd;\n for (const event of events) end = Math.max(end, event.endSeconds, event.soundEndSeconds);\n return end;\n}\n\n/**\n * The base timeline restricted to `visiblePartIds` (hidden parts muted). Events of each part do not depend on the\n * others, so this filters them and re-applies the sustain pedal, whose re-attack damping is scoped to what sounds.\n * Tempo, fermatas, dynamics and navigation stay those of the whole score. Returns `base` when nothing is hidden.\n */\nexport function deriveTimeline(base: BaseTimeline, options: { visiblePartIds?: readonly string[] } = {}): BaseTimeline {\n if (!options.visiblePartIds) return base;\n const visible = new Set(options.visiblePartIds);\n if (base.events.every(event => visible.has(event.partId)) && base.partDiagnostics.every(item => visible.has(item.partId))) return base;\n const events: PerformanceEvent[] = [];\n const eventSources: string[] = [];\n base.events.forEach((event, index) => {\n if (!visible.has(event.partId)) return;\n events.push({ ...event });\n eventSources.push(base.eventSources[index]);\n });\n applySustainPedal(events, eventSources, base.performedPedals, base.pieceEnd);\n const partDiagnostics = base.partDiagnostics.filter(item => visible.has(item.partId));\n return {\n ...base, events, eventSources, partDiagnostics, durationSeconds: timelineEnd(events, base.pieceEnd),\n percussionPartIds: base.percussionPartIds.filter(id => visible.has(id)),\n diagnostics: [...new Set([...base.headDiagnostics, ...partDiagnostics.map(item => item.message)])],\n };\n}\n\n/** Playback seconds per timeline unit at `bpm` (an invalid BPM plays at the score's opening tempo). */\nexport function playbackScale(timeline: Pick<PerformanceTimeline, 'initialBpm'>, bpm: number): number {\n return 60 / (Number.isFinite(bpm) && bpm > 0 ? bpm : timeline.initialBpm);\n}\nconst transposable = (timeline: BaseTimeline) => {\n const percussion = new Set(timeline.percussionPartIds);\n return (event: PerformanceEvent) => !percussion.has(event.partId);\n};\nfunction scaledEvent(event: PerformanceEvent, scale: number, semitones: number): PerformanceEvent {\n return {\n ...event, startSeconds: event.startSeconds * scale, endSeconds: event.endSeconds * scale, soundEndSeconds: event.soundEndSeconds * scale,\n midi: event.midi + semitones, visualNoteIds: [...event.visualNoteIds],\n visualSegments: event.visualSegments.map(segment => ({ ...segment, startSeconds: segment.startSeconds * scale, endSeconds: segment.endSeconds * scale })),\n };\n}\n\n/** Playback length in seconds at `bpm`. */\nexport function playbackDuration(timeline: BaseTimeline, bpm: number): number {\n return timeline.durationSeconds * playbackScale(timeline, bpm);\n}\n/** The position at playback `seconds` when the timeline plays at `bpm`. */\nexport function playbackPositionAt(timeline: BaseTimeline, seconds: number, bpm: number): PlaybackPosition {\n const scale = playbackScale(timeline, bpm);\n const position = positionAtSeconds(timeline, seconds / scale);\n return { ...position, seconds: position.seconds * scale };\n}\n/**\n * Events still sounding from playback `seconds` on (as eventsFromSeconds: tails of events begun earlier are clipped\n * to start there), in playback seconds at `bpm` and transposed by `semitones`. Only these events are copied.\n */\nexport function playbackEventsFrom(timeline: BaseTimeline, seconds: number, bpm: number, semitones = 0): PerformanceEvent[] {\n const scale = playbackScale(timeline, bpm);\n const units = seconds / scale;\n const shifts = transposable(timeline);\n const result: PerformanceEvent[] = [];\n for (const event of timeline.events) {\n if (event.soundEndSeconds <= units + EPS) continue;\n const scaled = scaledEvent(event, scale, shifts(event) ? semitones : 0);\n if (event.startSeconds < units) { scaled.startSeconds = seconds; scaled.endSeconds = Math.max(seconds, scaled.endSeconds); }\n result.push(scaled);\n }\n return result;\n}\n/** Sounding MIDI numbers of the given parts' events, transposed by `semitones`. */\nexport function playbackMidis(timeline: BaseTimeline, partIds: ReadonlySet<string>, semitones = 0): number[] {\n const shifts = transposable(timeline);\n return timeline.events.filter(event => partIds.has(event.partId)).map(event => event.midi + (shifts(event) ? semitones : 0));\n}\n\n/** The timeline in playback seconds at `bpm`, transposed by `semitones` (the shape buildPerformanceTimeline returns). */\nexport function materializeTimeline(timeline: BaseTimeline, bpm: number, semitones = 0): PerformanceTimeline {\n const scale = playbackScale(timeline, bpm);\n const shifts = transposable(timeline);\n return {\n events: timeline.events.map(event => scaledEvent(event, scale, shifts(event) ? semitones : 0)),\n positions: timeline.positions.map(position => ({ ...position, seconds: position.seconds * scale, activeNoteIds: [...position.activeNoteIds] })),\n durationSeconds: timeline.durationSeconds * scale, initialBpm: timeline.initialBpm, diagnostics: [...timeline.diagnostics], roadmap: timeline.roadmap,\n };\n}\n\n/** Base timelines registered for a score's source document (for example built by the import worker). */\nconst registered = new WeakMap<object, Promise<BaseTimeline>>();\nexport function registerBaseTimeline(document: object, timeline: Promise<BaseTimeline>): void {\n registered.set(document, timeline);\n}\nexport function registeredBaseTimeline(document: object): Promise<BaseTimeline> | undefined {\n return registered.get(document);\n}\n/**\n * The base timeline of a full score: the one registered for its document (falling back to building here if that\n * fails), else one built here on first use. It is kept per document, so instrument changes, BPM and transposition\n * never rebuild it.\n */\nexport function baseTimelineFor(score: Score): Promise<BaseTimeline> {\n const key: object = score.document || score;\n const known = registered.get(key);\n if (known) return known.catch(() => buildBaseTimeline(score));\n const timeline = new Promise<BaseTimeline>(resolve => resolve(buildBaseTimeline(score)));\n registered.set(key, timeline);\n return timeline;\n}\n\n/** Build one ordered performed timeline, with source tempo scaled by the displayed BPM. */\nexport function buildPerformanceTimeline(score: Score, options: TimelineOptions): PerformanceTimeline {\n const full = options.fullScore && options.fullScore.parts.length ? options.fullScore : score;\n const xml = options.musicXml || documentXml(score) || documentXml(full);\n const base = buildBaseTimeline(full, { musicXml: options.musicXml, roadmap: options.roadmap, marks: musicXmlPlaybackMarks(xml), parts: score.parts });\n const timeline = materializeTimeline(base, options.bpm, options.semitones || 0);\n if (options.verovioTimemap !== undefined) {\n const diagnostics = [...timeline.diagnostics];\n if (!Array.isArray(options.verovioTimemap)) diagnostics.push('Verovio timemap shape is unrecognized; source timing was used.');\n else {\n // Verovio 6.3.0 exposes {on,off,qstamp,tstamp}. qstamp is a useful\n // source-index check, while source tempo/navigation remain authoritative.\n const firstOnset = new Map<string, number>();\n for (const item of options.verovioTimemap as unknown[]) {\n if (!item || typeof item !== 'object') continue;\n const row = item as { on?: unknown; qstamp?: unknown };\n if (!Array.isArray(row.on) || typeof row.qstamp !== 'number') continue;\n for (const id of row.on) if (typeof id === 'string' && !firstOnset.has(id)) firstOnset.set(id, row.qstamp);\n }\n const checked = new Set<string>();\n for (const event of timeline.events) {\n if (checked.has(event.pitchId)) continue;\n checked.add(event.pitchId);\n const qstamp = firstOnset.get(event.pitchId);\n if (qstamp !== undefined && Math.abs(qstamp - event.scoreBeat) > .01) diagnostics.push(`Verovio/source onset differs for ${event.pitchId}.`);\n }\n }\n timeline.diagnostics = [...new Set(diagnostics)];\n }\n return timeline;\n}\n\n/**\n * The damper pedal scopes a whole source part (every staff). A note released\n * while the pedal is down keeps sounding until the next lift; a change is a lift\n * and re-depress at the same instant, so notes released before it end there.\n * Only soundEndSeconds moves; written ends and highlighting are untouched.\n */\nfunction applySustainPedal(events: PerformanceEvent[], eventSources: string[], performed: Map<string, PerformedPedal[]>, pieceEnd: number) {\n // Tie chains extend endSeconds after creation; the audible end starts from the final written end.\n for (const event of events) event.soundEndSeconds = event.endSeconds;\n const spans = new Map<string, { down: number; up: number }[]>();\n for (const [sourceId, changes] of performed) {\n const list: { down: number; up: number }[] = [];\n let downAt: number | undefined;\n // Stable sort keeps performed order for changes at the same instant.\n for (const change of [...changes].sort((a, b) => a.seconds - b.seconds)) {\n if (change.kind === 'down') { downAt ??= change.seconds; continue; }\n if (downAt !== undefined) list.push({ down: downAt, up: change.seconds });\n downAt = change.kind === 'change' ? change.seconds : undefined;\n }\n if (downAt !== undefined) list.push({ down: downAt, up: pieceEnd });\n spans.set(sourceId, list.filter(span => span.up > span.down + EPS));\n }\n if (!spans.size) return;\n const byKey = new Map<string, PerformanceEvent[]>();\n events.forEach((event, index) => {\n const sourceId = eventSources[index];\n if (sourceId === undefined) return;\n const key = `${sourceId}:${event.midi}`;\n const group = byKey.get(key);\n if (group) group.push(event); else byKey.set(key, [event]);\n const span = spans.get(sourceId)?.find(item => item.down < event.endSeconds - EPS && event.endSeconds < item.up - EPS);\n if (span) event.soundEndSeconds = span.up;\n });\n // Re-striking a sustained pitch damps the previous string at the new attack.\n for (const group of byKey.values()) for (const event of group) {\n if (event.soundEndSeconds <= event.endSeconds + EPS) continue;\n const next = group.find(other => other.startSeconds > event.startSeconds + EPS && other.startSeconds < event.soundEndSeconds - EPS);\n if (next) event.soundEndSeconds = Math.max(event.endSeconds, next.startSeconds);\n }\n}\n\n/** Includes sustained notes; useful for cursor, highlights, seek and resume. */\nexport function positionAtSeconds(timeline: PerformanceTimeline, seconds: number): PlaybackPosition {\n const clamped = Math.max(0, Math.min(timeline.durationSeconds, seconds));\n const positions = timeline.positions;\n let index = positions.length ? 0 : -1;\n for (let i = 0; i < positions.length; i++) { if (positions[i].seconds > clamped + EPS) break; index = i; }\n const current = positions[index] || { seconds: 0, scoreBeat: 0, measureIndex: 0, occurrence: 0, measureBeat: 0, noteId: null, activeNoteIds: [] };\n const next = index >= 0 ? positions[index + 1] : undefined;\n const ratio = next && next.seconds > current.seconds && next.measureIndex === current.measureIndex && next.occurrence === current.occurrence ? (clamped - current.seconds) / (next.seconds - current.seconds) : 0;\n const scoreBeat = current.scoreBeat + ratio * (next ? next.scoreBeat - current.scoreBeat : 0);\n const active = new Set<string>();\n for (const event of timeline.events) {\n if (event.startSeconds > clamped + EPS || event.endSeconds <= clamped + EPS) continue;\n for (const segment of event.visualSegments) if (segment.startSeconds <= clamped + EPS && segment.endSeconds > clamped + EPS) active.add(segment.noteId);\n }\n let latest: PerformanceEvent | undefined;\n for (let i = timeline.events.length - 1; i >= 0; i--) {\n const event = timeline.events[i];\n if (event.startSeconds <= clamped + EPS && event.measureIndex === current.measureIndex && event.occurrence === current.occurrence) { latest = event; break; }\n }\n const activeNoteIds = [...active];\n return { ...current, seconds: clamped, scoreBeat, measureBeat: current.measureBeat + scoreBeat - current.scoreBeat, noteId: activeNoteIds[0] || latest?.noteId || null, activeNoteIds };\n}\n\n/** Active event tails are clipped to the seek time so pause/resume sustains correctly. */\nexport function eventsFromSeconds(timeline: PerformanceTimeline, seconds: number): PerformanceEvent[] {\n return timeline.events.filter(event => event.soundEndSeconds > seconds + EPS).map(event => event.startSeconds < seconds ? { ...event, startSeconds: seconds, endSeconds: Math.max(seconds, event.endSeconds) } : event);\n}\n","import { instrumentForName, instrumentForProgram, midiPitch, pitch, type BarlineNavigation, type KeyMode, type Measure, type MeasureNavigation, type Part, type Score, type ScoreNote, type Transposition } from './score';\nimport { IdentityBuilder, identityForScore, makeSourceDocument, scoreToMei, type SourceDocument } from './notation/document';\nimport { abcDecorationWord, attachNavigation, endingNumbers, meiNavigation, navigationWord, resolveCodaSigns, type NavigationWord } from './notation/navigation';\nimport { durationBeats, normalizedScore as normalized, readMusicXml } from './notation/musicxml-source';\nimport { formatFraction, fromNumber } from './playback/fraction';\nimport { fileSourceFor, type FileSource } from './file-state';\nimport { extractMxlScore, formatMb, MAX_SCORE_FILE_BYTES } from './mxl';\nimport type { ImportReply, ImportRequest } from './import-protocol';\nimport { registerBaseTimeline, type BaseTimeline } from './playback/timeline';\n\nexport { extractMxlScore, MAX_SCORE_FILE_BYTES, MXL_MAX_SCORE_BYTES } from './mxl';\n\n// DOM helpers for MEI, which is read on the main thread (MusicXML is read by the streaming reader, see below).\nconst children = (node: Element, tag: string) => Array.from(node.children).filter(el => el.localName === tag);\nconst parseXml = (text: string) => {\n const doc = new DOMParser().parseFromString(text, 'application/xml');\n if (doc.querySelector('parsererror')) throw new Error('This file is not valid XML.');\n return doc;\n};\nconst empty = (index: number, beats: number): Measure => ({ index, beats, notes: [] });\n\n/**\n * Read MusicXML text on the calling thread (small sources: tests, the musicXml prop fallback). Files are read by the\n * import worker instead (importScoreFile). Both use the same single-pass streaming reader.\n */\nexport function parseMusicXml(text: string): Score {\n const read = readMusicXml(text);\n const score = read.score;\n score.document = makeSourceDocument({ format: 'musicxml', engravingFormat: 'musicxml', originalText: text, engravingText: read.engravingText, identity: identityForScore(score), inventory: read.inventory, diagnostics: read.diagnostics });\n return score;\n}\n\nexport function parseMei(text: string): Score {\n const doc = parseXml(text);\n if (doc.documentElement.localName !== 'mei') throw new Error('This file is not an MEI document.');\n const everything = Array.from(doc.getElementsByTagName('*'));\n const all = (tag: string) => everything.filter(e => e.localName === tag);\n // One part per staff number; later staffDefs (score changes) only update state.\n const defs = [...new Map(all('staffDef').map((def, i) => [def.getAttribute('n') || String(i + 1), def])).values()];\n const measures = all('measure');\n // Walk the document in order so later <scoreDef>/<staffDef> key and meter\n // changes (attributes or <keySig>/<meterSig> children) apply from that point.\n const parseKey = (sig: string | null | undefined) => {\n const match = /^(\\d+)([sf])$/.exec((sig || '').trim());\n return sig?.trim() === '0' ? 0 : match ? Number(match[1]) * (match[2] === 'f' ? -1 : 1) : undefined;\n };\n const defKey = (def: Element) => parseKey(def.getAttribute('key.sig')) ?? parseKey(def.getAttribute('keysig')) ?? parseKey(children(def, 'keySig')[0]?.getAttribute('sig'));\n // Each key area's mode: a key without one is major (so a change back from minor is major again).\n const defMode = (def: Element): KeyMode => (def.getAttribute('key.mode') || children(def, 'keySig')[0]?.getAttribute('mode')) === 'minor' ? 'minor' : 'major';\n const defMeter = (def: Element) => {\n const sig = children(def, 'meterSig')[0];\n const count = Number(def.getAttribute('meter.count') || sig?.getAttribute('count'));\n const unit = Number(def.getAttribute('meter.unit') || sig?.getAttribute('unit'));\n return count > 0 && unit > 0 ? { count, unit } : undefined;\n };\n let meterNow: { count: number; unit: number } | undefined;\n let defaultKey: number | undefined;\n const staffKeys = new Map<string, number>();\n let defaultMode: KeyMode = 'major';\n const staffModes = new Map<string, KeyMode>();\n const measureState: { count: number; unit: number; keys: Map<string, number>; defaultKey: number; modes: Map<string, KeyMode>; defaultMode: KeyMode }[] = [];\n let openingMeter: { count: number; unit: number } | undefined;\n let openingKey: number | undefined;\n for (const el of everything) {\n if (el.localName === 'scoreDef') {\n const k = defKey(el);\n if (k !== undefined) { defaultKey = k; staffKeys.clear(); defaultMode = defMode(el); staffModes.clear(); }\n meterNow = defMeter(el) || meterNow;\n } else if (el.localName === 'staffDef') {\n const k = defKey(el);\n if (k !== undefined) { staffKeys.set(el.getAttribute('n') || '1', k); staffModes.set(el.getAttribute('n') || '1', defMode(el)); }\n meterNow = defMeter(el) || meterNow;\n } else if (el.localName === 'measure') {\n openingMeter ||= meterNow;\n if (openingKey === undefined) openingKey = staffKeys.values().next().value ?? defaultKey;\n measureState.push({ count: meterNow?.count || 4, unit: meterNow?.unit || 4, keys: new Map(staffKeys), defaultKey: defaultKey || 0, modes: new Map(staffModes), defaultMode });\n }\n }\n const beats = openingMeter?.count || meterNow?.count || 4;\n const beatType = openingMeter?.unit || meterNow?.unit || 4;\n const key = openingKey ?? defaultKey ?? 0;\n const alteredByKey = (fifths: number, step: string) => fifths > 0 ? ('FCGDAEB'.slice(0, fifths).includes(step) ? 1 : 0) : ('BEADGCF'.slice(0, -fifths).includes(step) ? -1 : 0);\n const accidValues: Record<string, number> = { s: 1, f: -1, ss: 2, x: 2, ff: -2, xs: 3, sx: 3, ts: 3, tf: -3, n: 0, nf: -1, ns: 1 };\n /** Repeat <barLine>s inside the first layer of the first staff, by measure index. */\n const innerBarlines = new Map<number, BarlineNavigation[]>();\n const parts: Part[] = defs.map((def, i) => {\n const n = def.getAttribute('n') || String(i + 1);\n const name = def.getAttribute('label') || `Staff ${n}`;\n const sign = def.getAttribute('clef.shape');\n const clef = sign === 'F' ? 'bass' : sign === 'C' ? 'alto' : sign === 'perc' ? 'percussion' : 'treble';\n const transposition: Transposition = { semitones: Number(def.getAttribute('trans.semi')) || 0, diatonic: def.hasAttribute('trans.diat') ? Number(def.getAttribute('trans.diat')) : undefined };\n return { id: n, name, clef, key: measureState[0]?.keys.get(n) ?? measureState[0]?.defaultKey ?? key, instrument: instrumentForName(name), pitchBasis: 'written', transposition, measures: measures.map((measure, index) => {\n const state = measureState[index] || { count: beats, unit: beatType, keys: new Map<string, number>(), defaultKey: key, modes: new Map<string, KeyMode>(), defaultMode: 'major' as KeyMode };\n const staffKey = state.keys.get(n) ?? state.defaultKey;\n const out: Measure = { ...empty(index, state.count * 4 / state.unit), nominalBeats: state.count * 4 / state.unit, number: measure.getAttribute('n') || String(index + 1), key: staffKey, keyMode: state.modes.get(n) ?? state.defaultMode, beatsPerBar: state.count, beatType: state.unit };\n const staff = Array.from(measure.getElementsByTagName('*')).find(e => e.localName === 'staff' && e.getAttribute('n') === n);\n if (!staff) return out;\n // Written accidentals persist for the same step and octave until the barline.\n const written = new Map<string, { time: number; alter: number }[]>();\n const bySourceId = new Map<string, ScoreNote>();\n const sourceId = (el: Element) => el.getAttribute('xml:id') || el.getAttributeNS('http://www.w3.org/XML/1998/namespace', 'id') || undefined;\n const layers = Array.from(staff.children).filter(e => e.localName === 'layer');\n for (const [layerIndex, layer] of (layers.length ? layers : [staff]).entries()) {\n let cursor = 0;\n const walk = (parent: Element, ratio = 1, beam = false, tuplet?: ScoreNote['tuplet']) => {\n const events = Array.from(parent.children).filter(e => ['note', 'chord', 'rest', 'mRest', 'space', 'beam', 'tuplet', 'barLine'].includes(e.localName));\n for (const [eventIndex, el] of events.entries()) {\n const kind = el.localName;\n if (kind === 'barLine') {\n const form = el.getAttribute('form') || '';\n if (i === 0 && layerIndex === 0 && /^rpt(start|end|both)$/.test(form)) {\n const list = innerBarlines.get(index) || [];\n list.push({ beat: formatFraction(fromNumber(cursor)), ...(form !== 'rptend' ? { repeatStart: true } : {}), ...(form !== 'rptstart' ? { repeatEnd: true } : {}) });\n innerBarlines.set(index, list);\n }\n continue;\n }\n if (kind === 'beam') { walk(el, ratio, true, tuplet); continue; }\n if (kind === 'tuplet') {\n const actual = Number(el.getAttribute('num')) || 3, normal = Number(el.getAttribute('numbase')) || 2;\n walk(el, ratio * normal / actual, beam, { actual, normal, number: el.getAttribute('n') || '1', start: true, stop: true });\n continue;\n }\n const grace = el.getAttribute('grace') !== null;\n const duration = grace ? 0 : kind === 'mRest' ? out.beats : durationBeats(el.getAttribute('dur') || '4', Number(el.getAttribute('dots') || 0)) * ratio;\n const noteEls = kind === 'chord' ? Array.from(el.children).filter(e => e.localName === 'note') : kind === 'note' ? [el] : [];\n const pitches = noteEls.map(e => {\n const step = (e.getAttribute('pname') || 'c').toUpperCase();\n const octave = Number(e.getAttribute('oct') || 4);\n const accidChild = children(e, 'accid')[0];\n // MEI precedence: accid.ges > written accid (attribute or <accid>) > measure state > key.\n const gestural = accidValues[e.getAttribute('accid.ges') || accidChild?.getAttribute('accid.ges') || ''];\n const shown = accidValues[e.getAttribute('accid') || accidChild?.getAttribute('accid') || ''];\n const pitchKey = `${step}${octave}`;\n if (shown !== undefined) written.set(pitchKey, [...(written.get(pitchKey) || []), { time: cursor, alter: shown }]);\n const prior = (written.get(pitchKey) || []).filter(entry => entry.time <= cursor + 1e-6).at(-1)?.alter;\n const tie = e.getAttribute('tie') || el.getAttribute('tie') || '';\n return { ...pitch(step, octave, gestural ?? shown ?? prior ?? alteredByKey(staffKey, step)), sourceId: sourceId(e), tieStart: /[im]/.test(tie), tieStop: /[tm]/.test(tie) };\n });\n const lyric = Array.from(el.getElementsByTagName('*')).filter(e => e.localName === 'syl').map(e => e.textContent?.trim() || '').filter(Boolean).join(' ');\n const parsed: ScoreNote = { id: `${n}-${index}-${out.notes.length}`, sourceId: sourceId(el), start: cursor, duration, pitches, rest: !pitches.length, voice: layer.getAttribute('n') || String(layerIndex + 1), beamStart: beam && eventIndex === 0, beamEnd: beam && eventIndex === events.length - 1, grace, tuplet, lyric: lyric || undefined };\n out.notes.push(parsed);\n for (const source of [el, ...noteEls]) { const id = sourceId(source); if (id) bySourceId.set(id, parsed); }\n cursor += duration;\n }\n };\n walk(layer);\n }\n for (const harmony of Array.from(measure.getElementsByTagName('*')).filter(e => e.localName === 'harm')) {\n const targetStaff = harmony.getAttribute('staff');\n if (targetStaff ? !targetStaff.split(/\\s+/).includes(n) : i !== 0) continue;\n const symbol = harmony.textContent?.trim();\n if (!symbol) continue;\n const sourceId = harmony.getAttribute('startid')?.replace(/^#/, '');\n const stamp = Number(harmony.getAttribute('tstamp'));\n const targetStart = Number.isFinite(stamp) && stamp >= 1 ? (stamp - 1) * 4 / beatType : 0;\n const target = sourceId && bySourceId.get(sourceId) || out.notes.find(note => note.start >= targetStart - .001);\n if (target) target.chordSymbol = symbol;\n }\n return out;\n }) };\n });\n const titles = all('title');\n const title = (titles.find(e => ['main', 'uniform'].includes(e.getAttribute('type') || '')) || titles[0])?.textContent?.trim() || '';\n const subtitle = titles.find(e => ['subordinate', 'subtitle'].includes(e.getAttribute('type') || ''))?.textContent?.trim() || '';\n const composer = all('composer')[0]?.textContent?.trim() || all('persName').find(e => e.getAttribute('role') === 'composer')?.textContent?.trim() || '';\n // Key mode of the opening key (absent means major), for spelling minor keys' raised degrees.\n const openingDef = all('scoreDef')[0];\n const openingMode = openingDef?.getAttribute('key.mode') || openingDef?.getElementsByTagName('keySig')[0]?.getAttribute('mode');\n const score = normalized({ title, subtitle, composer, source: 'MEI', tempo: 100, beats, beatType, key, ...(openingMode === 'minor' ? { keyMode: 'minor' as const } : {}), parts });\n attachNavigation(score, meiNavigation(measures, innerBarlines));\n score.document = makeSourceDocument({ format: 'mei', engravingFormat: 'mei', originalText: text, engravingText: text, identity: identityForScore(score) });\n return score;\n}\n\nexport async function parseAbc(text: string): Promise<Score> {\n const { default: abcjs } = await import('abcjs');\n const tune = (abcjs as any).parseOnly(text)[0];\n if (!tune?.lines?.length) throw new Error('No readable ABC tune was found.');\n const meter = tune.getMeterFraction?.() || { num: 4, den: 4 };\n const beats = Number(meter.num) || 4, beatType = Number(meter.den) || 4;\n const keyAccidentals = tune.getKeySignature?.()?.accidentals || [];\n const key = keyAccidentals.length * (keyAccidentals[0]?.acc === 'flat' ? -1 : 1);\n const firstStaff = tune.lines.find((line: any) => line.staff?.length)?.staff || [];\n const parts: Part[] = [];\n const map = new Map<string, Part>();\n for (const [staffIndex, staff] of firstStaff.entries()) for (const [voiceIndex] of (staff as any).voices.entries()) {\n const name = staff.title?.[voiceIndex] || staff.title?.[0] || (voiceIndex ? `Voice ${voiceIndex + 1}` : 'Melody');\n const percussion = staff.clef?.type === 'perc';\n const clef = percussion ? 'percussion' : /bass|cello|trombone/i.test(name) ? 'bass' : staff.voices.length === 1 && staff.clef?.type === 'bass' ? 'bass' : 'treble';\n const part: Part = { id: `abc-${staffIndex}-${voiceIndex}`, name, clef, instrument: percussion ? 'drum-kit' : instrumentForName(name), measures: [] };\n parts.push(part); map.set(`${staffIndex}-${voiceIndex}`, part);\n }\n // Navigation is read from the first voice: abcjs puts repeat/ending marks on bars\n // (a bar ends one measure and may start the next) and D.C./Fine/segno on notes or bars.\n const nav = (measure: Measure) => (measure.navigation ||= {});\n let pendingStart: MeasureNavigation = {};\n let openEnding: number[] | undefined;\n let lastFilled: Measure | undefined;\n /** Coda signs written on a barline: the measure the barline ends and the one it starts. */\n const barlineCodas: { before: Measure; after?: Measure }[] = [];\n let pendingBarlineCoda: { before: Measure; after?: Measure } | undefined;\n const navigationWords = (item: any): NavigationWord[] => [\n ...(item.decoration || []).map((name: string) => abcDecorationWord(name)),\n ...(item.chord || []).map((chord: { name?: string }) => navigationWord(chord.name || '')),\n ].filter(Boolean);\n const applyWord = (word: NavigationWord, start: MeasureNavigation, end: MeasureNavigation | undefined) => {\n if (word === 'segno' || word === 'coda') start[word] = true;\n else if (end) end[word] = true;\n };\n for (const line of tune.lines) for (const [staffIndex, staff] of (line.staff || []).entries()) for (const [voiceIndex, voice] of (staff.voices || []).entries()) {\n const part = map.get(`${staffIndex}-${voiceIndex}`);\n if (!part) continue;\n const leading = part === parts[0];\n let current = part.measures.at(-1);\n if (!current || (current as any).closed) { current = empty(part.measures.length, beats * 4 / beatType); part.measures.push(current); }\n let cursor = current.notes.reduce((max, n) => Math.max(max, n.start + n.duration), 0);\n const accidentalMap = new Map<string, number>();\n // abcjs marks only the first note of a tuplet with its multiplier.\n let triplet: { multiplier: number; remaining: number; actual: number; first: boolean } | undefined;\n for (const item of voice) {\n if (item.el_type === 'bar') {\n if (leading) {\n const end = lastFilled && nav(lastFilled);\n if (end && ['bar_right_repeat', 'bar_dbl_repeat'].includes(item.type)) end.repeatEnd = true;\n // A mark on a bar ends the measure before it, except segno/coda, which start the next one.\n for (const word of navigationWords(item)) applyWord(word, pendingStart, end);\n if (lastFilled && navigationWords(item).includes('coda')) barlineCodas.push(pendingBarlineCoda = { before: lastFilled });\n if (item.endEnding) openEnding = undefined;\n if (['bar_left_repeat', 'bar_dbl_repeat'].includes(item.type)) pendingStart.repeatStart = true;\n if (item.startEnding) openEnding = endingNumbers(String(item.startEnding));\n }\n if (current.notes.length) (current as any).closed = true;\n current = empty(part.measures.length, beats * 4 / beatType); part.measures.push(current);\n cursor = 0; accidentalMap.clear(); continue;\n }\n if (item.el_type !== 'note') continue;\n if (item.startTriplet && Number(item.tripletMultiplier) > 0) triplet = { multiplier: Number(item.tripletMultiplier), remaining: Number(item.tripletR || item.startTriplet) || 3, actual: Number(item.startTriplet) || 3, first: true };\n const tupletInfo = triplet ? { actual: triplet.actual, normal: Math.max(1, Math.round(triplet.actual * triplet.multiplier)), number: '1', start: triplet.first, stop: Boolean(item.endTriplet) || triplet.remaining <= 1 } : undefined;\n const duration = Number(item.duration || .25) * 4 * (triplet?.multiplier ?? 1);\n if (triplet) { triplet.first = false; triplet.remaining--; if (item.endTriplet || triplet.remaining <= 0) triplet = undefined; }\n const pitches = (item.pitches || []).map((p: any) => {\n const degree = Number(p.pitch || 0);\n const steps = ['C', 'D', 'E', 'F', 'G', 'A', 'B'];\n const step = steps[((degree % 7) + 7) % 7];\n const octave = 4 + Math.floor(degree / 7);\n const explicit = ({ sharp: 1, flat: -1, natural: 0, dblsharp: 2, dblflat: -2 } as Record<string, number>)[p.accidental];\n if (explicit !== undefined) accidentalMap.set(`${step}${octave}`, explicit);\n const fromKey = keyAccidentals.find((a: any) => a.note.toUpperCase() === step);\n const alter = accidentalMap.get(`${step}${octave}`) ?? (fromKey?.acc === 'sharp' ? 1 : fromKey?.acc === 'flat' ? -1 : 0);\n // Percussion (clef=perc) is written by staff position: it keeps its written pitch for playback and is engraved\n // unpitched at that position.\n const position = part.clef === 'percussion' ? { unpitched: true, displayStep: step, displayOctave: octave } : {};\n return { ...pitch(step, octave, alter), ...position, tieStart: Boolean(p.startTie), tieStop: Boolean(p.endTie) };\n });\n if (leading) {\n if (!current.notes.length) {\n Object.assign(nav(current), pendingStart);\n pendingStart = {};\n if (pendingBarlineCoda) { pendingBarlineCoda.after = current; pendingBarlineCoda = undefined; }\n if (openEnding?.length) nav(current).endings = [...openEnding];\n }\n for (const word of navigationWords(item)) applyWord(word, nav(current), nav(current));\n lastFilled = current;\n }\n // Navigation text (\"^D.C. al Fine\") is a jump instruction, never a chord symbol.\n const chordSymbol = item.chord?.find((chord: { name?: string; position?: string }) => chord.position !== 'below' && !navigationWord(chord.name || ''))?.name;\n const lyric = item.lyric?.map((syllable: { syllable?: string; divider?: string }) => `${syllable.syllable || ''}${syllable.divider === '-' ? '-' : ''}`).filter(Boolean).join(' ');\n current.notes.push({ id: `abc-${staffIndex}-${voiceIndex}-${current.index}-${current.notes.length}`, start: cursor, duration, pitches, chordSymbol, lyric, beamStart: Boolean(item.startBeam), beamEnd: Boolean(item.endBeam), rest: !pitches.length, dotted: Boolean(item.dots), tuplet: tupletInfo, tieStart: pitches.some((p: { tieStart?: boolean }) => p.tieStart) || undefined, tieStop: pitches.some((p: { tieStop?: boolean }) => p.tieStop) || undefined });\n cursor += duration;\n }\n }\n const nominal = beats * 4 / beatType;\n parts.forEach(part => {\n part.measures = part.measures.filter(m => m.notes.length);\n part.measures.forEach((m, i) => {\n m.index = i;\n m.nominalBeats = nominal;\n // ABC is literal: a pickup, or a bar split by a mid-measure repeat, is only as long as its notes.\n const content = m.notes.reduce((max, note) => Math.max(max, note.start + note.duration), 0);\n if (content > 1e-6 && content < nominal - 1e-6) { m.implicit = true; m.beats = content; }\n });\n });\n const navigation = parts[0]?.measures.map(m => m.navigation || {}) || [];\n const measureIndex = (measure?: Measure) => measure ? parts[0]?.measures.indexOf(measure) ?? -1 : -1;\n const wasToCoda = barlineCodas.map(pair => Boolean(navigation[measureIndex(pair.after)]?.toCoda));\n resolveCodaSigns(navigation);\n // A barline coda sign that became To Coda is the jump at that barline: it ends the measure before it.\n barlineCodas.forEach((pair, i) => {\n const before = measureIndex(pair.before), after = measureIndex(pair.after);\n if (before < 0 || after < 0 || wasToCoda[i] || !navigation[after].toCoda) return;\n delete navigation[after].toCoda;\n navigation[before].toCoda = true;\n });\n const minor = /^m(?:in)?$/i.test(String(tune.getKeySignature?.()?.mode || ''));\n const score = normalized({ ...(minor ? { keyMode: 'minor' as const } : {}), title: tune.metaText?.title || '', subtitle: tune.lines.find((line: any) => line.subtitle)?.subtitle?.text || '', composer: tune.metaText?.composer || '', source: 'ABC', tempo: Number(tune.metaText?.tempo?.bpm) || 100, beats, beatType, key, parts });\n attachNavigation(score, navigation);\n score.document = makeSourceDocument({ format: 'abc', engravingFormat: 'mei', originalText: text, engravingText: scoreToMei(score), identity: identityForScore(score) });\n return score;\n}\n\nexport async function parseMidi(buffer: ArrayBuffer): Promise<Score> {\n const { default: toneMidi } = await import('@tonejs/midi');\n const { Midi } = toneMidi;\n const midi = new Midi(buffer);\n const beats = midi.header.timeSignatures[0]?.timeSignature[0] || 4;\n const beatType = midi.header.timeSignatures[0]?.timeSignature[1] || 4;\n const tempo = Math.round(midi.header.tempos[0]?.bpm || 120);\n const measureSize = beats * 4 / beatType;\n const ppq = midi.header.ppq;\n const parts: Part[] = midi.tracks.filter(t => t.notes.length).map((track, ti) => {\n const name = track.name || track.instrument.name || `Track ${ti + 1}`;\n const measures: Measure[] = [];\n for (const note of track.notes) {\n const absolute = Math.round(note.ticks / ppq * 4) / 4;\n const duration = Math.max(.25, Math.round(note.durationTicks / ppq * 4) / 4);\n // Notes crossing a barline become tied pieces so measures keep their nominal length.\n let position = absolute, remaining = duration, piece = 0;\n while (remaining > 1e-6) {\n const index = Math.floor(position / measureSize + 1e-9);\n const start = position - index * measureSize;\n const length = Math.min(remaining, measureSize - start);\n while (measures.length <= index) measures.push(empty(measures.length, measureSize));\n const m = measures[index];\n const tieStop = piece > 0, tieStart = remaining - length > 1e-6;\n const sounding = { ...midiPitch(note.midi), ...(tieStart ? { tieStart } : {}), ...(tieStop ? { tieStop } : {}) };\n const chord = m.notes.find(n => Math.abs(n.start - start) < .001 && Math.abs(n.duration - length) < .001);\n if (chord) { chord.pitches.push(sounding); chord.tieStart ||= tieStart || undefined; chord.tieStop ||= tieStop || undefined; }\n else m.notes.push({ id: `midi-${ti}-${index}-${m.notes.length}`, start, duration: length, pitches: [sounding], ...(tieStart ? { tieStart } : {}), ...(tieStop ? { tieStop } : {}) });\n position += length; remaining -= length; piece++;\n }\n }\n return { id: `midi-${ti}`, name, clef: track.instrument.percussion ? 'percussion' : /bass/i.test(name) ? 'bass' : 'treble', instrument: track.instrument.percussion ? 'drum-kit' : instrumentForProgram(track.instrument.number), pitchBasis: 'concert' as const, measures };\n });\n const score = normalized({ title: midi.name || '', source: 'MIDI · quantized', tempo, beats, beatType, key: 0, parts });\n // MIDI has no written accidentals: show one wherever a pitch differs from the one in force on its line (C major, or\n // an earlier accidental in the measure), so a sharp is drawn and not just played.\n for (const part of score.parts) if (part.clef !== 'percussion') for (const measure of part.measures) {\n const inForce = new Map<string, number>();\n for (const note of measure.notes) for (const pitch of note.pitches) {\n const line = `${pitch.step}${pitch.octave}`;\n if (pitch.tieStop || pitch.alter === (inForce.get(line) ?? 0)) continue;\n pitch.accidental = pitch.alter > 0 ? 'sharp' : pitch.alter < 0 ? 'flat' : 'natural';\n inForce.set(line, pitch.alter);\n }\n }\n score.document = makeSourceDocument({ format: 'midi', engravingFormat: 'mei', originalBytes: new Uint8Array(buffer), engravingText: scoreToMei(score), identity: identityForScore(score) });\n return score;\n}\n\n/** What the import worker hands back: a parsed score, or the bytes of a format the main thread reads. */\ntype WorkerResult = { kind: 'score'; score: Score } | { kind: 'bytes'; bytes: Uint8Array };\ntype ImportJob = { sha256: Promise<string>; size: Promise<number | undefined>; result: Promise<WorkerResult> };\n/**\n * Per channel (reader instance), the import whose score is still arriving; a newer import on the same channel stops\n * it. A job past its score finishes its timeline.\n */\nconst parsing = new Map<number, { worker: Worker; fail: (error: Error) => void }>();\n\n/** A reader unmounted: stop its import still parsing (its score would never be shown). */\nexport function cancelImports(channel: number): void {\n parsing.get(channel)?.fail(new Error('Import cancelled.'));\n}\n\n/**\n * Run one import in a fresh worker (docs/specs/large-score-performance.md, Phase 2). The main thread only assembles\n * the Score from bounded chunks (each message is its own short task) and wraps the transferred bytes; it never\n * parses or hashes the file. The playback timeline arrives after the score and is registered for its document.\n */\nfunction runImport(request: ImportRequest, file: File | undefined, channel: number): ImportJob {\n parsing.get(channel)?.fail(new Error('Superseded import.'));\n const worker = new Worker(new URL('./import.worker.ts', import.meta.url), { type: 'module' });\n let resolveHash!: (sha256: string) => void, resolveResult!: (result: WorkerResult) => void;\n let rejectHash!: (error: Error) => void, rejectResult!: (error: Error) => void;\n const sha256 = new Promise<string>((resolve, reject) => { resolveHash = resolve; rejectHash = reject; });\n const result = new Promise<WorkerResult>((resolve, reject) => { resolveResult = resolve; rejectResult = reject; });\n let timeline: { resolve: (timeline: BaseTimeline) => void; reject: (error: Error) => void; value?: BaseTimeline } | undefined;\n let score: Score | undefined;\n let hash: string | undefined, size: number | undefined;\n const identity = new IdentityBuilder();\n const stop = () => { worker.terminate(); if (parsing.get(channel)?.worker === worker) parsing.delete(channel); };\n const fail = (error: Error) => { stop(); rejectHash(error); rejectResult(error); timeline?.reject(error); };\n parsing.set(channel, { worker, fail });\n worker.onerror = event => { event.preventDefault(); fail(new Error(event.message || 'The score could not be read.')); };\n worker.onmessage = ({ data }: MessageEvent<ImportReply>) => {\n switch (data.kind) {\n case 'source': hash = data.sha256; size = data.size; resolveHash(data.sha256); break;\n case 'bytes': stop(); resolveResult({ kind: 'bytes', bytes: new Uint8Array(data.bytes) }); break;\n case 'head': score = data.score; score.parts.forEach(part => identity.part(part)); break;\n case 'measures': {\n const measures = score!.parts[data.part].measures;\n for (const measure of data.measures) measures.push(measure);\n identity.notes(data.measures);\n break;\n }\n case 'done': {\n if (parsing.get(channel)?.worker === worker) parsing.delete(channel);\n const original = data.original ? new Uint8Array(data.original) : undefined;\n const engraving = data.engraving ? new Uint8Array(data.engraving) : undefined;\n const text = request.kind === 'text' ? request.text : undefined;\n const document: SourceDocument = makeSourceDocument({\n format: data.format, engravingFormat: 'musicxml', originalBytes: original,\n // Files keep bytes only; their texts are decoded on demand (the MXL member is extracted again).\n originalText: text ?? (data.format === 'mxl' ? { bytes: original!, decode: () => extractMxlScore(original!) } : { bytes: original! }),\n engravingText: engraving ? { bytes: engraving } : text ?? { bytes: original! },\n filename: file?.name, sha256: hash, identity: identity.identity, inventory: data.inventory, diagnostics: data.diagnostics,\n });\n score!.document = document;\n const built = new Promise<BaseTimeline>((resolve, reject) => { timeline = { resolve, reject }; });\n // A timeline that never arrives is built on demand instead (baseTimelineFor).\n built.catch(() => {});\n registerBaseTimeline(document, built);\n resolveResult({ kind: 'score', score: score! });\n break;\n }\n case 'timeline': timeline!.value = data.timeline; break;\n case 'timeline-events': {\n const value = timeline!.value!;\n for (const event of data.events) value.events.push(event);\n for (const source of data.eventSources) value.eventSources.push(source);\n break;\n }\n case 'timeline-end': stop(); timeline!.resolve(timeline!.value!); break;\n case 'error': fail(new Error(data.message)); break;\n }\n };\n worker.postMessage(request);\n // Callers may use only one of the two promises.\n sha256.catch(() => {}); result.catch(() => {});\n const sizeKnown = sha256.then(() => size);\n sizeKnown.catch(() => {});\n return { sha256, size: sizeKnown, result };\n}\n\n/** An import of a score file: its source identity (available once hashed) and the score. */\nexport type ScoreImport = { source: Promise<FileSource>; score: Promise<Score> };\n\n/**\n * Open a score file. The import worker reads and hashes it once and reads MusicXML/MXL off the main thread; MEI,\n * ABC and MIDI are small and are read here from the bytes the worker hands back. `channel` is the reader's (see\n * verovio-runtime openVerovioChannel): a newer import only supersedes imports on the same channel.\n */\nexport function importScoreFile(file: File, channel = 0): ScoreImport {\n if (file.size > MAX_SCORE_FILE_BYTES) {\n const error = Promise.reject(new Error(`This file is ${formatMb(file.size)}; scores up to ${formatMb(MAX_SCORE_FILE_BYTES)} can be opened.`));\n error.catch(() => {});\n return { source: error as Promise<never>, score: error as Promise<never> };\n }\n const job = runImport({ kind: 'file', file }, file, channel);\n const score = job.result.then(async result => {\n if (result.kind === 'score') return result.score;\n return readOnMainThread(file, result.bytes, await job.sha256);\n });\n return handled({ source: job.sha256.then(sha256 => fileSourceFor(file.name, file.size, sha256)), score });\n}\n\n/**\n * Callers may stop at either promise (the Reader stops at the source when the import fails or is superseded), so\n * neither may surface as an unhandled rejection; awaiting one still rejects as usual.\n */\nfunction handled(job: ScoreImport): ScoreImport {\n job.source.catch(() => {});\n job.score.catch(() => {});\n return job;\n}\n\n/** Open a score file (see importScoreFile). */\nexport function importFile(file: File): Promise<Score> {\n return importScoreFile(file).score;\n}\n\n/**\n * Read MusicXML text the page already holds (the Reader's musicXml prop) in the import worker, which also takes its\n * source identity (the same as file-state.ts textSource, without hashing on the main thread). Superseded only by a\n * newer import on the same `channel`.\n */\nexport function importMusicXmlText(text: string, name = 'MusicXML', channel = 0): ScoreImport {\n const job = runImport({ kind: 'text', text }, undefined, channel);\n return handled({\n source: job.sha256.then(async sha256 => ({ name, size: (await job.size) ?? 0, sha256, format: 'musicxml' })),\n score: job.result.then(result => { if (result.kind !== 'score') throw new Error('This file is not a MusicXML score.'); return result.score; }),\n });\n}\n\nasync function readOnMainThread(file: File, bytes: Uint8Array, hash: string): Promise<Score> {\n const name = file.name.toLowerCase();\n // The document is re-wrapped with the file's identity; its inventory and identity carry over (no second parse).\n const rewrap = (score: Score, binary?: Uint8Array) => {\n const document = score.document!;\n score.document = makeSourceDocument({ format: document.format, engravingFormat: document.engravingFormat, originalBytes: binary, originalText: document.originalText, engravingText: document.engravingText, filename: file.name, sha256: hash, identity: document.identity, inventory: { featureCounts: document.featureCounts, diagnostics: document.diagnostics } });\n return score;\n };\n if (/\\.(mid|midi)$/.test(name)) return rewrap(await parseMidi(bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer), bytes);\n const text = new TextDecoder().decode(bytes);\n if (/\\.(abc|txt)$/.test(name)) return rewrap(await parseAbc(text));\n if (/\\.mei$/.test(name)) return rewrap(parseMei(text));\n throw new Error('Choose a MusicXML, MIDI, MEI, or ABC file.');\n}\n","import type { Pitch } from './score';\n\nconst qualities: [number[], string][] = [\n [[0, 4, 7, 11], 'maj7'],\n [[0, 4, 7, 10], '7'],\n [[0, 3, 7, 10], 'm7'],\n [[0, 3, 6, 10], 'm7♭5'],\n [[0, 3, 6, 9], 'dim7'],\n [[0, 4, 7, 9], '6'],\n [[0, 3, 7, 9], 'm6'],\n [[0, 4, 7], ''],\n [[0, 3, 7], 'm'],\n [[0, 3, 6], 'dim'],\n [[0, 4, 8], 'aug'],\n [[0, 5, 7], 'sus4'],\n [[0, 2, 7], 'sus2'],\n];\n\nexport function pitchName(pitch: Pitch): string {\n return pitch.step + (pitch.alter > 0 ? '♯'.repeat(pitch.alter) : '♭'.repeat(-pitch.alter));\n}\n\nexport function inferChordSymbol(pitches: Pitch[]): string | undefined {\n const classes = [...new Set(pitches.map(pitch => pitch.midi % 12))];\n if (classes.length < 3 || classes.length > 4) return;\n const bass = pitches.reduce((lowest, pitch) => pitch.midi < lowest.midi ? pitch : lowest);\n for (const root of [bass.midi % 12, ...classes.filter(pc => pc !== bass.midi % 12)]) {\n const intervals = classes.map(pc => (pc - root + 12) % 12).sort((a, b) => a - b);\n const quality = qualities.find(([pattern]) => pattern.length === intervals.length && pattern.every((interval, index) => interval === intervals[index]));\n if (!quality) continue;\n const rootPitch = pitches.find(pitch => pitch.midi % 12 === root);\n if (!rootPitch) continue;\n return `${pitchName(rootPitch)}${quality[1]}${root === bass.midi % 12 ? '' : `/${pitchName(bass)}`}`;\n }\n}\n","import type { SourceDocument } from './notation/document';\nimport type { BaselineInfo, PagesResult, ProbeResult, VerovioReply, VerovioRequest, ViewSpec } from './verovio-protocol';\n\n/** A worker failure; `code` says why (see VerovioReply). */\nexport class VerovioError extends Error {\n constructor(message: string, readonly code?: VerovioReply['code']) { super(message); }\n}\nexport const isSuperseded = (error: unknown) => error instanceof VerovioError && error.code === 'superseded';\n/** Verovio ran out of WASM memory (its heap is capped at 2 GiB); `reduceChunkSize` then a retry may succeed. */\nexport const isOutOfMemory = (error: unknown) => error instanceof VerovioError && error.code === 'oom';\n/** The worker was recycled under a request (another reader's out-of-memory failure, a heap recycle); retried once. */\nexport const isRestarted = (error: unknown) => error instanceof VerovioError && error.code === 'restarted';\nconst restarted = () => new VerovioError('Verovio restarted.', 'restarted');\n\n/**\n * Engraving chunk budget, in staff-measures per chunk (see docs/specs/large-score-performance.md, Phase 3). Long\n * scores are engraved chunk by chunk; an out-of-memory retry halves the budget and engraves every score in chunks.\n */\nexport const DEFAULT_CHUNK_STAFF_MEASURES = 640;\nconst MIN_CHUNK_STAFF_MEASURES = 40;\nlet chunkBudget = DEFAULT_CHUNK_STAFF_MEASURES;\nlet forceChunks = false;\n/** A heap above this (the cap is 2 GiB) is returned when the worker is idle and the score re-imports cheaply. */\nlet recycleHeapBytes = 1024 * 2 ** 20;\n// Diagnostics and tests: localStorage `scoreflow-chunking` = {\"force\": true, \"budget\": 16} engraves every MusicXML\n// score in chunks of that size (validation/chunks.mjs compares chunked and whole engravings); `recycleHeapBytes`\n// lowers the idle-recycle threshold. A diagnostic hook: un-namespaced and exempt from `persist` (storage.ts).\n// Browser only: Node 25 has a global localStorage whose access prints a warning on an SSR server.\nif (typeof window !== 'undefined') try {\n const setting = JSON.parse(window.localStorage?.getItem('scoreflow-chunking') || 'null') as { force?: boolean; budget?: number; recycleHeapBytes?: number } | null;\n if (setting?.force) forceChunks = true;\n if (Number(setting?.budget) > 0) chunkBudget = Number(setting!.budget);\n if (Number(setting?.recycleHeapBytes) > 0) recycleHeapBytes = Number(setting!.recycleHeapBytes);\n} catch { /* no storage */ }\nexport const chunkSettings = () => ({ budget: chunkBudget, force: forceChunks });\n/**\n * After an out-of-memory failure: engrave in chunks half the size (every score, even one below the chunking\n * threshold) on a fresh worker. The caller then opens or draws the score again. Returns the new budget.\n */\nexport function reduceChunkSize(): number {\n chunkBudget = Math.max(MIN_CHUNK_STAFF_MEASURES, Math.floor(chunkBudget / 2));\n forceChunks = true;\n stopWorker(restarted());\n return chunkBudget;\n}\n/**\n * Test hook: `localStorage['scoreflow-simulate-oom']` = N (a positive integer; any other value counts as 1) makes the\n * next probe or render fail as out of memory, and the next N - 1 probes or renders of the same channel too, the way a\n * score too large for the device keeps failing in its own reader (other readers are unaffected). A diagnostic hook:\n * un-namespaced and exempt from `persist` (storage.ts).\n */\nlet simulatedOom: { channel: number; left: number } | undefined;\nfunction takeSimulatedOom(channel: number): boolean {\n try {\n const armed = globalThis.localStorage?.getItem('scoreflow-simulate-oom');\n if (armed) {\n globalThis.localStorage.removeItem('scoreflow-simulate-oom');\n const count = Number(armed);\n simulatedOom = { channel, left: Number.isInteger(count) && count > 0 ? count : 1 };\n }\n } catch { /* no storage */ }\n if (!simulatedOom || simulatedOom.channel !== channel || simulatedOom.left <= 0) return false;\n simulatedOom.left--;\n return true;\n}\n\n/** `channel`: the reader a probe or render belongs to (imports are shared by every reader showing the score). */\ntype Pending = { kind: VerovioRequest['kind']; channel?: number; resolve: (value: any) => void; reject: (reason: Error) => void };\nlet worker: Worker | undefined;\nlet nextId = 0;\nconst pending = new Map<number, Pending>();\n\nfunction getWorker(): Worker {\n if (worker) return worker;\n worker = new Worker(new URL('./verovio.worker.ts', import.meta.url), { type: 'module' });\n worker.onmessage = ({ data }: MessageEvent<VerovioReply>) => {\n const item = pending.get(data.id);\n if (!item) return;\n pending.delete(data.id);\n if (data.heap !== undefined) {\n heap = data.heap;\n // Exposed for diagnostics and the large-score validation (the WASM heap is not visible to the page otherwise).\n (globalThis as { __scoreflowVerovioHeapPeak?: number }).__scoreflowVerovioHeapPeak = Math.max(heap, (globalThis as { __scoreflowVerovioHeapPeak?: number }).__scoreflowVerovioHeapPeak || 0);\n }\n if (data.error !== undefined) item.reject(new VerovioError(data.error, data.code));\n else item.resolve(data.value);\n // Out of memory leaves a heap near the 2 GiB cap that the worker cannot give back: start a fresh worker. A large\n // heap is returned once the worker is idle, but only for a chunked score, which re-imports in one index pass, and\n // never right after an import (the render that needs it follows): a whole-document score would be imported again\n // and recycled again, over and over. Its heap is returned before the next score's import instead.\n // Other readers' requests still in flight fail as `restarted` and are sent again to the fresh worker; the failing\n // reader's own requests fail as out of memory (the same layout would only run out of memory again).\n const idle = !pending.size && item.kind !== 'import' && importsInFlight === 0 && currentChunked;\n if (data.code === 'oom') stopWorker(restarted(), item.channel);\n else if (heap > recycleHeapBytes && idle) stopWorker(restarted());\n };\n worker.onerror = event => {\n event.preventDefault();\n stopWorker(new VerovioError(event.message || 'Verovio worker failed.'));\n };\n return worker;\n}\n\n/**\n * Terminate the worker (it holds the WASM heap, which never shrinks) and fail whatever it still owed with `reason`,\n * except the probes and renders of `outOfMemory` (the channel that ran out of memory), which fail as out of memory.\n */\nfunction stopWorker(reason: Error, outOfMemory?: number): void {\n worker?.terminate();\n worker = undefined;\n heap = 0;\n baselines.clear();\n for (const item of pending.values()) {\n item.reject(outOfMemory !== undefined && item.channel === outOfMemory ? new VerovioError('This score is too large for the notation renderer on this device (it ran out of memory).', 'oom') : reason);\n }\n pending.clear();\n}\n\ntype Body = VerovioRequest extends infer R ? R extends unknown ? Omit<R, 'id'> : never : never;\nfunction request<T>(body: Body, transfer: Transferable[] = []): Promise<T> {\n const id = ++nextId;\n return new Promise<T>((resolve, reject) => {\n pending.set(id, { kind: body.kind, channel: 'channel' in body ? body.channel : undefined, resolve, reject });\n getWorker().postMessage({ ...body, id }, transfer);\n });\n}\n\n/** Revisions identify a source document (the engraving text), shared by every Score copy made from it. */\nconst revisions = new WeakMap<object, number>();\nlet nextRevision = 0;\nexport function verovioRevision(document: SourceDocument): number {\n let revision = revisions.get(document);\n if (!revision) { revision = ++nextRevision; revisions.set(document, revision); }\n return revision;\n}\n\n/** Baselines the worker holds (the runtime releases those no channel uses, see releaseUnused). */\nconst baselines = new Map<number, Promise<BaselineInfo>>();\n/** Baselines kept even when no channel uses them (a reader switching back to its previous score reuses one). */\nconst BASELINE_LIMIT = 2;\n/** Whether the most recent import is engraved in chunks (cheap to re-import after the worker is recycled). */\nlet currentChunked = false;\n/** The worker's WASM heap after its latest reply (bytes). */\nlet heap = 0;\n/** A heap above this is not reused well by a different score: the worker is recycled before the next import. */\nconst RECYCLE_BEFORE_IMPORT_BYTES = 384 * 2 ** 20;\n/** Imports in flight on any channel (a worker is never recycled as idle while one runs). */\nlet importsInFlight = 0;\n\n/** One channel per reader instance: its own render tickets, current/previous revisions and import in flight. */\ntype Channel = { current: number; previous: number; importing?: number };\nconst channels = new Map<number, Channel>();\nlet nextChannel = 0;\n/**\n * Opened channels only exist from openVerovioChannel until closeVerovioChannel; a closed (or never opened) channel is\n * never brought back by a late request: its requests fail as `superseded`. Channel 0 always exists.\n */\nconst channelState = (id: number): Channel | undefined => {\n let state = channels.get(id);\n if (!state && id === 0) { state = { current: 0, previous: 0 }; channels.set(id, state); }\n return state;\n};\nconst closed = () => new VerovioError('Superseded score render (the reader closed).', 'superseded');\nconst publishChannels = () => { (globalThis as { __pepperscoreVerovioChannels?: number }).__pepperscoreVerovioChannels = [...channels.keys()].filter(id => id !== 0).length; };\n/** A reader mounted: a channel of its own, so its imports and renders never supersede another reader's. */\nexport function openVerovioChannel(): number {\n const id = ++nextChannel;\n channels.set(id, { current: 0, previous: 0 });\n // Exposed for diagnostics and validation/embed.mjs: the number of open reader channels.\n publishChannels();\n return id;\n}\n/**\n * A reader unmounted: forget what only it used; the worker (and its WASM heap) goes when the last opened channel\n * closes. Channel 0, the default for direct callers of render.ts, is never opened and does not keep the worker.\n */\nexport function closeVerovioChannel(id: number): void {\n channels.delete(id);\n publishChannels();\n if (![...channels.keys()].some(open => open !== 0)) { stopWorker(new VerovioError('Verovio renderer disposed.')); return; }\n releaseUnused();\n}\nconst inUse = (revision: number) => [...channels.values()].some(state => state.current === revision || state.previous === revision || state.importing === revision);\n/** Keep at least BASELINE_LIMIT baselines; beyond that drop (and release in the worker) the oldest no channel uses. */\nfunction releaseUnused(): void {\n for (const revision of [...baselines.keys()]) {\n if (baselines.size <= BASELINE_LIMIT) return;\n if (inUse(revision)) continue;\n baselines.delete(revision);\n if (worker) request({ kind: 'release', revision }).catch(() => {});\n }\n}\n/** A channel shows `revision` now; the one it showed before stays its previous (still on screen while a new score imports). */\nconst adopt = (state: Channel, revision: number) => { if (state.current !== revision) { state.previous = state.current; state.current = revision; } };\n\n/**\n * Import a source once per revision and return its structure. The worker keeps Verovio's MEI baseline; the main\n * thread never receives it. A rejected import is forgotten so a retry imports again. Readers showing the same\n * document share its baseline.\n */\nexport function prepareVerovio(document: SourceDocument, channel = 0): Promise<BaselineInfo> {\n const revision = verovioRevision(document);\n const state = channelState(channel);\n if (!state) return Promise.reject(closed());\n let cached = baselines.get(revision);\n if (cached) {\n baselines.delete(revision); baselines.set(revision, cached);\n return cached.then(info => { adopt(state, revision); return info; });\n }\n // A large previous heap is not reused well by a different score; start from a fresh module instead.\n if (heap > RECYCLE_BEFORE_IMPORT_BYTES && worker) stopWorker(restarted());\n // The engraving goes as a copy of its UTF-8 bytes (transferred), never as a string decoded on the main thread; the\n // document keeps its own bytes, so a restart under the import (another reader's failure) sends them again.\n const send = () => {\n const bytes = document.engravingBytes().slice();\n return request<BaselineInfo>({ kind: 'import', revision, bytes: bytes.buffer, chunking: { force: forceChunks } }, [bytes.buffer]);\n };\n const attempt: Promise<BaselineInfo> = send().catch(error => {\n if (!isRestarted(error)) throw error;\n // The restart cleared the cache: this import is still the one other renders of the revision wait for.\n if (!baselines.has(revision)) baselines.set(revision, attempt);\n return send();\n });\n cached = attempt;\n baselines.set(revision, cached);\n state.importing = revision;\n importsInFlight++;\n const settled = () => { importsInFlight--; if (state.importing === revision) state.importing = undefined; };\n cached.then(info => { adopt(state, revision); currentChunked = !!info.chunked; settled(); releaseUnused(); },\n () => { settled(); if (baselines.get(revision) === cached) baselines.delete(revision); });\n return cached;\n}\n\n/**\n * The baseline for a render. A render never starts importing while its own reader imports another score: that render\n * belongs to the score being replaced (and importing it again could recycle the worker under the new import).\n */\nexport function verovioBaseline(document: SourceDocument, channel = 0): Promise<BaselineInfo> {\n const revision = verovioRevision(document);\n const state = channelState(channel);\n if (!state) return Promise.reject(closed());\n const { importing } = state;\n if (!baselines.has(revision) && importing !== undefined && importing !== revision) return Promise.reject(new VerovioError('Superseded score render.', 'superseded'));\n return prepareVerovio(document, channel);\n}\n\nlet ticket = 0;\n/** A new render generation: the worker answers older queued probes and renders on the same channel `superseded`. */\nexport const nextRenderTicket = () => ++ticket;\n\nasync function withBaseline<T>(document: SourceDocument, channel: number, run: (revision: number) => Promise<T>): Promise<T> {\n const revision = verovioRevision(document);\n await verovioBaseline(document, channel);\n try { return await run(revision); }\n catch (error) {\n // The worker restarted under the request, or dropped this revision while it is still the channel's score:\n // import it again, once.\n const missing = error instanceof VerovioError && error.code === 'missing' && revision === channelState(channel)?.current;\n if (!isRestarted(error) && !missing) throw error;\n // After a restart the cache is already empty (and may hold another reader's fresh re-import of this revision).\n if (missing) baselines.delete(revision);\n await verovioBaseline(document, channel);\n return run(revision);\n }\n}\n\n/** Lay out the first `measures` measures as a small document and return page 1 (the first system). */\nexport function probeVerovio(document: SourceDocument, channel: number, renderTicket: number, view: ViewSpec, options: Record<string, unknown>, measures: number): Promise<ProbeResult> {\n return withBaseline(document, channel, revision => request<ProbeResult>({ kind: 'probe', channel, ticket: renderTicket, revision, view, options, measures, chunkBudget, simulateOom: takeSimulatedOom(channel) || undefined }));\n}\n\n/** Serialize one-based pages of the whole view laid out with `options`; the worker reuses its loaded document when it can. */\nexport function renderVerovioPages(document: SourceDocument, channel: number, renderTicket: number, view: ViewSpec, options: Record<string, unknown>, pages: number[]): Promise<PagesResult> {\n return withBaseline(document, channel, revision => request<PagesResult>({ kind: 'render', channel, ticket: renderTicket, revision, view, options, pages, chunkBudget, simulateOom: takeSimulatedOom(channel) || undefined }));\n}\n","export type MusicFont = 'Bravura' | 'Petaluma';\n\n/**\n * Petaluma 1.065 `engravingDefaults` (steinbergmedia/petaluma redist/petaluma_metadata.json), in staff spaces.\n * Verovio 6.3.0 does not read a font's engravingDefaults on its own, so stems, staff/ledger/bar lines, ties and\n * slurs keep Verovio's thinner built-in widths unless we pass them. Keys Verovio 6.3.0 rejects\n * (arrowShaftThickness, beamSpacing, beamThickness, dashedBarlineThickness) are left out to keep the console clean.\n */\nconst PETALUMA_ENGRAVING_DEFAULTS = {\n barlineSeparation: 0.4, bracketThickness: 0.5, dashedBarlineDashLength: 0.5, dashedBarlineGapLength: 0.25,\n hairpinThickness: 0.16, legerLineExtension: 0.4, legerLineThickness: 0.16, lyricLineThickness: 0.16,\n octaveLineThickness: 0.16, pedalLineThickness: 0.16, repeatBarlineDotSeparation: 0.16, repeatEndingLineThickness: 0.16,\n slurEndpointThickness: 0.1, slurMidpointThickness: 0.22, staffLineThickness: 0.13, stemThickness: 0.12,\n subBracketThickness: 0.16, textEnclosureThickness: 0.16, thickBarlineThickness: 0.5, thinBarlineThickness: 0.16,\n tieEndpointThickness: 0.1, tieMidpointThickness: 0.22, tupletBracketThickness: 0.16,\n};\nconst PETALUMA_OPTIONS = {\n // Without this, Verovio centres Petaluma's time-signature digits on the middle line and they overprint.\n handwrittenFont: ['Petaluma'],\n engravingDefaults: JSON.stringify(PETALUMA_ENGRAVING_DEFAULTS),\n};\n\n/** Extra Verovio options a music font needs beyond `font`. Bravura keeps Verovio's defaults. */\nexport const musicFontOptions = (font: MusicFont | undefined): Record<string, unknown> => font === 'Petaluma' ? PETALUMA_OPTIONS : {};\n","import type { Part, Score, ScoreNote } from './score';\nimport { inferChordSymbol } from './chords';\nimport { spellChordSymbol } from './spelling';\nimport { measureKey, scoreForView, spellingSpecFor } from './transpose';\nimport { isRestarted, isSuperseded, nextRenderTicket, probeVerovio, renderVerovioPages, VerovioError, verovioBaseline } from './verovio-runtime';\nimport { staffDefXmlId, type SourceDocument } from './notation/document';\nimport type { BaselineInfo, ViewSpec } from './notation/mei-view';\nimport { musicFontOptions } from './music-fonts';\nimport { clampBarsPerLine } from './prefs';\nimport { BARS_FIT_MAX_STAVE_SCALE, DEFAULT_VERTICAL_BARS, HEIGHT_FIT_STAVES, STAVE_SCALE_FLOOR, STAVE_SCALE_MAX, STAVE_SCALE_MIN } from './stave-scale';\n\nconst SVG = 'http://www.w3.org/2000/svg';\n\nexport type NotePoint = { id: string; measure: number; part: number; start: number; duration: number; rest?: boolean; x: number; y: number; element?: Element; sourceId?: string; system: number };\nexport type MeasureGeometry = { index: number; system: number; x: number; width: number; y: number; height: number; element?: Element };\nexport type SystemGeometry = { index: number; firstMeasure: number; measureCount: number; width: number; height: number; staffCenters: number[];\n /** The system's engraving is in the DOM; otherwise its block is a placeholder sized from layout data (estimated until first drawn). */\n rendered: boolean };\nexport type RenderResult = { systemSize: number; staffCenters: number[]; scale: number; barWidth: number; systemHeight: number; systems: SystemGeometry[]; visiblePartIds: string[];\n /** Note and measure geometry of the systems currently drawn (see `rendered`); positions are relative to their system block (y: canvas offset at draw time). */\n readonly points: NotePoint[];\n readonly measures: MeasureGeometry[];\n /** Rendered five-line staff height (px) of the first system, the unit staff controls are sized from. */\n stavePx: number;\n /** Smallest distance between adjacent staff centres in the first system (px); Infinity for one staff. */\n staffPitchPx: number;\n /** Left gutter reserved for staff controls before the first system (px). */\n gutter: number;\n /** Stave scale the score was laid out at (px per Verovio unit); the resolved value when 'fit' was requested. */\n zoom: number;\n /** A drawn note by Score note ID. */\n point(id: string): NotePoint | undefined;\n /** A drawn measure by Score measure index. */\n measure(index: number): MeasureGeometry | undefined;\n /** The system (block index) that engraves a Score measure. */\n systemOfMeasure(index: number): number;\n /** Draw a system now (it is otherwise drawn when it scrolls near the viewport). */\n ensureSystem(index: number): Promise<void>;\n /** Called after systems are drawn, released or resized. */\n onChange(listener: () => void): () => void;\n /** Stop drawing systems on demand (a newer render replaced this one). */\n dispose(): void };\nexport type RenderOptions = { font?: 'Bravura' | 'Petaluma'; textFont?: 'Sans' | 'Serif' | 'Mono'; transpose?: number; semitones?: number; scorePitch?: 'written' | 'concert';\n /** Spell in the enharmonic key (with `transpose`, applied when `score` is not already a `scoreForView` result). */\n flip?: boolean; generation?: number; hiddenPartIds?: string[];\n /** The reader's Verovio channel (verovio-runtime openVerovioChannel); every engraving request of this render uses it. */\n channel?: number;\n /**\n * Control gutter for a rendered staff height and staff pitch (px). The layout reserves the gutter for a\n * staff of `STAFF_UNITS * zoom` px before rendering; the final gutter uses the measured staves.\n */\n gutterFor?: (stavePx: number, staffPitchPx: number) => number;\n /** Endless 'fit' zoom (the device's Endless default); a many-staff stack is height-fitted below it. Vertical 'fit' ignores it. */\n fitCap?: number;\n /** Vertical 'fit' is never below this stave scale (compact readability floor); the stack then scrolls. */\n fitFloor?: number;\n /** Draw the system holding this Score measure before resolving (a zoom anchor), besides those in view. */\n focusMeasure?: number };\n\nconst latestGeneration = new WeakMap<HTMLElement, number>();\nconst liveResults = new WeakMap<HTMLElement, RenderResult>();\n/** Endless view keeps one unbroken system up to this many bars, then uses bounded chunks. */\nconst ENDLESS_SINGLE_SYSTEM_LIMIT = 160;\nconst ENDLESS_CHUNK = 120;\n/**\n * A score engraved in chunks (Phase 3) keeps Endless blocks to about this many staff-measures, so each block is a\n * small document (16 to 120 bars).\n */\nconst ENDLESS_CHUNK_STAFF_MEASURES = 480;\nconst endlessChunkBars = (staves: number) => Math.max(16, Math.min(ENDLESS_CHUNK, Math.round(ENDLESS_CHUNK_STAFF_MEASURES / Math.max(1, staves) / 8) * 8));\nconst LANE_GAP = 6;\nconst LANE_ROW = 17;\n/**\n * Scores up to this many staff-measures (visible staves x measures) draw every system before the first paint, as\n * before virtualization; larger ones draw the systems near the viewport and release far ones (see the spec).\n */\nexport const EAGER_STAFF_MEASURES = 1600;\n/** Systems drawn ahead of and behind the viewport, as a multiple of its size (IntersectionObserver root margin). */\nconst NEAR_SCREENS = 2;\n/** Drawn systems beyond this many viewport sizes away are released back to placeholders. */\nconst KEEP_SCREENS = 4;\n/** Pages requested from the worker at once while scrolling. */\nconst PAGE_BATCH = 2;\n\nexport function portraitMinimumBarWidth(score: Score): number {\n let busiest = 4; let lyrics = 0;\n for (const part of score.parts) for (const measure of part.measures) {\n busiest = Math.max(busiest, measure.notes.length);\n let syllables = 0;\n for (const note of measure.notes) if (note.lyric) syllables++;\n lyrics = Math.max(lyrics, syllables);\n }\n return Math.max(190, 50 + busiest * 34, 190 + Math.max(0, busiest - 4) * 44, lyricBarWidth(lyrics));\n}\n// Lyric syllables need roughly a word's width each; without this, Verovio compresses them into collisions.\nconst lyricBarWidth = (syllables: number) => syllables ? 110 + syllables * 62 : 0;\n/** Auto bars per line never exceeds this; explicit choices are 1-8 (prefs.ts BARS_PER_LINE_MAX). */\nexport const AUTO_BAR_CAP = 8;\n/** Layout units a system needs beside its bars (clef, key and time signatures, margins). */\nconst SYSTEM_OVERHEAD = 120;\n/** Five-line staff height in Verovio layout units at `scale: 100` (72px at stave scale 1). */\nexport const STAFF_UNITS = 72;\n/**\n * Most bars that fit a line of `width` Verovio units (the layout width, not px) at their minimum width, the same\n * model as `systemMinimumWidth`, so an Auto line is never laid out wider than the viewport and then width-fitted below\n * the stave scale (which broke the compact readability floor whenever a classic scrollbar took its width).\n */\nexport function portraitBarLimit(width: number, score: Score, minimumBar = portraitMinimumBarWidth(score)): number {\n return Math.max(1, Math.min(AUTO_BAR_CAP, score.parts[0]?.measures.length || 1, Math.floor((Math.max(240, width) - SYSTEM_OVERHEAD) / Math.max(190, minimumBar))));\n}\n/** Auto bars per line: the width limit, balanced so the last line is not left short. */\nexport function autoBarsPerLine(width: number, score: Score, minimumBar = portraitMinimumBarWidth(score)): number {\n const limit = portraitBarLimit(width, score, minimumBar);\n const count = Math.max(1, score.parts[0]?.measures.length || 1);\n return Math.ceil(count / Math.ceil(count / limit));\n}\n/** Narrowest layout width (Verovio units) that engraves `bars` bars at their minimum width with no width fit (matches `layoutAt`). */\nexport const systemMinimumWidth = (bars: number, barFloor: number) => bars * Math.max(190, barFloor) + SYSTEM_OVERHEAD;\n/** Slack (px) for the measured staff and gutter being a pixel or two larger than the layout model. */\nconst BAR_FIT_SLACK = 4;\n/**\n * Largest stave scale at which `bars` bars fit on the first system (beside the zoom-dependent control gutter) at their\n * minimum width, so Auto yields that many bars per line. Usable width `(viewport - gutter(z)) / z` falls as z grows\n * (the gutter never shrinks with the staff), so a bisection finds it. Deterministic, render-free, rounded down to 0.001.\n */\nexport function barFitZoom(viewportWidth: number, bars: number, barFloor: number, gutterAt: (zoom: number) => number = () => 0): number {\n const need = systemMinimumWidth(bars, barFloor);\n const fits = (zoom: number) => Math.max(180, viewportWidth - gutterAt(zoom) - BAR_FIT_SLACK) / zoom >= need;\n if (fits(STAVE_SCALE_MAX)) return STAVE_SCALE_MAX;\n if (!fits(STAVE_SCALE_FLOOR)) return STAVE_SCALE_FLOOR;\n let low = STAVE_SCALE_FLOOR, high = STAVE_SCALE_MAX;\n for (let step = 0; step < 40; step++) { const mid = (low + high) / 2; if (fits(mid)) low = mid; else high = mid; }\n return Math.floor(low * 1000) / 1000;\n}\n\nfunction parseXml(text: string): XMLDocument {\n const doc = new DOMParser().parseFromString(text, 'application/xml');\n const error = doc.querySelector('parsererror');\n if (error) throw new Error(`Could not parse Verovio output: ${error.textContent?.slice(0, 180)}`);\n return doc;\n}\n\n/**\n * Bounding box of an element in the outer SVG's user (viewBox) coordinates. `rootInverse` is the outer SVG's inverted\n * screen matrix, when the caller measures many elements of one SVG without layout changes in between.\n */\nfunction box(element: Element, svg: SVGSVGElement, rootInverse?: DOMMatrix | null): DOMRect {\n try {\n const graphics = element as SVGGraphicsElement;\n const rect = graphics.getBBox();\n const root = rootInverse !== undefined ? rootInverse : svg.getScreenCTM()?.inverse() ?? null; const own = graphics.getScreenCTM();\n const transform = root && own ? root.multiply(own) : new DOMMatrix();\n const points = [[rect.x, rect.y], [rect.x + rect.width, rect.y], [rect.x, rect.y + rect.height], [rect.x + rect.width, rect.y + rect.height]]\n .map(([x, y]) => new DOMPoint(x, y).matrixTransform(transform));\n const left = Math.min(...points.map(p => p.x)); const top = Math.min(...points.map(p => p.y));\n return new DOMRect(left, top, Math.max(...points.map(p => p.x)) - left, Math.max(...points.map(p => p.y)) - top);\n } catch { return new DOMRect(0, 0, 0, 0); }\n}\n\n/**\n * Map Score parts to Verovio staff numbers. Verovio gives a single-staff\n * MusicXML part's staffDef the part ID, while a multi-staff part's staffGrp\n * carries the part ID; semantic MEI from scoreToMei has deterministic staffDef\n * IDs; original MEI keeps its staff numbers.\n */\nexport function staffNumbers(info: BaselineInfo, score: Score): { byPart: Map<string, string>; engraved: string[] } {\n const defs = info.staffDefs;\n const engraved = [...new Set(defs.map(def => def.n).filter(Boolean))];\n const identity = score.document?.identity?.staffIdToSource || {};\n const byPart = new Map<string, string>();\n const claimed = new Set<string>();\n const claim = (part: Part, def?: { n: string }) => {\n const n = def?.n;\n if (!n || claimed.has(n)) return false;\n byPart.set(part.id, n); claimed.add(n); return true;\n };\n for (const part of score.parts) {\n const legacy = /^(.*)-(\\d+)$/.exec(part.id);\n const source = identity[part.id] || (legacy ? { partId: legacy[1], staff: Number(legacy[2]) } : { partId: part.id, staff: 1 });\n if (claim(part, defs.find(def => [part.id, staffDefXmlId(part.id)].includes(def.id)))) continue;\n const group = info.groups.find(item => item.id === source.partId);\n if (group && claim(part, group.staves[source.staff - 1])) continue;\n if (source.staff === 1 && claim(part, defs.find(def => def.id === source.partId))) continue;\n if (score.document?.format === 'mei' || score.document?.engravingFormat === 'mei') claim(part, defs.find(def => def.n === part.id));\n }\n // Positional fallback only when the remaining parts and staves correspond one to one.\n const unmappedParts = score.parts.filter(part => !byPart.has(part.id));\n const unclaimed = engraved.filter(n => !claimed.has(n));\n if (unmappedParts.length && unmappedParts.length === unclaimed.length) unmappedParts.forEach((part, index) => { byPart.set(part.id, unclaimed[index]); claimed.add(unclaimed[index]); });\n return { byPart, engraved };\n}\n\nfunction beatLabel(start: number, subdivisions: boolean): string {\n const beat = Math.floor(start) + 1;\n if (!subdivisions) return String(beat);\n const fraction = ((start % 1) + 1) % 1;\n return fraction < .01 ? String(beat) : fraction < .3 ? `${beat}e` : fraction < .55 ? `${beat}&` : `${beat}a`;\n}\nfunction annotation(layer: Element, className: string, x: number, y: number, label: string): void {\n const text = document.createElementNS(SVG, 'text');\n text.setAttribute('x', x.toFixed(1)); text.setAttribute('y', y.toFixed(1)); text.setAttribute('text-anchor', 'middle');\n text.setAttribute('class', `annotation ${className}`); text.textContent = label; layer.appendChild(text);\n}\nfunction sourceIds(score: Score, event: ScoreNote): string[] {\n const mapped = score.document?.identity?.noteIdToSourceId?.[event.id];\n return [event.sourceId, mapped, event.id, ...event.pitches.map(p => p.sourceId)].filter((id): id is string => !!id);\n}\n/** Resolve the rendered event for a model note; a chord wins over any one of its noteheads. */\nfunction findNote(byId: Map<string, Element>, score: Score, event: ScoreNote): Element | undefined {\n for (const id of sourceIds(score, event)) {\n const target = byId.get(id);\n if (!target) continue;\n const related = target.closest('.chord') || target.closest('.note, .rest, .mRest, .multiRest');\n if (related) return related;\n }\n return undefined;\n}\n\nconst SVG_ELEMENTS = new Set(['svg', 'g', 'defs', 'symbol', 'use', 'path', 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'text', 'tspan', 'desc', 'title', 'style', 'clippath', 'mask', 'lineargradient', 'radialgradient', 'stop', 'pattern', 'marker', 'metadata']);\nconst SAFE_URL = /url\\(\\s*['\"]?(?!#)/i;\n/** Allowlist sanitizer: only static SVG drawing elements, local references and inert styles survive. */\nfunction sanitizeSvg(doc: XMLDocument): SVGSVGElement {\n if (doc.documentElement.namespaceURI !== SVG || doc.documentElement.localName !== 'svg') throw new Error('Verovio returned invalid SVG.');\n for (const element of Array.from(doc.querySelectorAll('*'))) {\n if (!element.isConnected && !doc.contains(element)) continue;\n if (element.namespaceURI !== SVG || !SVG_ELEMENTS.has(element.localName.toLowerCase())) { element.remove(); continue; }\n if (element.localName === 'style' && (/@import|javascript:|expression\\(/i.test(element.textContent || '') || SAFE_URL.test(element.textContent || ''))) { element.remove(); continue; }\n for (const attribute of Array.from(element.attributes)) {\n const name = attribute.name.toLowerCase();\n const value = attribute.value;\n if (name.startsWith('on')\n || ((name === 'href' || name.endsWith(':href')) && !value.startsWith('#'))\n || SAFE_URL.test(value) || /javascript:/i.test(value)) element.removeAttributeNode(attribute);\n }\n }\n return document.importNode(doc.documentElement, true) as unknown as SVGSVGElement;\n}\n\nconst naturalWidthOf = (svg: string) => Number(/viewBox=\"\\S+\\s+\\S+\\s+([\\d.]+)/.exec(svg)?.[1]) || Infinity;\nconst naturalHeightOf = (svg: string) => Number(/viewBox=\"[^\"]*?\\s([\\d.]+)\"/.exec(svg)?.[1]) || 1;\n/** Auto bars are an estimate: Verovio may still wrap a line inside a page. */\nconst wraps = (svg: string) => (svg.match(/class=\"system\"/g) || []).length > 1;\nconst yieldTask = () => new Promise<void>(resolve => setTimeout(resolve, 0));\n\ntype StaffBand = { top: number; bottom: number; center: number; laneTop: number; lines: boolean };\n/** One system block: drawn (`svg`) or a placeholder holding the size from layout data. */\ntype Slot = {\n index: number;\n block: HTMLElement;\n svg?: SVGSVGElement;\n /** Size in Verovio units: measured once drawn, estimated before. */\n naturalWidth: number; naturalHeight: number; estimated: boolean;\n scale: number;\n firstMeasure: number; measureCount: number;\n bands: Map<string, StaffBand>;\n points: NotePoint[]; measures: MeasureGeometry[];\n loading?: Promise<void>;\n /** Drawing failed; scrolling does not retry it (playback and zoom anchors ask again through ensureSystem). */\n failed?: boolean;\n};\n\n/**\n * Render from the original engraving document through the locally bundled WASM worker.\n *\n * Systems near the viewport are drawn; on a large score the rest are placeholders sized from layout data and are drawn\n * (and far ones released) as the reader scrolls, so DOM size and SVG work stay bounded. The first system comes from a\n * small first-measures document, so the first paint does not wait for the whole score's layout.\n */\nexport async function renderScore(\n container: HTMLElement, score: Score, mode: 'portrait' | 'landscape',\n showNames: boolean, showCounts: boolean, subdivisions: boolean,\n barsPerLine: 'auto' | number, showChordSymbols: boolean, inferChordSymbols: boolean,\n availableHeight = 0, zoom: number | 'fit' = 1, firstSystemGutter = 0, options: RenderOptions = {},\n): Promise<RenderResult> {\n // A caller passing the source Score with pitch options gets its view here (Reader passes `scoreForView`'s result).\n if (!score.pitchView) score = scoreForView(score, score.parts.some(part => part.pitchBasis === 'concert') ? 'concert' : options.scorePitch ?? 'written', options.transpose ?? options.semitones ?? 0, !!options.flip);\n const generation = options.generation ?? (latestGeneration.get(container) || 0) + 1;\n latestGeneration.set(container, generation);\n const isCurrent = () => latestGeneration.get(container) === generation;\n const superseded = () => new VerovioError('Superseded score render.', 'superseded');\n const document_ = score.document;\n if (!document_?.engravingBytes().length) throw new Error('This score has no engraving document.');\n const source: SourceDocument = document_;\n const channel = options.channel ?? 0;\n const info = await verovioBaseline(source, channel);\n if (!isCurrent()) throw superseded();\n const ticket = nextRenderTicket();\n const viewportWidth = Math.max(240, container.clientWidth);\n const count = Math.max(1, score.parts[0]?.measures.length || 1);\n const measureTotal = info.measureIds.length || count;\n // A chunked score is long or wide: Endless keeps one system only when that is still a small document.\n const endlessSingle = mode === 'landscape' && count <= ENDLESS_SINGLE_SYSTEM_LIMIT && !(info.chunked && score.parts.length * count > EAGER_STAFF_MEASURES);\n const minimumBar = Math.max(portraitMinimumBarWidth(score), lyricBarWidth(info.lyricDensity));\n const barFloor = Math.max(190, minimumBar);\n const hiddenIds = new Set(options.hiddenPartIds || []);\n // The gutter for a staff drawn at this zoom (staff pitch is unknown before layout, so this is an upper bound).\n const layoutGutter = (scale: number) => options.gutterFor ? Math.round(options.gutterFor(STAFF_UNITS * scale, Infinity)) : firstSystemGutter;\n // An explicit bar count (Vertical only). Without a user zoom it also sets the stave scale: that many bars fill the width.\n const explicitBars = mode === 'portrait' && barsPerLine !== 'auto' ? clampBarsPerLine(barsPerLine) : 0;\n const barsFit = explicitBars > 0 && zoom === 'fit';\n\n const { byPart: staffOf, engraved } = staffNumbers(info, score);\n let visibleParts = score.parts.filter(part => !hiddenIds.has(part.id) && staffOf.has(part.id));\n if (!visibleParts.length) visibleParts = score.parts.filter(part => staffOf.has(part.id)).slice(0, 1);\n const shown = new Set(visibleParts.map(part => staffOf.get(part.id)!));\n // Staves without a Score part (for example rest-only template parts that import dropped) are hidden reversibly here.\n const hiddenStaves = shown.size ? engraved.filter(n => !shown.has(n)) : [];\n if (!shown.size) visibleParts = score.parts;\n const visibleIndex = new Map(visibleParts.map((part, index) => [part.id, index]));\n\n // Annotation lanes sit under each staff (below lyrics); reserve room for them in the engraving.\n const annotated = visibleParts.filter(part => part.clef !== 'percussion' || showCounts);\n let nameRows = 0;\n if (showNames) { nameRows = 1; for (const part of annotated) for (const measure of part.measures) for (const note of measure.notes) nameRows = Math.max(nameRows, note.pitches.length); }\n const laneRows = nameRows + (showCounts ? 1 : 0);\n const laneHeight = laneRows ? LANE_GAP + laneRows * LANE_ROW + 4 : 0;\n const spacingStaff = Math.min(48, 12 + Math.ceil(laneHeight / 9) + (showChordSymbols && inferChordSymbols ? 2 : 0));\n\n // Transposition and spelling: the worker moves and respells the baseline (notation/mei-spelling.ts) with the plan\n // `scoreForView` used for this Score view, so the view is loaded untransposed.\n const spelling = spellingSpecFor(score, staffOf);\n // `natural`: one unbroken system at its natural width (Endless, and a Vertical score shorter than a full line).\n const verovioOptions = (pageWidth: number, natural = false): Record<string, unknown> => ({\n breaks: endlessSingle || natural ? 'none' : 'encoded', font: options.font || 'Bravura', fontFallback: 'Bravura',\n pageWidth: Math.min(100000, Math.max(100, Math.round(pageWidth))), pageHeight: 60000,\n pageMarginLeft: 25, pageMarginRight: 25, pageMarginTop: 20, pageMarginBottom: 20,\n adjustPageHeight: true, adjustPageWidth: mode === 'landscape' || natural, svgViewBox: true, scale: 100, xmlIdChecksum: true,\n spacingStaff, smuflTextFont: 'none', header: 'none', footer: 'none', svgAdditionalAttribute: ['staff@n', 'note@pname', 'note@oct'],\n ...musicFontOptions(options.font),\n });\n\n // Layout at a stave scale: Verovio lays out (viewport - gutter) / zoom units, so systems fill the viewport.\n type Layout = { zoom: number; bars: number; centred: boolean; natural: boolean; view: ViewSpec; pageCount: number; firstWidth: number; restWidth: number };\n const layoutAt = (scale: number, maxBars = Infinity): Layout => {\n const usableUnits = Math.max(180, viewportWidth - layoutGutter(scale)) / scale;\n const restUnits = viewportWidth / scale;\n const explicit = explicitBars > 0;\n const bars = mode === 'landscape' ? (endlessSingle ? count : info.chunked ? endlessChunkBars(visibleParts.length) : ENDLESS_CHUNK) : explicit ? explicitBars : Math.min(maxBars, autoBarsPerLine(usableUnits, score, minimumBar));\n // A score shorter than a full Auto line is not stretched to fill it: one system at Verovio's natural width, centred.\n const fullLine = Math.max(1, Math.min(AUTO_BAR_CAP, Math.floor((Math.max(240, usableUnits) - 56) / minimumBar)));\n const short = mode === 'portrait' && !explicit && count < fullLine;\n const view: ViewSpec = { breakEvery: endlessSingle ? 0 : bars, hiddenStaves, chordSymbols: showChordSymbols, spelling };\n // A bar never gets narrower than its minimum (the system is width-fitted instead). An explicit count at a user zoom is\n // not stretched past a comfortable width, so its systems stay narrower than the viewport and are centred. An explicit\n // count that sets the stave scale fills the width; a score shorter than one such line takes its share of it, centred.\n const shortOfLine = barsFit && count < bars;\n const least = systemMinimumWidth(shortOfLine ? count : bars, barFloor);\n const most = (units: number) => barsFit ? (shortOfLine ? units * count / bars : Infinity) : explicit ? bars * barFloor * 2 + 120 : Infinity;\n return { zoom: scale, bars, centred: (explicit && !barsFit) || shortOfLine || short, natural: short, view, pageCount: endlessSingle ? 1 : Math.ceil(measureTotal / bars),\n firstWidth: Math.max(least, Math.min(most(usableUnits), usableUnits)), restWidth: Math.max(least, Math.min(most(restUnits), restUnits)) };\n };\n const probe = async (layout: Layout, natural = false) => {\n const result = await probeVerovio(source, channel, ticket, layout.view, natural ? verovioOptions(layout.firstWidth, true) : verovioOptions(layout.firstWidth), layout.bars);\n if (!isCurrent()) throw superseded();\n return result.svg;\n };\n const restOptions = (layout: Layout) => verovioOptions(mode === 'landscape' ? 100000 : layout.restWidth);\n /** Serialize pages of the whole layout; `pages` are one-based. */\n const fetchPages = async (layout: Layout, pages: number[]) => {\n if (!pages.length) return new Map<number, string>();\n const result = await renderVerovioPages(source, channel, ticket, layout.view, restOptions(layout), pages);\n return new Map(result.pages.map(item => [item.page, item.svg]));\n };\n\n // 'fit' (the default zoom): Endless uses the device cap; Vertical fits DEFAULT_VERTICAL_BARS bars across the first\n // system, so Auto yields that many per line. The stave size depends on the viewport, not the score length: a shorter\n // score gets a shorter, centred system at the same size. Many staves are height-fitted below either.\n // An explicit bar count (no user zoom) fits that many bars instead, within BARS_FIT_MAX_STAVE_SCALE and STAVE_SCALE_MIN.\n const fitCap = mode === 'landscape' ? options.fitCap ?? 1\n : barsFit ? Math.max(STAVE_SCALE_MIN, Math.min(BARS_FIT_MAX_STAVE_SCALE, barFitZoom(viewportWidth, explicitBars, barFloor, layoutGutter)))\n : barFitZoom(viewportWidth, DEFAULT_VERTICAL_BARS, barFloor, layoutGutter);\n const shrinkZoom = (scale: number) => Math.max(STAVE_SCALE_MIN, Math.floor(scale * .9 * 1000) / 1000);\n const heightFit = (naturalHeight: number) => visibleParts.length > HEIGHT_FIT_STAVES && availableHeight > 0 ? Math.min(fitCap, availableHeight / naturalHeight) : fitCap;\n const eager = mode === 'landscape' ? endlessSingle || visibleParts.length * count <= EAGER_STAFF_MEASURES : visibleParts.length * count <= EAGER_STAFF_MEASURES;\n\n // Choose the layout. Vertical draws its first system from a probe of the first measures (cheap at any score length):\n // a short score as one natural-width system, a many-staff stack measured for the height fit, and Auto bars reduced\n // while the first line still wraps. Endless lays out the whole score.\n let layout: Layout;\n /** Page SVG by system index (a Vertical system 0 comes from the probe; system k >= 1 is page k + 1 of the whole layout). */\n let fetched = new Map<number, string>();\n let single = false;\n const scroller = container.closest<HTMLElement>('.score-viewport');\n const countOf = (candidate: Layout) => single ? 1 : candidate.pageCount;\n const pageOf = (system: number) => system + 1;\n const systemFor = (candidate: Layout, index: number) => single || endlessSingle ? 0 : Math.max(0, Math.min(countOf(candidate) - 1, Math.floor(index / candidate.bars)));\n // Which systems to draw before the first paint: all of them for a small score; otherwise those in view (from the\n // first system's size) and the zoom anchor's.\n const initialSystems = (candidate: Layout): number[] => {\n const total = countOf(candidate);\n if (eager) return Array.from({ length: total }, (_, index) => index);\n const wanted = new Set<number>([0]);\n if (options.focusMeasure !== undefined) { const focus = systemFor(candidate, options.focusMeasure); for (const index of [focus - 1, focus, focus + 1]) if (index >= 0 && index < total) wanted.add(index); }\n const sample = fetched.get(0);\n if (scroller && sample) {\n const zoomGuess = mode === 'landscape' ? candidate.zoom : Math.min(candidate.zoom, viewportWidth / Math.max(1, candidate.restWidth));\n const step = (mode === 'landscape' ? naturalWidthOf(sample) : naturalHeightOf(sample)) * zoomGuess || 1;\n const view = scroller.getBoundingClientRect(), own = container.getBoundingClientRect();\n const from = mode === 'landscape' ? view.left - own.left : view.top - own.top;\n const size = mode === 'landscape' ? scroller.clientWidth : scroller.clientHeight;\n const firstIndex = Math.max(0, Math.floor(from / step));\n const lastIndex = Math.min(total - 1, Math.ceil((from + size) / step));\n // At the top the first system (from the probe) is enough for the first paint; the rest of the view needs the\n // whole score's layout and is drawn right after. Scrolled further down, the systems in view are drawn first.\n if (firstIndex > 0) for (let index = firstIndex; index <= lastIndex; index++) wanted.add(index);\n }\n return [...wanted].sort((a, b) => a - b);\n };\n\n if (mode === 'landscape') {\n layout = layoutAt(zoom === 'fit' ? fitCap : zoom);\n // Endless: the first pages fix the zoom ('fit' fits the tallest drawn stack), then the rest follow the same scale.\n // A zoom anchor's chunk is drawn too, so the reader's place can be restored from its measure.\n const focus = options.focusMeasure !== undefined ? systemFor(layout, options.focusMeasure) : -1;\n const wanted = eager ? Array.from({ length: layout.pageCount }, (_, index) => index) : [...new Set([0, 1, focus])].filter(index => index >= 0 && index < layout.pageCount);\n const pages = await fetchPages(layout, wanted.map(pageOf));\n if (!isCurrent()) throw superseded();\n fetched = new Map([...pages].map(([page, svg]) => [page - 1, svg]));\n if (zoom === 'fit') layout.zoom = Math.round(heightFit(Math.max(...[...fetched.values()].map(naturalHeightOf))) * 1000) / 1000;\n } else {\n // The compact readability floor and the many-staff height fit size the default; an explicit bar count is the size.\n layout = layoutAt(zoom === 'fit' ? (barsFit ? fitCap : Math.max(options.fitFloor ?? 0, fitCap)) : zoom);\n let firstSvg = '';\n if (layout.natural) {\n firstSvg = await probe(layout, true);\n single = !wraps(firstSvg) && naturalWidthOf(firstSvg) <= layout.firstWidth + .5;\n }\n if (!single) {\n firstSvg = await probe(layout);\n // Vertical: the bar fit; many staves then measure the first system there and lay out again at the height fit.\n // The readability floor wins over both, so a compact default never draws an unreadably small staff.\n if (zoom === 'fit' && !barsFit && visibleParts.length > HEIGHT_FIT_STAVES) {\n const fitted = Math.max(options.fitFloor ?? 0, Math.round(heightFit(naturalHeightOf(firstSvg)) * 1000) / 1000);\n if (fitted < layout.zoom - .001) { layout = layoutAt(fitted); firstSvg = await probe(layout); }\n }\n }\n for (let attempt = 0; ; attempt++) {\n // The bar-width model is an estimate: while Verovio still wraps an Auto line inside a page, lay out with one bar fewer.\n while (!single && barsPerLine === 'auto' && layout.bars > 1 && wraps(firstSvg)) { layout = layoutAt(layout.zoom, layout.bars - 1); firstSvg = await probe(layout); }\n // An explicit count that sets the stave scale keeps its bars per line: a line that still wraps gets a smaller stave.\n for (let shrink = 0; !single && barsFit && shrink < 8 && layout.zoom > STAVE_SCALE_MIN && wraps(firstSvg); shrink++) { layout = layoutAt(shrinkZoom(layout.zoom)); firstSvg = await probe(layout); }\n fetched = new Map([[0, firstSvg]]);\n if (single) break;\n const pages = await fetchPages(layout, initialSystems(layout).filter(index => index > 0).map(pageOf));\n if (!isCurrent()) throw superseded();\n for (const [page, svg] of pages) fetched.set(page - 1, svg);\n if (barsFit && layout.zoom > STAVE_SCALE_MIN && [...pages.values()].some(wraps) && attempt < 8) { layout = layoutAt(shrinkZoom(layout.zoom)); firstSvg = await probe(layout); continue; }\n if (barsPerLine !== 'auto' || layout.bars <= 1 || ![...pages.values()].some(wraps) || attempt >= 8) break;\n layout = layoutAt(layout.zoom, layout.bars - 1);\n firstSvg = await probe(layout);\n }\n }\n const systemCount = countOf(layout);\n const systemOfMeasure = (index: number) => systemFor(layout, index);\n if (!isCurrent()) throw superseded();\n if (!fetched.size) throw new Error('Verovio did not produce a score page.');\n\n const textFont = options.textFont || 'Sans';\n const parseSvg = (text: string): SVGSVGElement => {\n const svg = sanitizeSvg(parseXml(text));\n const viewBox = (svg.getAttribute('viewBox') || '0 0 1000 200').split(/\\s+/).map(Number);\n // Pin the inner drawing so extending the outer viewBox for annotation lanes never rescales it.\n const inner = svg.querySelector(':scope > svg.definition-scale');\n if (inner) { inner.setAttribute('width', String(viewBox[2] || 1000)); inner.setAttribute('height', String(viewBox[3] || 200)); }\n svg.classList.add('score-svg');\n svg.dataset.textFont = textFont;\n svg.dataset.musicFont = options.font || 'Bravura';\n return svg;\n };\n /**\n * A large score's first paint draws the first system (and a zoom anchor's); other systems fetched with it are kept as\n * text and drawn by the pump one per task, so no main-thread task parses and measures several large systems at once.\n */\n const focusSystem = options.focusMeasure !== undefined ? systemFor(layout, options.focusMeasure) : -1;\n const stash = new Map<number, string>();\n if (!eager) for (const [index, text] of fetched) if (index !== 0 && index !== focusSystem) { stash.set(index, text); fetched.delete(index); }\n // Parse (and sanitize) the systems drawn now, then yield before inserting and measuring them.\n const parsed = new Map([...fetched].map(([index, text]) => [index, parseSvg(text)]));\n fetched.clear();\n if (!eager) {\n await yieldTask();\n if (!isCurrent()) throw superseded();\n }\n liveResults.get(container)?.dispose();\n\n // Build every block; drawn systems get their SVG, the rest stay placeholders until they scroll near.\n const slots: Slot[] = Array.from({ length: systemCount }, (_, index) => {\n const block = document.createElement('div');\n block.className = 'score-system is-pending';\n block.dataset.system = String(index);\n const firstMeasure = single || endlessSingle ? 0 : index * layout.bars;\n block.dataset.firstMeasure = String(firstMeasure + 1);\n const slot: Slot = { index, block, naturalWidth: 0, naturalHeight: 0, estimated: true, scale: 1, firstMeasure, measureCount: single || endlessSingle ? count : Math.min(layout.bars, measureTotal - firstMeasure), bands: new Map(), points: [], measures: [] };\n // A fetched system not drawn yet is sized from its laid-out SVG rather than estimated.\n const text = stash.get(index);\n const width = text ? naturalWidthOf(text) : Infinity;\n if (text && Number.isFinite(width)) { slot.naturalWidth = width; slot.naturalHeight = naturalHeightOf(text); slot.estimated = false; }\n return slot;\n });\n const attach = (slot: Slot, source: string | SVGSVGElement) => {\n const svg = typeof source === 'string' ? parseSvg(source) : source;\n const viewBox = (svg.getAttribute('viewBox') || '0 0 1000 200').split(/\\s+/).map(Number);\n slot.svg = svg; slot.naturalWidth = viewBox[2] || 1000; slot.naturalHeight = viewBox[3] || 200; slot.estimated = false;\n slot.block.classList.remove('is-pending');\n slot.block.replaceChildren(svg);\n };\n const fragment = document.createDocumentFragment();\n for (const slot of slots) {\n const svg = parsed.get(slot.index);\n if (svg) attach(slot, svg);\n fragment.appendChild(slot.block);\n }\n parsed.clear();\n container.replaceChildren(fragment);\n\n const measureIndexById = new Map(info.measureIds.map((id, index) => [id, index]));\n const pointsById = new Map<string, NotePoint>();\n const measuresByIndex = new Map<number, MeasureGeometry>();\n /** Staff bands, lanes, note and measure boxes of a drawn system, in its natural (Verovio) units. */\n const measureGeometry = (slot: Slot) => {\n const svg = slot.svg!;\n slot.bands = new Map();\n // Nothing below changes layout until the annotation layer is appended, so the root matrix is read once.\n let inverse: DOMMatrix | null = null;\n try { inverse = svg.getScreenCTM()?.inverse() ?? null; } catch { /* not rendered */ }\n const boxOf = (element: Element) => box(element, svg, inverse);\n // Staff bands from the first measure of the system, keyed by staff number.\n const measureElements = Array.from(svg.querySelectorAll('g.measure'));\n for (const staff of Array.from(measureElements[0]?.querySelectorAll(':scope > g.staff') || [])) {\n const n = staff.getAttribute('data-n'); if (!n) continue;\n const lines = Array.from(staff.querySelectorAll(':scope > path')).slice(0, 5).map(line => boxOf(line));\n const rect = lines.length ? null : boxOf(staff);\n const top = lines.length ? Math.min(...lines.map(line => line.y)) : rect!.y;\n const bottom = lines.length ? Math.max(...lines.map(line => line.y + line.height)) : rect!.y + rect!.height;\n slot.bands.set(n, { top, bottom, center: (top + bottom) / 2, laneTop: bottom, lines: lines.length > 1 });\n }\n // The lane goes below the staff and anything hanging under it: low notes, lyrics and below-staff directions.\n if (laneRows) {\n const ordered = [...slot.bands.entries()].sort((a, b) => a[1].top - b[1].top);\n const controls = Array.from(svg.querySelectorAll('g.measure > g.dynam, g.measure > g.hairpin, g.measure > g.dir, g.measure > g.pedal')).map(control => boxOf(control));\n ordered.forEach(([n, band], index) => {\n const nextTop = ordered[index + 1]?.[1].top ?? Infinity;\n let lowest = band.bottom;\n // Staff content includes ledger-line notes, stems, articulations and lyrics.\n for (const staff of Array.from(svg.querySelectorAll(`g.staff[data-n=\"${CSS.escape(n)}\"]`))) lowest = Math.max(lowest, boxOf(staff).bottom);\n for (const rect of controls) if (rect.height && rect.top >= band.bottom - 2 && rect.top < band.bottom + (nextTop - band.bottom) / 2) lowest = Math.max(lowest, rect.bottom);\n band.laneTop = lowest + LANE_GAP;\n });\n }\n const byId = new Map<string, Element>();\n for (const element of Array.from(svg.querySelectorAll('[id]'))) byId.set(element.id, element);\n const svgMeasureByIndex = new Map<number, Element>();\n const measureRects: { index: number; element: Element; rect: DOMRect }[] = [];\n measureElements.forEach((element, local) => {\n const index = measureIndexById.get(element.getAttribute('id') || '') ?? -1;\n if (index < 0) return;\n svgMeasureByIndex.set(index, element);\n measureRects.push({ index, element, rect: boxOf(element) });\n if (!local) slot.firstMeasure = index;\n });\n slot.measureCount = svgMeasureByIndex.size || slot.measureCount;\n slot.block.dataset.firstMeasure = String(slot.firstMeasure + 1);\n const layer = document.createElementNS(SVG, 'g');\n layer.setAttribute('class', 'reader-annotations');\n let laneBottom = 0;\n const notes: { element: Element; event: ScoreNote; partIndex: number; measure: number; x: number; y: number }[] = [];\n for (const part of visibleParts) {\n const partIndex = visibleIndex.get(part.id)!;\n const band = slot.bands.get(staffOf.get(part.id) || '');\n for (const [measureIndex, svgMeasure] of svgMeasureByIndex) {\n const measure = part.measures[measureIndex]?.index === measureIndex ? part.measures[measureIndex] : part.measures.find(item => item.index === measureIndex);\n if (!measure) continue;\n for (const event of measure.notes) {\n const element = findNote(byId, score, event);\n if (!element || !svgMeasure.contains(element)) continue;\n const anchor = element.querySelector('.notehead') || element;\n const rect = boxOf(anchor); const x = rect.x + rect.width / 2; const y = rect.y + rect.height / 2;\n element.classList.add('reader-note'); element.setAttribute('data-note-id', event.id);\n notes.push({ element, event, partIndex, measure: measure.index, x, y });\n if (!band) continue;\n const labelled = part.clef !== 'percussion';\n if (showNames && labelled) [...event.pitches].sort((a, b) => b.midi - a.midi).forEach((pitch, row) => annotation(layer, 'note-label', x, band.laneTop + LANE_ROW * (row + 1) - 4, pitch.step));\n if (showCounts) annotation(layer, 'count-label', x, band.laneTop + LANE_ROW * (nameRows + 1) - 4, beatLabel(event.start, subdivisions));\n if (laneRows) laneBottom = Math.max(laneBottom, band.laneTop + laneRows * LANE_ROW + 2);\n if (showChordSymbols && inferChordSymbols && !event.chordSymbol && labelled) {\n // Inferred names follow the view's key like the engraved chord symbols.\n const chord = inferChordSymbol(event.pitches); if (chord) annotation(layer, 'chord-symbol', x, band.top - 20, score.pitchView ? spellChordSymbol(chord, measureKey(part, measure, score)) : chord);\n }\n }\n }\n }\n svg.appendChild(layer);\n if (laneBottom > slot.naturalHeight) {\n slot.naturalHeight = Math.ceil(laneBottom + 4);\n const viewBox = (svg.getAttribute('viewBox') || '').split(/\\s+/).map(Number);\n svg.setAttribute('viewBox', `${viewBox[0] || 0} ${viewBox[1] || 0} ${slot.naturalWidth} ${slot.naturalHeight}`);\n }\n return { notes, measureRects };\n };\n\n // Staff controls scale with the first system's staves, and the first system fits beside the controls' gutter.\n const first = slots[0];\n const firstGeometry = measureGeometry(first);\n const firstBands = visibleParts.map(part => first.bands.get(staffOf.get(part.id) || '')).filter((band): band is StaffBand => !!band);\n const lined = firstBands.find(band => band.lines);\n const staffNatural = lined ? lined.bottom - lined.top : 72;\n const centers = firstBands.map(band => band.center).sort((a, b) => a - b);\n const pitchNatural = centers.slice(1).reduce((least, center, index) => Math.min(least, center - centers[index]), Infinity);\n // Systems draw at the stave scale; a portrait system is only width-fitted when its bars cannot fit at their minimum width.\n const widthLimitFor = (index: number, gutter: number) => index === 0 ? Math.max(180, viewportWidth - gutter) : viewportWidth;\n const scaleFor = (slot: Slot, gutter: number) => mode === 'portrait' ? Math.min(layout.zoom, widthLimitFor(slot.index, gutter) / slot.naturalWidth) : layout.zoom;\n let gutter = layoutGutter(layout.zoom);\n if (options.gutterFor) {\n // Gutter grows with the staff while a wider gutter shrinks a width-fitted staff; damped iteration settles in a few steps.\n for (let step = 0; step < 12; step++) {\n const scale = scaleFor(first, gutter);\n const next = options.gutterFor(staffNatural * scale, pitchNatural * scale);\n if (Math.abs(next - gutter) < .5) { gutter = next; break; }\n gutter = step < 2 ? next : (gutter + next) / 2;\n }\n gutter = Math.round(gutter);\n }\n\n /** Size estimate for a placeholder: Vertical systems span the layout width; heights follow the latest drawn system. */\n let reference = first;\n const estimate = (slot: Slot) => {\n if (mode === 'portrait') { slot.naturalWidth = Math.round(layout.restWidth); slot.naturalHeight = reference.naturalHeight; }\n else { slot.naturalWidth = first.naturalWidth * slot.measureCount / Math.max(1, first.measureCount); slot.naturalHeight = first.naturalHeight; }\n };\n /** Size and place a block; a size change above the viewport keeps the reader's place. */\n const place = (slot: Slot, keepPlace: boolean) => {\n if (slot.estimated) estimate(slot);\n const scale = slot.scale = scaleFor(slot, gutter);\n const { block } = slot;\n const width = slot.naturalWidth * scale, height = slot.naturalHeight * scale;\n const before = keepPlace && scroller ? block.getBoundingClientRect() : null;\n const view = before ? scroller!.getBoundingClientRect() : null;\n const oldSize = before ? (mode === 'landscape' ? before.width : before.height) : 0;\n block.style.width = `${width}px`;\n block.style.height = `${height}px`;\n const minLeft = slot.index === 0 ? gutter : 0;\n // Portrait systems end flush with the viewport; explicit bar counts and short scores narrower than it are centred.\n const left = mode === 'landscape' ? minLeft : layout.centred ? Math.max(minLeft, (viewportWidth - width) / 2) : Math.max(minLeft, viewportWidth - width);\n block.style.marginLeft = left ? `${Math.floor(left)}px` : '';\n if (slot.svg) { slot.svg.style.width = `${width}px`; slot.svg.style.height = `${height}px`; }\n if (before && view) {\n const delta = (mode === 'landscape' ? width : height) - oldSize;\n const above = mode === 'landscape' ? before.right <= view.left + 1 : before.bottom <= view.top + 1;\n if (delta && above) { if (mode === 'landscape') scroller!.scrollLeft += delta; else scroller!.scrollTop += delta; }\n }\n };\n /** Scaled note and measure geometry of a drawn system, indexed for lookups. */\n const record = (slot: Slot, geometry: ReturnType<typeof measureGeometry>) => {\n const { scale, block } = slot;\n const blockTop = block.offsetTop;\n slot.measures = geometry.measureRects.map(({ index, element, rect }) => ({ index, system: slot.index, x: rect.x * scale, width: rect.width * scale, y: blockTop + rect.y * scale, height: rect.height * scale, element }));\n slot.points = geometry.notes.map(note => ({ id: note.event.id, measure: note.measure, part: note.partIndex, start: note.event.start, duration: note.event.duration, rest: note.event.rest, x: note.x * scale, y: blockTop + note.y * scale, element: note.element, sourceId: note.event.sourceId, system: slot.index }));\n for (const measure of slot.measures) measuresByIndex.set(measure.index, measure);\n for (const point of slot.points) pointsById.set(point.id, point);\n };\n const release = (slot: Slot) => {\n if (!slot.svg) return;\n for (const measure of slot.measures) if (measuresByIndex.get(measure.index) === measure) measuresByIndex.delete(measure.index);\n for (const point of slot.points) if (pointsById.get(point.id) === point) pointsById.delete(point.id);\n slot.points = []; slot.measures = []; slot.svg = undefined;\n slot.block.replaceChildren();\n slot.block.classList.add('is-pending');\n };\n\n // Geometry of the systems drawn now (each needs the gutter, which needs the first), then sizes for all blocks.\n const drawn = slots.filter(slot => slot.svg);\n const geometries = new Map(drawn.map(slot => [slot, slot === first ? firstGeometry : measureGeometry(slot)]));\n const rest = drawn.find(slot => slot.index > 0);\n if (rest) reference = rest;\n for (const slot of slots) place(slot, false);\n for (const [slot, geometry] of geometries) record(slot, geometry);\n\n let disposed = false;\n const listeners = new Set<() => void>();\n let notifyQueued = false;\n const notify = () => {\n if (notifyQueued) return;\n notifyQueued = true;\n queueMicrotask(() => { notifyQueued = false; if (!disposed) for (const listener of listeners) listener(); });\n };\n const alive = () => !disposed && isCurrent();\n\n // On-demand drawing: an observer marks systems near the viewport, a pump draws them nearest first (a couple of pages\n // per worker request, one system per task), and systems far away are released back to placeholders.\n const near = new Set<number>();\n let pumping = false;\n const distance = (slot: Slot) => {\n if (!scroller) return slot.index;\n const view = scroller.getBoundingClientRect(), rect = slot.block.getBoundingClientRect();\n return mode === 'landscape' ? Math.abs((rect.left + rect.right) / 2 - (view.left + view.right) / 2) : Math.abs((rect.top + rect.bottom) / 2 - (view.top + view.bottom) / 2);\n };\n const draw = async (wanted: Slot[]) => {\n // A Vertical first system is laid out beside the staff controls, so it comes from the first-measures probe again.\n const reprobe = mode === 'portrait' && wanted.some(slot => slot.index === 0);\n // Systems fetched for the first paint but not drawn then are drawn from their kept SVG.\n const kept = new Map<number, string>();\n for (const slot of wanted) { const text = stash.get(slot.index); if (text) { kept.set(pageOf(slot.index), text); stash.delete(slot.index); } }\n const pages = await fetchPages(layout, wanted.filter(slot => !(reprobe && slot.index === 0) && !kept.has(pageOf(slot.index))).map(slot => pageOf(slot.index)));\n for (const [page, text] of kept) pages.set(page, text);\n if (reprobe) pages.set(pageOf(0), await probe(layout, single));\n for (const slot of wanted) {\n const text = pages.get(pageOf(slot.index));\n if (!alive()) return;\n if (!text || slot.svg) continue;\n attach(slot, text);\n const geometry = measureGeometry(slot);\n if (slot.index > 0 && mode === 'portrait') reference = slot;\n place(slot, true);\n record(slot, geometry);\n notify();\n await yieldTask();\n }\n };\n /**\n * A superseded draw means another render or another score's import owns the worker now. Drawing pauses rather than\n * retrying at once (the rejection can come back in the same microtask turn, which would starve the event loop) and\n * tries again later a bounded number of times, in case this score stays on screen (for example a failed import).\n */\n let supersededDraws = 0;\n let stalled = false;\n let retryTimer = 0;\n const SUPERSEDED_RETRIES = 4;\n const load = (wanted: Slot[]) => {\n const promise = draw(wanted).then(() => { supersededDraws = 0; }, error => {\n // A renderer restarted twice under the draw (other readers running out of memory) stalls the same way.\n if (isSuperseded(error) || isRestarted(error)) { stalled = true; return; }\n if (!alive()) return;\n for (const slot of wanted) if (!slot.svg) slot.failed = true;\n console.warn('Could not draw a score system:', error);\n });\n for (const slot of wanted) slot.loading = promise.finally(() => { slot.loading = undefined; });\n return promise;\n };\n const pump = async () => {\n if (pumping || !alive()) return;\n pumping = true;\n try {\n while (alive()) {\n const pendingSlots = [...near].map(index => slots[index]).filter(slot => !slot.svg && !slot.loading && !slot.failed);\n if (!pendingSlots.length) break;\n pendingSlots.sort((a, b) => distance(a) - distance(b));\n await load(pendingSlots.slice(0, PAGE_BATCH));\n if (stalled) {\n stalled = false;\n if (++supersededDraws <= SUPERSEDED_RETRIES) retryTimer = window.setTimeout(() => void pump(), 1000 * supersededDraws);\n break;\n }\n }\n } finally { pumping = false; }\n };\n const observers: IntersectionObserver[] = [];\n let observeTimer = 0;\n if (!eager && systemCount > 1 && typeof IntersectionObserver !== 'undefined') {\n const margin = (screens: number) => mode === 'landscape' ? `0px ${screens * 100}%` : `${screens * 100}% 0px`;\n const nearObserver = new IntersectionObserver(entries => {\n for (const entry of entries) {\n const index = Number((entry.target as HTMLElement).dataset.system);\n if (entry.isIntersecting) near.add(index); else near.delete(index);\n }\n void pump();\n }, { root: scroller, rootMargin: margin(NEAR_SCREENS) });\n const keepObserver = new IntersectionObserver(entries => {\n let released = false;\n for (const entry of entries) {\n if (entry.isIntersecting) continue;\n const slot = slots[Number((entry.target as HTMLElement).dataset.system)];\n if (slot?.svg && !slot.loading) { release(slot); released = true; }\n }\n if (released) notify();\n }, { root: scroller, rootMargin: margin(KEEP_SCREENS) });\n observers.push(nearObserver, keepObserver);\n // Observing thousands of blocks (and their first callbacks) is real work: it starts after the first paint's task,\n // a batch per task, nearest the start first.\n const OBSERVE_BATCH = 1500;\n const observeFrom = (start: number) => {\n observeTimer = 0;\n if (disposed) return;\n for (const slot of slots.slice(start, start + OBSERVE_BATCH)) { nearObserver.observe(slot.block); keepObserver.observe(slot.block); }\n if (start + OBSERVE_BATCH < slots.length) observeTimer = window.setTimeout(() => observeFrom(start + OBSERVE_BATCH), 0);\n };\n observeTimer = window.setTimeout(() => observeFrom(0), 0);\n }\n\n const firstSystem = (): SystemGeometry => geometryOf(first);\n const geometryOf = (slot: Slot): SystemGeometry => ({ index: slot.index, firstMeasure: slot.firstMeasure, measureCount: slot.measureCount, width: slot.naturalWidth * slot.scale, height: slot.naturalHeight * slot.scale, rendered: !!slot.svg,\n staffCenters: visibleParts.map(part => (slot.bands.get(staffOf.get(part.id) || '')?.center ?? (slot.svg ? NaN : first.bands.get(staffOf.get(part.id) || '')?.center ?? NaN)) * slot.scale) });\n const head = firstSystem();\n const firstCenters = head.staffCenters.map((center, index) => Number.isFinite(center) ? center : (head.staffCenters[index - 1] ?? 0) + 80 * first.scale);\n const result: RenderResult = {\n systemSize: layout.bars, staffCenters: firstCenters, scale: first.scale, visiblePartIds: visibleParts.map(part => part.id),\n barWidth: Math.max(1, head.width) / Math.max(1, head.measureCount || layout.bars), systemHeight: head.height,\n stavePx: staffNatural * first.scale, staffPitchPx: pitchNatural * first.scale, gutter, zoom: layout.zoom,\n get systems() { return slots.map(geometryOf); },\n get points() { return slots.flatMap(slot => slot.points); },\n get measures() { return slots.flatMap(slot => slot.measures); },\n point: id => pointsById.get(id),\n measure: index => measuresByIndex.get(index),\n systemOfMeasure,\n ensureSystem: async index => {\n const slot = slots[index];\n if (!slot || slot.svg || !alive()) return;\n slot.failed = false;\n await (slot.loading || load([slot]));\n },\n onChange: listener => { listeners.add(listener); return () => listeners.delete(listener); },\n dispose: () => {\n if (disposed) return;\n disposed = true;\n window.clearTimeout(retryTimer);\n window.clearTimeout(observeTimer);\n for (const observer of observers) observer.disconnect();\n listeners.clear();\n if (liveResults.get(container) === result) liveResults.delete(container);\n },\n };\n liveResults.set(container, result);\n return result;\n}\n","/**\n * Staff-control sizing. Every dimension of a `.part-control` (instrument icon,\n * name font, focus and hide buttons) and the first-system control gutter is derived from\n * the rendered five-line staff height in CSS px, so controls keep a constant\n * ratio to the stave across zoom, width fit, many-staff height fit and\n * Vertical/Endless. Clamps keep them legible and inside their staff's band.\n */\nexport type PartControlMetrics = { stavePx: number; icon: number; font: number; eye: number; height: number; gutter: number };\nexport type PartControlLimits = {\n /** Smallest distance between adjacent staff centres (px); controls never grow past it. */\n staffPitchPx?: number;\n /** Largest gutter the viewport can spare (px). */\n maxGutter?: number;\n /** How many small buttons (focus, hide) each control carries. */\n buttons?: number;\n};\n\n/** Icon and name font as a fraction of the five-line staff height (double the original 28px icon / 11px name on a 72px staff). */\nexport const ICON_RATIO = 56 / 72;\nexport const FONT_RATIO = 22 / 72;\nconst ICON_MIN = 22, ICON_MAX = 104;\nconst FONT_MIN = 11, FONT_MAX = 30;\nconst EYE_MIN = 24, EYE_MAX = 40;\nconst PAD = 8, GAP = 4;\n/** Room for roughly nine characters of part name before it ellipsizes. */\nconst NAME_EMS = 5;\n\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\n\nexport function partControlMetrics(stavePx: number, { staffPitchPx = Infinity, maxGutter = Infinity, buttons = 0 }: PartControlLimits = {}): PartControlMetrics {\n const s = Number.isFinite(stavePx) && stavePx > 0 ? stavePx : 72;\n // Adjacent controls must not overlap: cap the control height a little under the staff pitch.\n const room = Number.isFinite(staffPitchPx) && staffPitchPx > 0 ? Math.max(18, staffPitchPx - 4) : Infinity;\n const icon = Math.round(Math.min(room, clamp(s * ICON_RATIO, ICON_MIN, ICON_MAX)));\n const font = Math.round(Math.min(room * .6, clamp(s * FONT_RATIO, FONT_MIN, FONT_MAX)) * 10) / 10;\n const eyeSize = buttons > 0 ? Math.round(Math.min(room, clamp(icon * .7, EYE_MIN, EYE_MAX))) : 0;\n const fixed = PAD + icon + GAP + buttons * (GAP + eyeSize);\n const gutter = Math.round(Math.max(fixed + font * 2, Math.min(maxGutter, fixed + font * NAME_EMS)));\n return { stavePx: s, icon, font, eye: eyeSize, height: Math.max(icon, eyeSize, Math.ceil(font * 1.3)), gutter };\n}\n","/**\n * Header controls registry.\n *\n * Maintainers: edit this list to reorder header controls or move them between\n * tiers. Array order is render order. `primary` controls always sit inline in\n * the header; `secondary` controls sit inline above MOBILE_HEADER_BREAKPOINT\n * and move into the \"More controls\" dropdown at or below it. PepperScore.tsx maps\n * each id to its element; every control is always rendered (`bars` is disabled outside Vertical view, `keyFlip` when the key has no enharmonic) so the\n * header footprint never depends on client-only state.\n */\nexport type HeaderControlId = 'stop' | 'play' | 'openFile' | 'bpm' | 'transpose' | 'keyFlip' | 'mode' | 'bars' | 'staveScale' | 'mixer';\nexport type HeaderControlTier = 'primary' | 'secondary';\nexport type HeaderControlConfig = { id: HeaderControlId; tier: HeaderControlTier };\n\nexport const HEADER_CONTROLS = [\n { id: 'stop', tier: 'primary' },\n { id: 'play', tier: 'primary' },\n { id: 'openFile', tier: 'primary' },\n { id: 'mode', tier: 'primary' },\n { id: 'bpm', tier: 'secondary' },\n { id: 'transpose', tier: 'secondary' },\n { id: 'keyFlip', tier: 'secondary' },\n { id: 'bars', tier: 'secondary' },\n { id: 'staveScale', tier: 'secondary' },\n { id: 'mixer', tier: 'secondary' },\n] as const satisfies readonly HeaderControlConfig[];\n\n/** Reader root width (px) at or below which secondary controls collapse into the \"More controls\" dropdown (`@container pepperscore (max-width:760px)` in styles.css). */\nexport const MOBILE_HEADER_BREAKPOINT = 760;\n\n/** Stave scale (zoom) bounds shared by the header slider and pinch zoom live with the defaults in stave-scale.ts. */\nexport { clampStaveScale, STAVE_SCALE_MAX, STAVE_SCALE_MIN, STAVE_SCALE_STEP } from './stave-scale';\n\n/** Which `controls` key shows each header control (see chrome.ts). */\nexport const HEADER_CONTROL_GROUP: Record<HeaderControlId, 'transport' | 'viewToggle' | 'openFile' | 'zoom' | 'mixer'> = {\n stop: 'transport', play: 'transport', bpm: 'transport', transpose: 'transport', keyFlip: 'transport', bars: 'transport',\n mode: 'viewToggle', openFile: 'openFile', staveScale: 'zoom', mixer: 'mixer',\n};\n","/** Chrome presets (docs/specs/pepperscore-embeddable-component.md, \"Chrome presets\") and per-control overrides. No runtime imports. */\nexport type ChromePreset = 'full' | 'minimal' | 'none';\nexport type PepperScoreControls = Partial<Record<'mixer' | 'openFile' | 'drawer' | 'transport' | 'viewToggle' | 'zoom', boolean>>;\nexport type ResolvedChrome = {\n header: boolean; transport: boolean; viewToggle: boolean; openFile: boolean; mixer: boolean; drawer: boolean; zoom: boolean;\n /** The overlaid play/stop button of `minimal`. */\n compactPlay: boolean;\n /** Playhead, note highlight and follow. */\n playhead: boolean;\n /** Part icons, instrument picker and stave eyes (they follow `mixer`). */\n partControls: boolean;\n /** Whether playback (and so any audio asset) can load at all. */\n audio: boolean;\n};\n\n/**\n * `transport` covers stop, play, BPM, transpose, key flip and bars; `viewToggle` the Vertical/Endless toggle; `openFile` the\n * Open button, file input, open dialog and reopen offer; `mixer` the mixer and the part icons / instrument picker / stave\n * eyes; `zoom` the stave-scale slider, pinch zoom and the page arrows row; `drawer` the bottom drawer and its handle.\n */\nexport function resolveChrome(preset: ChromePreset = 'full', controls: PepperScoreControls = {}): ResolvedChrome {\n const on = (key: keyof PepperScoreControls) => controls[key] ?? preset === 'full';\n const transport = on('transport'), viewToggle = on('viewToggle'), openFile = on('openFile'), mixer = on('mixer'), drawer = on('drawer'), zoom = on('zoom');\n return {\n header: transport || viewToggle || openFile || mixer || zoom,\n transport, viewToggle, openFile, mixer, drawer, zoom,\n compactPlay: preset === 'minimal' && !transport,\n playhead: preset !== 'none' || transport,\n partControls: mixer,\n audio: preset !== 'none' || transport,\n };\n}\n","/**\n * Per-score memory: a small IndexedDB store of FileState v2 records keyed by source hash.\n *\n * Database `scoreflow` by default (`dbName`; storage.ts uses the reader's persist namespace), object store `scores`\n * (key path `source.sha256`, index `lastOpened`). localStorage keys carry `keyPrefix` (default `scoreflow`).\n * The first read of a hash falls back to the localStorage v1 record and imports it; the\n * v1 copy is removed after the next successful IndexedDB write. When IndexedDB is\n * unavailable (private mode, blocked) records go to localStorage instead. All access is\n * wrapped in try/catch, writes are debounced and never block rendering, and only the most\n * recently opened MAX_SCORE_RECORDS scores are kept. Only settings and hashes are stored.\n *\n * Write-ahead: an IndexedDB transaction started while the page unloads may never complete, so\n * `persistPending()` (called on pagehide / visibilitychange→hidden) synchronously copies queued\n * records to localStorage `scoreflow-pending-v2:<hash>` and still kicks the IndexedDB write. A read\n * prefers a pending copy newer than the stored record, persists it, and the pending key is removed\n * after the next successful write.\n */\nimport type { Score } from './score';\nimport { legacyStorageKey, migrateFileState, parseFileState, parseLegacyFileState, textSource, type FileSource, type FileState } from './file-state';\nimport { deviceClass, type DeviceClass } from './stave-scale';\n\nexport const SCORE_DB_NAME = 'scoreflow';\nexport const SCORE_STORE = 'scores';\nexport const MAX_SCORE_RECORDS = 200;\nexport const SCORE_WRITE_DEBOUNCE_MS = 400;\n\nexport type ScoreDbOptions = {\n /** IndexedDB factory; `null` forces the localStorage fallback. Defaults to `globalThis.indexedDB`. */\n indexedDB?: Pick<IDBFactory, 'open'> | null;\n /** Fallback and legacy storage; `null` disables it. Defaults to `globalThis.localStorage`. */\n storage?: Storage | null;\n dbName?: string;\n /** Prefix of the localStorage keys (`<prefix>-file-v2:`, `<prefix>-pending-v2:`, legacy `<prefix>-file-v1:`). Defaults to `scoreflow`. */\n keyPrefix?: string;\n maxRecords?: number;\n debounceMs?: number;\n /** Device class a migrated v1 zoom is attributed to. */\n device?: () => DeviceClass;\n};\nexport type ScoreDb = {\n read(source: FileSource): Promise<FileState | null>;\n /** Queue a record; writes for the same hash within the debounce window coalesce. */\n write(state: FileState): void;\n /** Write every queued record now. */\n flush(): Promise<void>;\n /** Synchronously save queued records to the localStorage write-ahead keys, then start writing them. For page unload. */\n persistPending(): void;\n keys(): Promise<string[]>;\n backend(): Promise<'indexeddb' | 'localstorage' | 'none'>;\n};\n\nconst settle = <T>(request: IDBRequest<T>) => new Promise<T>((resolve, reject) => { request.onsuccess = () => resolve(request.result); request.onerror = () => reject(request.error); });\nconst done = (transaction: IDBTransaction) => new Promise<void>((resolve, reject) => { transaction.oncomplete = () => resolve(); transaction.onerror = transaction.onabort = () => reject(transaction.error || new Error('IndexedDB transaction failed.')); });\n\nexport function createScoreDb(options: ScoreDbOptions = {}): ScoreDb {\n const dbName = options.dbName ?? SCORE_DB_NAME;\n const maxRecords = options.maxRecords ?? MAX_SCORE_RECORDS;\n const debounceMs = options.debounceMs ?? SCORE_WRITE_DEBOUNCE_MS;\n const device = options.device ?? deviceClass;\n const prefix = options.keyPrefix ?? 'scoreflow';\n const fallbackPrefix = `${prefix}-file-v2:`;\n const fallbackKey = (hash: string) => `${fallbackPrefix}${hash}`;\n const pendingKey = (hash: string) => `${prefix}-pending-v2:${hash}`;\n const legacyKey = (hash: string) => legacyStorageKey(hash, prefix);\n const storage = (): Storage | null => {\n if (options.storage !== undefined) return options.storage;\n try { return globalThis.localStorage ?? null; } catch { return null; }\n };\n let opening: Promise<IDBDatabase | null> | undefined;\n const open = () => opening ??= new Promise<IDBDatabase | null>(resolve => {\n try {\n const factory = options.indexedDB !== undefined ? options.indexedDB : globalThis.indexedDB;\n if (!factory) { resolve(null); return; }\n const request = factory.open(dbName, 1);\n request.onupgradeneeded = () => {\n const store = request.result.createObjectStore(SCORE_STORE, { keyPath: 'source.sha256' });\n store.createIndex('lastOpened', 'lastOpened');\n };\n request.onsuccess = () => {\n const db = request.result;\n db.onversionchange = () => { db.close(); opening = undefined; };\n resolve(db);\n };\n request.onerror = () => resolve(null);\n request.onblocked = () => resolve(null);\n } catch { resolve(null); }\n });\n\n const readLocal = (hash: string): FileState | null => {\n try { return parseFileState(storage()?.getItem(fallbackKey(hash)), hash); } catch { return null; }\n };\n const readLegacy = (hash: string): FileState | null => {\n try {\n const legacy = parseLegacyFileState(storage()?.getItem(legacyKey(hash)), hash);\n return legacy && migrateFileState(legacy, device());\n } catch { return null; }\n };\n const writeLocal = (state: FileState): boolean => {\n const store = storage();\n if (!store) return false;\n try {\n store.setItem(fallbackKey(state.source.sha256), JSON.stringify(state));\n const records = localKeys(store).map(hash => ({ hash, lastOpened: readLocal(hash)?.lastOpened ?? 0 })).sort((a, b) => a.lastOpened - b.lastOpened);\n for (const { hash } of records.slice(0, Math.max(0, records.length - maxRecords))) store.removeItem(fallbackKey(hash));\n return true;\n } catch { return false; /* Storage may be full or unavailable; the session still works. */ }\n };\n const localKeys = (store: Storage) => {\n const hashes: string[] = [];\n for (let index = 0; index < store.length; index++) { const key = store.key(index); if (key?.startsWith(fallbackPrefix)) hashes.push(key.slice(fallbackPrefix.length)); }\n return hashes;\n };\n\n /** A write-ahead copy for `hash`, when valid: its state and when it was queued. */\n const readPending = (hash: string): { updatedAt: number; state: FileState } | null => {\n try {\n const raw = JSON.parse(storage()?.getItem(pendingKey(hash)) || 'null');\n const state = raw && Number.isFinite(raw.updatedAt) ? parseFileState(raw.state, hash) : null;\n return state ? { updatedAt: raw.updatedAt, state } : null;\n } catch { return null; }\n };\n const dropPending = (hash: string) => { try { storage()?.removeItem(pendingKey(hash)); } catch { /* ignore */ } };\n /** Newest of the stored record and a pending write-ahead copy; a newer pending copy is queued to be persisted. */\n const withPending = (hash: string, stored: FileState | null): FileState | null => {\n const pending = readPending(hash);\n if (!pending) return stored;\n if (stored && stored.lastOpened >= pending.updatedAt) { dropPending(hash); return stored; }\n queue(pending.state);\n return structuredClone(pending.state);\n };\n const writeDb = async (db: IDBDatabase, state: FileState) => {\n const transaction = db.transaction(SCORE_STORE, 'readwrite');\n const store = transaction.objectStore(SCORE_STORE);\n store.put(state);\n const count = await settle(store.count());\n if (count > maxRecords) {\n let excess = count - maxRecords;\n const cursor = store.index('lastOpened').openCursor();\n await new Promise<void>((resolve, reject) => {\n cursor.onsuccess = () => {\n const current = cursor.result;\n if (!current || excess <= 0) { resolve(); return; }\n if (current.primaryKey !== state.source.sha256) { current.delete(); excess--; }\n current.continue();\n };\n cursor.onerror = () => reject(cursor.error);\n });\n }\n await done(transaction);\n };\n\n const pending = new Map<string, FileState>();\n let timer: ReturnType<typeof setTimeout> | undefined;\n let flushing: Promise<void> = Promise.resolve();\n const flushNow = async () => {\n clearTimeout(timer); timer = undefined;\n const batch = [...pending.values()];\n pending.clear();\n if (!batch.length) return;\n const db = await open();\n for (const state of batch) {\n if (db) {\n try {\n await writeDb(db, state);\n // The legacy copy (and any fallback copy) is dropped once IndexedDB holds the record.\n try { storage()?.removeItem(legacyKey(state.source.sha256)); storage()?.removeItem(fallbackKey(state.source.sha256)); } catch { /* ignore */ }\n dropPending(state.source.sha256);\n continue;\n } catch { /* fall back below */ }\n }\n if (writeLocal(state)) dropPending(state.source.sha256);\n }\n };\n const flush = () => (flushing = flushing.then(flushNow, flushNow));\n const queue = (state: FileState) => {\n pending.set(state.source.sha256, structuredClone(state));\n clearTimeout(timer);\n if (debounceMs <= 0) void flush();\n else timer = setTimeout(() => void flush(), debounceMs);\n };\n\n return {\n async read(source) {\n const hash = source.sha256;\n const queued = pending.get(hash);\n if (queued) return structuredClone(queued);\n const db = await open();\n if (db) {\n try {\n const stored = await settle(db.transaction(SCORE_STORE, 'readonly').objectStore(SCORE_STORE).get(hash));\n const state = stored === undefined ? null : parseFileState(stored, hash);\n if (state) return withPending(hash, state);\n } catch { /* fall back to localStorage */ }\n }\n return withPending(hash, readLocal(hash) ?? readLegacy(hash));\n },\n write: queue,\n flush,\n persistPending() {\n if (!pending.size) return;\n const updatedAt = Date.now();\n for (const state of pending.values()) {\n try { storage()?.setItem(pendingKey(state.source.sha256), JSON.stringify({ updatedAt, state })); } catch { /* storage full or unavailable */ }\n }\n void flush();\n },\n async keys() {\n const db = await open();\n if (db) {\n try { return (await settle(db.transaction(SCORE_STORE, 'readonly').objectStore(SCORE_STORE).getAllKeys())).map(String); }\n catch { /* fall through */ }\n }\n const store = storage();\n return store ? localKeys(store) : [];\n },\n async backend() { return (await open()) ? 'indexeddb' : storage() ? 'localstorage' : 'none'; },\n };\n}\n\n/** The app-wide store; IndexedDB opens lazily on first use. */\nexport const scoreDb = createScoreDb();\n\n/** Stable identity of the built-in sample: its engraving text with its format prefix. */\nexport const sampleSource = (score: Score): FileSource => textSource(score.document?.format || 'sample', score.document?.originalText || '', score.title || 'Sample score');\n","/**\n * The last opened score file, kept on this device so the reader can offer to reopen it after a reload or crash\n * (docs/specs/large-score-performance.md, Phase 3 \"Guardrails\"). It is never opened automatically.\n *\n * Database `<namespace>-last-file` (`scoreflow-last-file` for the Scoreflow names, see storage.ts), object store\n * `last-file` with two out-of-line keys: `info` (name, type, size, lastModified, savedAt) and `bytes` (the\n * original file bytes, stored as the Blob itself so a large file is not read\n * and cloned on the main thread; an ArrayBuffer is also accepted), written in one transaction, so the\n * offer can be shown without loading the bytes. Only files up to MAX_SCORE_FILE_BYTES are kept. Every access is\n * wrapped in try/catch: without IndexedDB (private mode, blocked) nothing is remembered and nothing throws.\n */\nimport { MAX_SCORE_FILE_BYTES } from './mxl';\n\nexport const LAST_FILE_DB_NAME = 'scoreflow-last-file';\nexport const LAST_FILE_STORE = 'last-file';\nconst INFO_KEY = 'info';\nconst BYTES_KEY = 'bytes';\n\nexport type LastFileInfo = { name: string; type: string; size: number; lastModified: number; savedAt: number };\nexport type LastFileRecord = LastFileInfo & { bytes: Blob | ArrayBuffer };\n\nconst settle = <T>(request: IDBRequest<T>) => new Promise<T>((resolve, reject) => { request.onsuccess = () => resolve(request.result); request.onerror = () => reject(request.error); });\nconst done = (transaction: IDBTransaction) => new Promise<void>((resolve, reject) => { transaction.oncomplete = () => resolve(); transaction.onerror = transaction.onabort = () => reject(transaction.error || new Error('IndexedDB transaction failed.')); });\n\nconst isInfo = (value: unknown): value is LastFileInfo => {\n const info = value as LastFileInfo | null;\n return !!info && typeof info.name === 'string' && typeof info.type === 'string' && Number.isFinite(info.size) && Number.isFinite(info.lastModified) && Number.isFinite(info.savedAt);\n};\nconst infoOf = (info: LastFileInfo): LastFileInfo => ({ name: info.name, type: info.type, size: info.size, lastModified: info.lastModified, savedAt: info.savedAt });\n/** Whether `file` is the remembered one (same name, type, size and modification time). */\nexport const isSameFile = (info: LastFileInfo | null, file: Pick<File, 'name' | 'type' | 'size' | 'lastModified'>) =>\n !!info && info.name === file.name && info.type === file.type && info.size === file.size && info.lastModified === file.lastModified;\n\n/** A File for the normal open path, rebuilt from a remembered record. */\nexport const lastFileToFile = (record: LastFileRecord) => new File([record.bytes], record.name, { type: record.type, lastModified: record.lastModified });\n\n/** The last-file store of one persist namespace (see storage.ts). Every method resolves and never rejects. */\nexport type LastFileStore = {\n /** The remembered file's details, without its bytes; null when there is none or storage is unavailable. */\n readInfo(): Promise<LastFileInfo | null>;\n /** The remembered file with its bytes; null when there is none, it is incomplete, or storage is unavailable. */\n read(): Promise<LastFileRecord | null>;\n /**\n * Remember `file` (its original bytes) as the last opened file, replacing any previous one. Files above\n * MAX_SCORE_FILE_BYTES are not kept. Resolves to the stored details, or null when nothing was stored.\n */\n remember(file: File): Promise<LastFileInfo | null>;\n /** Delete the remembered file. */\n forget(): Promise<void>;\n};\nconst disabled: LastFileStore = { readInfo: async () => null, read: async () => null, remember: async () => null, forget: async () => {} };\n\n/** The store in database `dbName` (LAST_FILE_DB_NAME for the Scoreflow names); `null` remembers nothing. */\nexport function createLastFileStore(dbName: string | null): LastFileStore {\n if (!dbName) return disabled;\n let opening: Promise<IDBDatabase | null> | undefined;\n const open = (): Promise<IDBDatabase | null> => opening ??= new Promise<IDBDatabase | null>(resolve => {\n try {\n const factory = globalThis.indexedDB;\n if (!factory) { resolve(null); return; }\n const request = factory.open(dbName, 1);\n request.onupgradeneeded = () => { request.result.createObjectStore(LAST_FILE_STORE); };\n request.onsuccess = () => {\n const db = request.result;\n db.onversionchange = () => { db.close(); opening = undefined; };\n resolve(db);\n };\n request.onerror = () => resolve(null);\n request.onblocked = () => resolve(null);\n } catch { resolve(null); }\n }).then(db => { if (!db) opening = undefined; return db; });\n\n return {\n async readInfo() {\n try {\n const db = await open();\n if (!db) return null;\n const value = await settle(db.transaction(LAST_FILE_STORE, 'readonly').objectStore(LAST_FILE_STORE).get(INFO_KEY));\n return isInfo(value) ? infoOf(value) : null;\n } catch { return null; }\n },\n async read() {\n try {\n const db = await open();\n if (!db) return null;\n const store = db.transaction(LAST_FILE_STORE, 'readonly').objectStore(LAST_FILE_STORE);\n const [info, bytes] = await Promise.all([settle(store.get(INFO_KEY)), settle(store.get(BYTES_KEY))]);\n if (!isInfo(info) || !(bytes instanceof Blob || bytes instanceof ArrayBuffer)) return null;\n return { ...infoOf(info), bytes };\n } catch { return null; }\n },\n async remember(file) {\n try {\n if (file.size > MAX_SCORE_FILE_BYTES) return null;\n const db = await open();\n if (!db) return null;\n // The File itself is stored: IndexedDB keeps a Blob without the page reading or cloning its bytes.\n const bytes: Blob = file;\n const info: LastFileInfo = { name: file.name, type: file.type, size: file.size, lastModified: file.lastModified, savedAt: Date.now() };\n const transaction = db.transaction(LAST_FILE_STORE, 'readwrite');\n const store = transaction.objectStore(LAST_FILE_STORE);\n store.put(bytes, BYTES_KEY);\n store.put(info, INFO_KEY);\n await done(transaction);\n return info;\n } catch { return null; }\n },\n async forget() {\n try {\n const db = await open();\n if (!db) return;\n const transaction = db.transaction(LAST_FILE_STORE, 'readwrite');\n transaction.objectStore(LAST_FILE_STORE).clear();\n await done(transaction);\n } catch { /* nothing to forget */ }\n },\n };\n}\n","import { createScoreDb, type ScoreDb } from './score-db';\nimport { createLastFileStore, type LastFileStore } from './last-file';\n\n/**\n * Where a reader keeps its state: `persist` names the namespace (`<ns>-prefs`, `<ns>-file-v2:<hash>`, IndexedDB `<ns>` and\n * `<ns>-last-file`, sessionStorage `<ns>-reopen-dismissed`). `persist=\"scoreflow\"` gives exactly the original Scoreflow\n * names, so existing visitors keep their settings. `false` reads and writes nothing.\n *\n * Not namespaced: the diagnostic and test hooks `scoreflow-chunking`, `scoreflow-simulate-oom` (verovio-runtime.ts) and\n * `scoreflow-large-file-bytes` (large-file.ts). Set by tests or by hand (the reader only clears\n * `scoreflow-simulate-oom` once it fires), they are diagnostics exempt from `persist`.\n */\nexport type PersistNamespace = string | false;\nexport type ReaderStorage = {\n namespace: PersistNamespace;\n readPrefs(): unknown;\n writePrefs(prefs: object): void;\n reopenDismissed(): boolean;\n dismissReopen(): void;\n scoreDb: ScoreDb;\n lastFile: LastFileStore;\n};\n\nconst stores = new Map<string, ReaderStorage>();\nconst none: ReaderStorage = {\n namespace: false,\n readPrefs: () => null, writePrefs: () => {}, reopenDismissed: () => false, dismissReopen: () => {},\n scoreDb: createScoreDb({ indexedDB: null, storage: null }),\n lastFile: createLastFileStore(null),\n};\n\n/** The storage of a namespace, one per namespace for the page (readers sharing a namespace share its stores). */\nexport function readerStorage(ns: PersistNamespace): ReaderStorage {\n if (ns === false || !ns.trim()) return none;\n let store = stores.get(ns);\n if (!store) {\n const prefsKey = `${ns}-prefs`, dismissedKey = `${ns}-reopen-dismissed`;\n store = {\n namespace: ns,\n readPrefs: () => { try { return JSON.parse(localStorage.getItem(prefsKey) || 'null'); } catch { return null; } },\n writePrefs: prefs => { try { localStorage.setItem(prefsKey, JSON.stringify(prefs)); } catch { /* storage full or blocked */ } },\n reopenDismissed: () => { try { return sessionStorage.getItem(dismissedKey) === '1'; } catch { return false; } },\n dismissReopen: () => { try { sessionStorage.setItem(dismissedKey, '1'); } catch { /* hidden for this page only */ } },\n scoreDb: createScoreDb({ dbName: ns, keyPrefix: ns }),\n lastFile: createLastFileStore(`${ns}-last-file`),\n };\n stores.set(ns, store);\n }\n return store;\n}\n","/** One AudioContext and master compressor for every reader on the page, and one playing reader at a time. */\nexport type SharedAudio = { context: AudioContext; master: DynamicsCompressorNode };\nlet shared: SharedAudio | undefined;\n\n/** The page's audio graph, created on first use; null when the device has no Web Audio (playback then runs silently). */\nexport function getSharedAudio(): SharedAudio | null {\n if (shared && shared.context.state !== 'closed') return shared;\n let context: AudioContext;\n try { context = new AudioContext(); } catch { return null; }\n const master = context.createDynamicsCompressor();\n master.threshold.value = -15; master.knee.value = 12; master.ratio.value = 4; master.attack.value = .003; master.release.value = .18;\n master.connect(context.destination);\n return shared = { context, master };\n}\n\nconst RESUME_TIMEOUT_MS = 1000;\n/** AudioContext.resume() can stay pending forever (no output device, autoplay policy), so give it a bounded wait. */\nexport async function resumeAudio(context: AudioContext): Promise<boolean> {\n if (context.state === 'running') return true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try { await Promise.race([context.resume(), new Promise(resolve => { timer = setTimeout(resolve, RESUME_TIMEOUT_MS); })]); }\n catch { /* a rejected resume means no sound */ }\n finally { clearTimeout(timer); }\n return (context.state as AudioContextState) === 'running'; // re-read: resume() changes it\n}\n\nexport type PlaybackOwner = { stop(): void };\nlet owner: PlaybackOwner | null = null;\n/** Starting playback in one reader stops whichever other reader is playing (also in silent wall-clock playback). */\nexport function claimPlayback(next: PlaybackOwner): void {\n if (owner && owner !== next) owner.stop();\n owner = next;\n}\nexport function releasePlayback(who: PlaybackOwner): void {\n if (owner === who) owner = null;\n}\n","/**\n * Large-score guardrail: a non-blocking \"this will take a while\" notice with an expected wait (see\n * docs/specs/large-score-performance.md, Phase 3 \"Guardrails\"). The estimate is a deliberately simple linear model;\n * its constants are named so they can be recalibrated against the e2e perf probe.\n */\nimport { formatMb } from './mxl';\n\nconst MB = 1024 * 1024;\n/** Files at or above this many bytes get the large-score notice as soon as they are chosen. */\nexport const LARGE_FILE_BYTES = 8 * MB;\n/** Scores at or above this many staff-measures (parts × measures) get the notice once the score is known. */\nexport const LARGE_SCORE_STAFF_MEASURES = 2400;\n/**\n * Test / tuning override: `localStorage['scoreflow-large-file-bytes']` (a positive number of bytes) replaces\n * LARGE_FILE_BYTES, so validation can trigger the notice with a small fixture. A diagnostic hook: un-namespaced and\n * exempt from `persist` (storage.ts).\n */\nexport const LARGE_FILE_BYTES_OVERRIDE_KEY = 'scoreflow-large-file-bytes';\n/**\n * Desktop open time per MB of score file, in seconds: [optimistic, pessimistic]. Calibrated on the Phase 3 e2e probe\n * (12-core desktop): 12.5 MB orchestral 3.3 s, 31.6 MB orchestral 4.1 s, 31.9 MB ensemble 3.6 s to first paint.\n */\nexport const DESKTOP_SECONDS_PER_MB: readonly [number, number] = [0.08, 0.2];\n/** Fixed desktop overhead (worker start, WASM load, first layout), in seconds. */\nexport const OPEN_BASE_SECONDS = 1.5;\n/** Phones and tablets take this many times as long as a desktop. */\nexport const PHONE_SLOWDOWN = 2.5;\n/** File bytes a staff-measure is treated as (orchestral MusicXML runs about 1.6 KB), when the score is what makes it large (a compressed .mxl). */\nexport const BYTES_PER_STAFF_MEASURE = 1.5 * 1024;\n\n/** The byte threshold in effect (LARGE_FILE_BYTES unless overridden in localStorage). */\nexport function largeFileBytes(): number {\n try {\n const override = Number(globalThis.localStorage?.getItem(LARGE_FILE_BYTES_OVERRIDE_KEY));\n if (Number.isFinite(override) && override > 0) return override;\n } catch { /* storage blocked: use the default */ }\n return LARGE_FILE_BYTES;\n}\nexport const isLargeFile = (bytes: number) => bytes >= largeFileBytes();\n/** Staves × measures: what engraving cost scales with. */\nexport const staffMeasures = (score: { parts: ReadonlyArray<{ measures: ArrayLike<unknown> }> }) =>\n score.parts.length * Math.max(0, ...score.parts.map(part => part.measures.length));\nexport const isLargeScore = (score: { parts: ReadonlyArray<{ measures: ArrayLike<unknown> }> }) => staffMeasures(score) >= LARGE_SCORE_STAFF_MEASURES;\n\n/** Expected seconds to open a score file of `bytes`: a [low, high] range, whole seconds, low ≥ 1. */\nexport function estimateOpenSeconds(bytes: number, { phone = false }: { phone?: boolean } = {}): [number, number] {\n const mb = Math.max(0, bytes) / MB;\n const factor = phone ? PHONE_SLOWDOWN : 1;\n const low = (OPEN_BASE_SECONDS + mb * DESKTOP_SECONDS_PER_MB[0]) * factor;\n const high = (OPEN_BASE_SECONDS + mb * DESKTOP_SECONDS_PER_MB[1]) * factor;\n const roundedLow = Math.max(1, Math.round(low));\n return [roundedLow, Math.max(roundedLow, Math.ceil(high))];\n}\n\n/**\n * The notice text, e.g. \"Large score (31.6 MB). Opening may take about 10–20 seconds on this device.\" When the score's\n * staff-measures are known and imply a longer wait than its bytes, the estimate follows them.\n */\nexport function largeScoreMessage(bytes: number, { phone = false, staffMeasures: cells }: { phone?: boolean; staffMeasures?: number } = {}): string {\n const equivalent = Math.max(bytes, (cells ?? 0) * BYTES_PER_STAFF_MEASURE);\n const [low, high] = estimateOpenSeconds(equivalent, { phone });\n const size = cells && cells * BYTES_PER_STAFF_MEASURE > bytes ? `${cells.toLocaleString('en')} staff-bars` : formatMb(bytes);\n const wait = low === high ? `about ${low} second${low === 1 ? '' : 's'}` : `about ${low}–${high} seconds`;\n return `Large score (${size}). Opening may take ${wait} on this device.`;\n}\n","/**\n * Score file discovery for the Open dialog: which files the reader can open, and\n * how dropped files and folders are enumerated (bounded, so a huge folder can't hang the page).\n */\nexport type ScoreFormat = 'MusicXML' | 'MIDI' | 'MEI' | 'ABC';\nexport type ScoreFileCandidate = { file: File; path: string; format: ScoreFormat };\nexport type CollectedScoreFiles = { candidates: ScoreFileCandidate[]; unsupported: string[]; truncated: boolean };\n\n/** The accept list for file inputs; importFile() dispatches on the same extensions. */\nexport const SCORE_FILE_ACCEPT = '.xml,.musicxml,.mxl,.mid,.midi,.mei,.abc,.txt';\nexport const FOLDER_MAX_DEPTH = 4;\nexport const FOLDER_MAX_ENTRIES = 500;\n/** Plain .txt files found in folders are only offered when they look like ABC; only this much is read to check. */\nconst TXT_SNIFF_BYTES = 65_536;\n\nconst EXTENSION_FORMATS: Array<[RegExp, ScoreFormat]> = [\n [/\\.(musicxml|xml|mxl)$/i, 'MusicXML'],\n [/\\.(mid|midi)$/i, 'MIDI'],\n [/\\.mei$/i, 'MEI'],\n [/\\.(abc|txt)$/i, 'ABC'],\n];\n\nexport const scoreFormatOf = (name: string): ScoreFormat | null => EXTENSION_FORMATS.find(([pattern]) => pattern.test(name))?.[1] ?? null;\n\n/** ABC tunes need a key field (K:), which ends the header; that is enough to tell ABC from prose. */\nexport const looksLikeAbc = (text: string) => /^\\s*K:/m.test(text);\n\n// Minimal structural types for the File and Directory Entries API; entries are duck-typed so tests can mock them.\ntype FsEntry = { isFile: boolean; isDirectory: boolean; name: string; fullPath?: string };\ntype FsFileEntry = FsEntry & { file(success: (file: File) => void, failure?: (error: unknown) => void): void };\ntype FsDirectoryEntry = FsEntry & { createReader(): { readEntries(success: (entries: FsEntry[]) => void, failure?: (error: unknown) => void): void } };\n\nconst entryFile = (entry: FsFileEntry) => new Promise<File>((resolve, reject) => entry.file(resolve, reject));\nconst readBatch = (reader: ReturnType<FsDirectoryEntry['createReader']>) => new Promise<FsEntry[]>((resolve, reject) => reader.readEntries(resolve, reject));\nconst trimPath = (path: string) => path.replace(/^\\/+/, '');\n\nasync function keepTxt(file: File) {\n try { return looksLikeAbc(await file.slice(0, TXT_SNIFF_BYTES).text()); }\n catch { return false; }\n}\n\nclass Collector {\n candidates: ScoreFileCandidate[] = [];\n unsupported: string[] = [];\n truncated = false;\n seen = 0;\n constructor(private readonly fromFolder: (path: string) => boolean) {}\n full() {\n if (this.seen >= FOLDER_MAX_ENTRIES) { this.truncated = true; return true; }\n return false;\n }\n async add(file: File, path: string) {\n this.seen++;\n const format = scoreFormatOf(file.name);\n // Inside a folder, unsupported files and prose .txt files are skipped silently; a directly dropped one is reported.\n const inFolder = this.fromFolder(path);\n if (!format) { if (!inFolder) this.unsupported.push(file.name); return; }\n if (inFolder && /\\.txt$/i.test(file.name) && !await keepTxt(file)) return;\n this.candidates.push({ file, path, format });\n }\n async walk(entry: FsEntry, depth: number): Promise<void> {\n if (this.full()) return;\n const path = trimPath(entry.fullPath || entry.name);\n if (entry.isFile) {\n try { await this.add(await entryFile(entry as FsFileEntry), path); }\n catch { /* unreadable file: skip it */ }\n return;\n }\n if (!entry.isDirectory) return;\n this.seen++;\n if (depth >= FOLDER_MAX_DEPTH) { this.truncated = true; return; }\n const reader = (entry as FsDirectoryEntry).createReader();\n // readEntries returns results in batches (100 in Chromium) until an empty batch.\n for (;;) {\n let batch: FsEntry[];\n try { batch = await readBatch(reader); } catch { return; }\n if (!batch.length) return;\n for (const child of batch) {\n if (this.full()) return;\n await this.walk(child, depth + 1);\n }\n }\n }\n result(): CollectedScoreFiles {\n const candidates = [...this.candidates].sort((a, b) => a.path.localeCompare(b.path, undefined, { numeric: true, sensitivity: 'base' }));\n return { candidates, unsupported: this.unsupported, truncated: this.truncated };\n }\n}\n\n/**\n * Collects score files from a drop. Directory entries must be taken synchronously inside the drop\n * handler (the DataTransfer is emptied afterwards), so callers pass the DataTransfer straight in\n * and this snapshots it before awaiting anything.\n */\nexport function collectDroppedScoreFiles(data: DataTransfer): Promise<CollectedScoreFiles> {\n const items = Array.from(data.items || []).filter(item => item.kind === 'file');\n const entries = items.map(item => (item as DataTransferItem & { webkitGetAsEntry?: () => FsEntry | null }).webkitGetAsEntry?.() ?? null);\n const files = Array.from(data.files || []);\n const collector = new Collector(path => path.includes('/'));\n return (async () => {\n if (entries.length && entries.every(Boolean)) {\n for (const entry of entries as FsEntry[]) await collector.walk(entry, 0);\n } else {\n // No entry API: plain files only (a dropped folder then shows up as an unreadable \"file\" and is skipped).\n for (const file of files.slice(0, FOLDER_MAX_ENTRIES)) await collector.add(file, file.name);\n if (files.length > FOLDER_MAX_ENTRIES) collector.truncated = true;\n }\n return collector.result();\n })();\n}\n","/**\n * System-aware paging for Vertical mode. A page is a scroll position whose viewport shows whole systems: it starts at\n * a system top (less a small pad) and holds as many complete systems as fit. Overhang repeats the last systems of the\n * previous page at the top of the next, but only while at least one new complete system still fits below them.\n * A system taller than the viewport is a tall page: it is stepped through a viewport at a time.\n */\nexport type SystemSpan = { top: number; bottom: number };\n/** `first..last` are the systems wholly in view at `start`; a tall page shows part of system `first` (=== `last`). */\nexport type ReadingPage = { start: number; first: number; last: number; tall: boolean };\n\n/** Space kept above a page's first system; the previous system's bottom margin is blank at least this far. */\nexport const PAGE_PAD_PX = 8;\n/** Overlap between consecutive steps through a system taller than the viewport. */\nexport const TALL_PAGE_OVERLAP_PX = 48;\n/** Scroll positions this close count as the same page. */\nexport const PAGE_EPSILON_PX = 2;\n\nexport function systemPages(systems: SystemSpan[], viewHeight: number, overlap: number, pad = PAGE_PAD_PX, tallOverlap = TALL_PAGE_OVERLAP_PX): ReadingPage[] {\n const n = systems.length;\n if (!n || viewHeight <= 0) return [{ start: 0, first: 0, last: n - 1, tall: false }];\n const fits = (index: number, start: number) => systems[index].bottom <= start + viewHeight + .5;\n const topOf = (index: number) => Math.max(0, systems[index].top - pad);\n const pages: ReadingPage[] = [];\n // The first page shows the title; when the first system does not fit below it, the first page starts at that system.\n let first = 0;\n let start = fits(0, 0) ? 0 : topOf(0);\n for (let next = 0; next < n;) {\n let last = next - 1;\n while (last + 1 < n && fits(last + 1, start)) last++;\n if (last < next) {\n // A system taller than the viewport: step through it, ending with its bottom in view.\n const end = Math.max(start, systems[next].bottom + pad - viewHeight);\n const step = Math.max(40, viewHeight - tallOverlap);\n for (let at = start; ; at = Math.min(end, at + step)) {\n pages.push({ start: at, first: next, last: next, tall: true });\n if (at >= end - .5) break;\n }\n next++;\n if (next < n) { first = next; start = topOf(next); }\n continue;\n }\n pages.push({ start, first, last, tall: false });\n next = last + 1;\n if (next >= n) break;\n // Overhang: repeat up to `overlap` systems, dropping them until one new complete system fits.\n let repeat = Math.max(0, Math.min(overlap, next - first));\n while (repeat > 0 && !fits(next, topOf(next - repeat))) repeat--;\n first = next - repeat;\n start = topOf(first);\n }\n return pages;\n}\n\n/** Distinct page starts in scroll order. */\nexport const pageStarts = (pages: ReadingPage[]) => [...new Set(pages.map(page => Math.round(page.start)))].sort((a, b) => a - b);\n\n/** The page start a turn moves to from `current`: the next start below it, or the last start above it (else the top). */\nexport function turnTarget(pages: ReadingPage[], current: number, direction: number, epsilon = PAGE_EPSILON_PX): number | null {\n const starts = pageStarts(pages);\n if (direction > 0) return starts.find(start => start > current + epsilon) ?? null;\n return [...starts].reverse().find(start => start < current - epsilon) ?? (current > epsilon ? 0 : null);\n}\n\n/** The first page that shows system `index` whole (or the first step of it when it is tall). */\nexport const pageOfSystem = (pages: ReadingPage[], index: number) => pages.find(page => page.first <= index && index <= page.last) ?? null;\n","/**\n * Opening a score from a public URL (PepperScore's `scoreUrl` prop; the demo maps `?score=<url>` to it). The file is\n * downloaded here and then opened through the reader's normal file path, so its format is read from its name.\n */\nimport { formatMb, MAX_SCORE_FILE_BYTES } from './mxl';\nimport { scoreFormatOf } from './score-files';\n\n/** File extensions for score media types, for URLs whose path has no score extension. */\nconst MEDIA_EXTENSIONS: Array<[RegExp, string]> = [\n [/^application\\/vnd\\.recordare\\.musicxml$/, '.mxl'],\n [/musicxml|^(application|text)\\/xml$/, '.musicxml'],\n [/^(audio\\/(x-)?midi|audio\\/mid)$/, '.mid'],\n [/mei/, '.mei'],\n [/abc|^text\\/plain$/, '.abc'],\n];\n\n/** A file name for the download: the URL's own name when it has a score extension, else one from the media type. */\nexport function remoteFileName(url: URL, contentType: string): string {\n const raw = url.pathname.split('/').filter(Boolean).pop() || '';\n let last = raw;\n try { last = decodeURIComponent(raw); } catch { /* a malformed escape: keep the name as written */ }\n if (last && scoreFormatOf(last)) return last;\n const type = contentType.split(';')[0].trim().toLowerCase();\n const extension = MEDIA_EXTENSIONS.find(([pattern]) => pattern.test(type))?.[1];\n if (!extension) throw new Error('This link doesn’t point to a MusicXML, MIDI, MEI or ABC file.');\n return `${(last || url.hostname).replace(/\\.[^.]*$/, '') || 'score'}${extension}`;\n}\n\n/** Download a public score as a File. Only http(s) links are fetched, and a score larger than the open limit is refused. */\nexport async function fetchScoreFile(link: string, base: string, signal?: AbortSignal): Promise<File> {\n let url: URL;\n // Resolved against the page, so a site-relative path works too.\n try { url = new URL(link, base); } catch { throw new Error('The score link isn’t a valid URL.'); }\n if (url.protocol !== 'https:' && url.protocol !== 'http:') throw new Error('Scores can only be opened from http or https links.');\n let response: Response;\n try { response = await fetch(url, { signal, credentials: 'omit' }); }\n catch (e) {\n if (signal?.aborted) throw e;\n // A network failure and a CORS refusal look the same from here.\n throw new Error(`The score at ${url.host} couldn’t be downloaded. Check the link, and that its server allows other sites to load it (CORS).`);\n }\n if (!response.ok) throw new Error(`The score at ${url.host} couldn’t be downloaded (${response.status}${response.statusText ? ` ${response.statusText}` : ''}).`);\n const tooLarge = (bytes: number) => new Error(`This score is ${formatMb(bytes)}; scores up to ${formatMb(MAX_SCORE_FILE_BYTES)} can be opened.`);\n const declared = Number(response.headers.get('content-length'));\n if (declared > MAX_SCORE_FILE_BYTES) throw tooLarge(declared);\n const name = remoteFileName(new URL(response.url || url.href), response.headers.get('content-type') || '');\n const blob = await response.blob();\n if (blob.size > MAX_SCORE_FILE_BYTES) throw tooLarge(blob.size);\n return new File([blob], name, { type: blob.type });\n}\n","import { useEffect, useId, useRef, useState } from 'react';\nimport { ChevronLeft, FileMusic, FolderOpen, Upload, X } from 'lucide-react';\nimport { collectDroppedScoreFiles, FOLDER_MAX_ENTRIES, looksLikeAbc, type CollectedScoreFiles, type ScoreFileCandidate } from '../lib/score-files';\nimport './open-score-dialog.css';\n\nexport type OpenScoreDialogProps = {\n onClose(): void;\n /** Opens one file through the reader's normal import path. */\n onOpenFile(file: File): void;\n /** Opens pasted ABC text through the reader's normal ABC path. */\n onOpenAbc(text: string): void;\n /** Shows the reader's own file picker. */\n onBrowse(): void;\n};\n\nconst FORMATS = [\n { name: 'MusicXML', detail: '.musicxml, .xml, compressed .mxl' },\n { name: 'MIDI', detail: '.mid, .midi' },\n { name: 'MEI', detail: '.mei' },\n { name: 'ABC notation', detail: '.abc, .txt, or paste' },\n] as const;\nconst TIP = 'Paste ABC notation here, or drop a score file or a folder of scores.';\nconst NOT_ABC = 'This doesn’t look like ABC notation yet: a tune needs a K: (key) line, e.g. K:C.';\nconst hasFiles = (data: DataTransfer | null) => Boolean(data && Array.from(data.types || []).includes('Files'));\nconst FOCUSABLE = 'button:not([disabled]), textarea, input:not([type=file]):not([disabled]), [href], [tabindex]:not([tabindex=\"-1\"])';\n\n/** \"Open a score\" modal: format guide, file browsing, and one box that takes pasted ABC or dropped files and folders. */\nexport default function OpenScoreDialog({ onClose, onOpenFile, onOpenAbc, onBrowse }: OpenScoreDialogProps) {\n const headingId = useId();\n const tipId = useId();\n const panelRef = useRef<HTMLElement>(null);\n const textRef = useRef<HTMLTextAreaElement>(null);\n const dragDepth = useRef(0);\n const [abc, setAbc] = useState('');\n const [dragging, setDragging] = useState(false);\n const [scanning, setScanning] = useState(false);\n const [message, setMessage] = useState('');\n const [choices, setChoices] = useState<ScoreFileCandidate[] | null>(null);\n const [truncated, setTruncated] = useState(false);\n\n // Focus the entry box on open; hand focus back to whatever opened the dialog on close.\n useEffect(() => {\n const opener = document.activeElement as HTMLElement | null;\n textRef.current?.focus();\n return () => { if (opener?.isConnected) opener.focus(); };\n }, []);\n useEffect(() => {\n const key = (event: KeyboardEvent) => {\n // Only while focus is in this dialog's reader (a click on dialog text can leave it on the reader root):\n // another reader on the page keeps its own keys.\n if (!panelRef.current?.closest('.pepperscore')?.contains(document.activeElement)) return;\n if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); onClose(); return; }\n if (event.key !== 'Tab' || !panelRef.current) return;\n // Keep Tab inside the dialog.\n const focusable = [...panelRef.current.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(element => element.offsetParent !== null);\n if (!focusable.length) return;\n const first = focusable[0], last = focusable[focusable.length - 1];\n if (event.shiftKey && (document.activeElement === first || !panelRef.current.contains(document.activeElement))) { event.preventDefault(); last.focus(); }\n else if (!event.shiftKey && (document.activeElement === last || !panelRef.current.contains(document.activeElement))) { event.preventDefault(); first.focus(); }\n };\n document.addEventListener('keydown', key, true);\n return () => document.removeEventListener('keydown', key, true);\n }, [onClose]);\n\n const open = (file: File) => { onClose(); onOpenFile(file); };\n const settle = ({ candidates, unsupported, truncated: cut }: CollectedScoreFiles, folder: boolean) => {\n setScanning(false);\n setTruncated(cut);\n if (candidates.length === 1 && !cut) { open(candidates[0].file); return; }\n if (candidates.length > 1 || (candidates.length === 1 && cut)) { setChoices(candidates); setMessage(''); return; }\n setChoices(null);\n if (unsupported.length) setMessage(`${unsupported.length === 1 ? `“${unsupported[0]}” isn’t` : `${unsupported.length} files aren’t`} a supported score. Choose a MusicXML, MIDI, MEI or ABC file.`);\n else setMessage(folder ? 'No MusicXML, MIDI, MEI or ABC files were found in that folder.' : 'Nothing to open there. Drop a MusicXML, MIDI, MEI or ABC file.');\n };\n const scan = (work: Promise<CollectedScoreFiles>, folder: boolean) => {\n setScanning(true); setMessage(''); setChoices(null);\n work.then(result => settle(result, folder), () => { setScanning(false); setMessage('Those files couldn’t be read. Try choosing them with Browse files.'); });\n };\n const submitAbc = () => {\n const text = abc.trim();\n if (!text) return;\n if (!looksLikeAbc(text)) { setMessage(NOT_ABC); textRef.current?.focus(); return; }\n onClose(); onOpenAbc(text);\n };\n\n const dragProps = {\n onDragEnter: (event: React.DragEvent) => { if (!hasFiles(event.dataTransfer)) return; event.preventDefault(); dragDepth.current++; setDragging(true); },\n onDragOver: (event: React.DragEvent) => { if (!hasFiles(event.dataTransfer)) return; event.preventDefault(); event.dataTransfer.dropEffect = 'copy'; },\n onDragLeave: (event: React.DragEvent) => { if (!hasFiles(event.dataTransfer)) return; dragDepth.current = Math.max(0, dragDepth.current - 1); if (!dragDepth.current) setDragging(false); },\n onDrop: (event: React.DragEvent) => {\n if (!hasFiles(event.dataTransfer)) return; // plain text dropped into the box inserts as usual\n event.preventDefault();\n dragDepth.current = 0; setDragging(false);\n const folder = Array.from(event.dataTransfer.items || []).some(item => (item as DataTransferItem & { webkitGetAsEntry?: () => { isDirectory: boolean } | null }).webkitGetAsEntry?.()?.isDirectory);\n scan(collectDroppedScoreFiles(event.dataTransfer), folder);\n },\n };\n\n const messageIsHint = message === NOT_ABC;\n return <div className={`open-dialog-backdrop ${dragging ? 'is-drag-over' : ''}`} onMouseDown={event => { if (event.target === event.currentTarget) onClose(); }} {...dragProps}>\n <section ref={panelRef} tabIndex={-1} className=\"open-dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby={headingId}>\n <div className=\"open-dialog-heading\">\n <div className=\"open-dialog-title\"><FolderOpen className=\"open-dialog-title-icon\" size={18}/><h2 id={headingId} className=\"open-dialog-title-text\">Open a score</h2></div>\n <button className=\"icon-button open-dialog-close\" aria-label=\"Close open score dialog\" onClick={onClose}><X size={19}/></button>\n </div>\n <p className=\"open-dialog-intro\">Scoreflow reads these notation formats. Everything stays on this device.</p>\n <ul className=\"open-dialog-formats\" aria-label=\"Supported formats\">{FORMATS.map(format => <li key={format.name} className=\"open-dialog-format\"><span className=\"open-dialog-format-name\">{format.name}</span><span className=\"open-dialog-format-detail\">{format.detail}</span></li>)}</ul>\n\n {choices ? <div className=\"open-dialog-choices\">\n <div className=\"open-dialog-choices-heading\">\n <h3 className=\"open-dialog-choices-title\">Choose a score <span className=\"open-dialog-choices-count\">{choices.length} found</span></h3>\n <button className=\"text-action open-dialog-choices-back\" onClick={() => { setChoices(null); setTruncated(false); textRef.current?.focus(); }}><ChevronLeft size={15}/> Back</button>\n </div>\n {truncated && <p className=\"open-dialog-choices-note\">Only the first {FOLDER_MAX_ENTRIES} items (four folders deep) were searched.</p>}\n <ul className=\"open-dialog-choice-list\" aria-label=\"Scores found\">{choices.map(choice => <li key={choice.path} className=\"open-dialog-choice-item\">\n <button className=\"open-dialog-choice\" onClick={() => open(choice.file)}>\n <FileMusic className=\"open-dialog-choice-icon\" size={17}/>\n <span className=\"open-dialog-choice-text\"><span className=\"open-dialog-choice-name\">{choice.file.name}</span><span className=\"open-dialog-choice-path\">{choice.path}</span></span>\n <span className=\"open-dialog-choice-format\">{choice.format}</span>\n </button>\n </li>)}</ul>\n </div> : <>\n <label className=\"open-dialog-entry-label\" htmlFor={`${headingId}-abc`}>ABC notation, or drop files here</label>\n <div className={`open-dialog-dropzone ${dragging ? 'is-drag-over' : ''} ${scanning ? 'is-scanning' : ''}`}>\n <textarea ref={textRef} id={`${headingId}-abc`} className=\"open-dialog-abc-input\" value={abc} spellCheck={false} placeholder={'X:1\\nT:My tune\\nK:C\\nC D E F | G2 G2 |'} aria-describedby={tipId}\n onChange={event => { setAbc(event.target.value); if (messageIsHint) setMessage(''); }}\n onKeyDown={event => { if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) { event.preventDefault(); submitAbc(); } }}/>\n {dragging && <div className=\"open-dialog-drop-overlay\" aria-hidden=\"true\"><Upload className=\"open-dialog-drop-icon\" size={26}/><span className=\"open-dialog-drop-text\">Drop to open</span></div>}\n {scanning && <div className=\"open-dialog-drop-overlay is-scanning\" role=\"status\"><span className=\"score-loading-spinner open-dialog-spinner\"/><span className=\"open-dialog-drop-text\">Looking for scores…</span></div>}\n </div>\n <p id={tipId} className=\"open-dialog-tip\">{TIP} <span className=\"open-dialog-tip-keys\">Ctrl/⌘ + Enter opens pasted ABC.</span></p>\n </>}\n\n {message && <p className={`open-dialog-message ${messageIsHint ? 'is-hint' : 'is-error'}`} role={messageIsHint ? 'status' : 'alert'}>{message}</p>}\n\n <div className=\"open-dialog-actions\">\n <button className=\"open-dialog-browse\" onClick={() => { onBrowse(); onClose(); }}><FolderOpen size={16}/> Browse files</button>\n {!choices && <button className=\"primary-action open-dialog-open-abc\" disabled={!abc.trim()} onClick={submitAbc}>Open ABC</button>}\n </div>\n </section>\n </div>;\n}\n","/**\n * Built-in assets (music fonts, instrument icons, sound packs) live at `assetBaseUrl` in the layout of a\n * pepperscore-sounds-<pack> package: fonts/, instruments/, soundfonts/ and pack.json\n * (docs/specs/pepperscore-embeddable-component.md, \"Assets and sounds\"). No runtime imports: validation/assets.mjs runs it in Node.\n */\nexport type SoundPackName = 'core' | 'complete';\n\n/** Version of the pepperscore-sounds-* packages this build loads by default; validation/sound-packs.mjs keeps it in step. */\nexport const SOUNDS_VERSION = '0.1.0';\n\nexport const defaultAssetBaseUrl = (pack: SoundPackName): string => `https://cdn.jsdelivr.net/npm/pepperscore-sounds-${pack}@${SOUNDS_VERSION}/`;\n\nconst pageBase = (): string => (typeof document !== 'undefined' && document.baseURI) || 'http://localhost/';\n\n/** The absolute asset base, always ending in `/`. A relative base resolves against the page; none means the CDN default. */\nexport function resolveAssetBase(base: string | undefined, pack: SoundPackName = 'core', page: string = pageBase()): string {\n const raw = base?.trim() || defaultAssetBaseUrl(pack);\n return new URL(raw.endsWith('/') ? raw : `${raw}/`, page).href;\n}\n\n/** A built-in asset under the base; a leading `/` (as in the GM manifest's `localPack`) is relative to the base too. */\nexport const assetUrl = (base: string, path: string): string => new URL(path.replace(/^\\/+/, ''), base).href;\n\nexport type PackInfo = { pack: SoundPackName | 'unknown'; fluidr3: ReadonlySet<string> };\nconst packInfo = new Map<string, Promise<PackInfo>>();\n\n/**\n * The base's pack.json, cached per base. A missing or invalid one lists no FluidR3 sounds, so every program falls back\n * to TimGM6mb; a failed fetch is not cached, so the next playback tries again.\n */\nexport function loadPackInfo(base: string): Promise<PackInfo> {\n let info = packInfo.get(base);\n if (!info) {\n info = fetch(assetUrl(base, 'pack.json'))\n .then(response => (response.ok ? response.json() : null) as Promise<{ pack?: unknown; fluidr3?: unknown } | null>)\n .then(json => ({\n pack: json?.pack === 'core' || json?.pack === 'complete' ? json.pack : 'unknown' as const,\n fluidr3: new Set(Array.isArray(json?.fluidr3) ? json.fluidr3.filter((name): name is string => typeof name === 'string') : []),\n }), () => { packInfo.delete(base); return { pack: 'unknown' as const, fluidr3: new Set<string>() }; });\n packInfo.set(base, info);\n }\n return info;\n}\n\nconst warnedBases = new Set<string>();\n/**\n * One console warning per asset base when its fonts or built-in sounds fail to load (for example the default CDN URL\n * before the sounds packages are published). The reader keeps working: fonts fall back and playback runs silently.\n */\nexport function warnAssetBase(base: string, what: string): void {\n if (warnedBases.has(base)) return;\n warnedBases.add(base);\n console.warn(`pepperscore: could not load ${what} from assetBaseUrl \"${base}\". Music fonts fall back and playback is silent. `\n + 'Serve a pepperscore-sounds-core (or -complete) package there, or self-host one and pass its URL as assetBaseUrl.');\n}\n","/**\n * Where each part's sound comes from (docs/specs/pepperscore-embeddable-component.md, \"Sound resolution\"):\n * 1. the first `soundSources` entry that claims it, 2. the pack's FluidR3 sound if pack.json lists it,\n * 3. TimGM6mb.sf2 (always present). Drums use Perfect Drums note files unless a source claims them.\n * Pure: no fetching and no runtime imports (validation/sounds.mjs runs it in Node).\n */\nexport type SoundSource =\n | { id: string; kind: 'sf2'; url: string; programs?: number[]; drums?: boolean; preset?: string }\n | { id: string; kind: 'sample-pack'; url: string /* may contain {name} */; programs?: number[] }\n | { id: string; kind: 'note-files'; manifest: string; programs?: number[]; drums?: boolean };\n\n/** A part's sound: the drum kit, or a GM program (1-128) and its FluidR3 name. */\nexport type SoundRequest = { drums: true } | { drums: false; program: number; name: string };\n\nexport type SoundPlan =\n | { kind: 'sf2'; sourceId: string; url: string; drums: boolean; program?: number; preset?: string }\n | { kind: 'sample-pack'; sourceId: string; url: string; name: string }\n | { kind: 'note-files'; sourceId: string; manifest: string; drums: boolean };\n\nexport const BUILTIN_FLUIDR3 = 'builtin:fluidr3';\nexport const BUILTIN_DRUMS = 'builtin:perfect-drums';\nexport const BUILTIN_SF2 = 'builtin:timgm6mb';\n\nexport type PlanContext = { sources?: readonly SoundSource[]; fluidr3: ReadonlySet<string>; base: string; page: string };\n\nconst claims = (source: SoundSource, request: SoundRequest) =>\n request.drums ? source.kind !== 'sample-pack' && source.drums === true : !!source.programs?.includes(request.program);\n\n/** The built-in GM soundfont; it also plays drum notes a note-file kit lacks. */\nexport const fallbackSf2Url = (base: string) => new URL('soundfonts/TimGM6mb.sf2', base).href;\n\nexport function planSound(request: SoundRequest, { sources = [], fluidr3, base, page }: PlanContext): SoundPlan {\n const source = sources.find(item => claims(item, request));\n if (source?.kind === 'sf2') return { kind: 'sf2', sourceId: source.id, url: new URL(source.url, page).href, drums: request.drums, ...(request.drums ? {} : { program: request.program }), ...(source.preset ? { preset: source.preset } : {}) };\n if (source?.kind === 'sample-pack' && !request.drums) return { kind: 'sample-pack', sourceId: source.id, url: new URL(source.url.replaceAll('{name}', encodeURIComponent(request.name)), page).href, name: request.name };\n if (source?.kind === 'note-files') return { kind: 'note-files', sourceId: source.id, manifest: new URL(source.manifest, page).href, drums: request.drums };\n if (request.drums) return { kind: 'note-files', sourceId: BUILTIN_DRUMS, manifest: new URL('soundfonts/perfect-drums/manifest.json', base).href, drums: true };\n if (fluidr3.has(request.name)) return { kind: 'sample-pack', sourceId: BUILTIN_FLUIDR3, url: new URL(`soundfonts/fluidr3/${request.name}.json`, base).href, name: request.name };\n return { kind: 'sf2', sourceId: BUILTIN_SF2, url: fallbackSf2Url(base), drums: false, program: request.program };\n}\n\n/** Players are shared by parts with the same key (sample packs route each note to its part's gain; see Reader audioKey). */\nexport const planKey = (plan: SoundPlan): string =>\n plan.kind === 'sample-pack' ? `sample-pack:${plan.url}`\n : plan.kind === 'sf2' ? `sf2:${plan.url}#${plan.drums ? 'drums' : plan.program}:${plan.preset ?? ''}`\n : `note-files:${plan.manifest}`;\n","import type { SoundPlan } from './sounds';\n\nexport type AudioPlayer = {\n fallback?: boolean;\n start(options: { note: number; time: number; duration: number; velocity: number; destination?: AudioNode }): () => void;\n stop(): void;\n dispose(): void;\n loadNotes?(notes: number[]): Promise<void>;\n covers?(note: number): boolean;\n};\n\n/** The players for one plan (sf2 players are bound to `destination`, a part's track gain). */\nexport async function loadPlayers(context: AudioContext, plan: SoundPlan, destination: AudioNode): Promise<AudioPlayer[]> {\n if (plan.kind === 'sample-pack') {\n const { loadFluidPlayer } = await import('./fluid-player');\n return [await loadFluidPlayer(context, plan.url, plan.name)];\n }\n if (plan.kind === 'sf2') {\n const { loadSf2Player } = await import('./sf2-player');\n return [await loadSf2Player(context, { url: plan.url, drums: plan.drums, program: plan.program, preset: plan.preset, destination })];\n }\n const { loadNoteFilePlayer } = await import('./drum-player');\n return [await loadNoteFilePlayer(context, plan.manifest)];\n}\n\n/** A note-file drum kit plays the notes it lacks through the GM soundfont's standard kit, as before (added once). */\nexport async function addDrumFallback(context: AudioContext, players: AudioPlayer[], notes: number[], fallbackSf2: string, destination: AudioNode): Promise<void> {\n const kit = players[0];\n if (!kit?.covers || players.some(player => player.fallback) || notes.every(note => kit.covers!(note))) return;\n const { loadSf2Player } = await import('./sf2-player');\n const drums = await loadSf2Player(context, { url: fallbackSf2, drums: true, destination });\n players.push({ fallback: true, start: options => kit.covers!(options.note) ? () => {} : drums.start(options), stop: () => drums.stop(), dispose: () => drums.dispose() });\n}\n","const MUSIC_FONTS = [['Bravura', 'fonts/Bravura.woff2'], ['Petaluma', 'fonts/Petaluma.woff2'], ['Petaluma Script', 'fonts/PetalumaScript.woff2']] as const;\n\n/**\n * SMuFL fonts for Verovio's text glyphs (tempo marks, dynamics) and Petaluma Script stave text, loaded from the asset\n * base instead of hardcoded CSS. Font family names are page-global, so the first instance's base wins.\n */\nexport function ensureMusicFonts(base: string, onError?: (failed: string) => void): void {\n if (typeof document === 'undefined' || document.head.querySelector('style[data-pepperscore-fonts]')) return;\n const style = document.createElement('style');\n style.dataset.pepperscoreFonts = base;\n style.textContent = MUSIC_FONTS.map(([family, path]) => `@font-face{font-family:'${family}';src:url('${new URL(path, base).href}') format('woff2');font-display:block}`).join('\\n');\n document.head.appendChild(style);\n // Faces load on first use; a 404 surfaces as a FontFaceSet loadingerror listing the failed faces.\n if (!onError || !document.fonts?.addEventListener) return;\n const families = new Map<string, string>(MUSIC_FONTS.map(([family, path]) => [family, path]));\n document.fonts.addEventListener('loadingerror', event => {\n const failed = (event as FontFaceSetLoadEvent).fontfaces.map(face => families.get(face.family.replace(/^[\"']|[\"']$/g, ''))).filter(path => path !== undefined);\n if (failed.length) onError(failed.join(', '));\n });\n}\n","import { useCallback, useEffect, useId, useImperativeHandle, useMemo, useRef, useState } from 'react';\nimport { flushSync } from 'react-dom';\nimport { ChevronDown, ChevronLeft, ChevronRight, Ellipsis, Eye, EyeOff, FileMusic, Focus, FolderOpen, History, Hourglass, Minus, Pause, Play, Plus, RotateCcw, SlidersHorizontal, Square, Settings2, Trash2, VolumeX, X } from 'lucide-react';\nimport { exampleScore, gmProgramForSoundfont, gmSoundfontLabel, GM_FAMILIES, GM_SOUNDS, instrumentDetails, type GmFamily, type GmSound, type Part, type Score } from '../lib/score';\nimport { cancelImports, importMusicXmlText, importScoreFile, parseAbc } from '../lib/import';\nimport { portraitBarLimit, renderScore, type MeasureGeometry, type RenderResult } from '../lib/render';\nimport { partControlMetrics, type PartControlMetrics } from '../lib/part-controls';\nimport { HEADER_CONTROL_GROUP, HEADER_CONTROLS, MOBILE_HEADER_BREAKPOINT, type HeaderControlId } from '../lib/header-controls';\nimport { resolveChrome, type ChromePreset, type PepperScoreControls } from '../lib/chrome';\nimport { clampStaveScale, deviceClass, ENDLESS_STAVE_SCALE, minimumDefaultStaveScale, STAVE_SCALE_MAX, STAVE_SCALE_MIN, STAVE_SCALE_STEP } from '../lib/stave-scale';\nimport { buildFileState, clampBpm, MAX_BPM, MIN_BPM, textSource, type FileSource, type FileState, type ScoreView } from '../lib/file-state';\nimport { sampleSource, type ScoreDb } from '../lib/score-db';\nimport { BARS_PER_LINE_MAX, defaults, sanitizeSavedPrefs, settingsToPrefs, viewToMode, type PepperScoreSettings, type Prefs } from '../lib/prefs';\nimport { readerStorage, type PersistNamespace } from '../lib/storage';\nimport { scoreForView, spokenKey, transposeReadout } from '../lib/transpose';\nimport type { SpellingKey } from '../lib/spelling';\nimport { baseTimelineFor, deriveTimeline, playbackDuration, playbackEventsFrom, playbackMidis, playbackPositionAt, type BaseTimeline } from '../lib/playback/timeline';\nimport { closeVerovioChannel, isOutOfMemory, isRestarted, isSuperseded, openVerovioChannel, prepareVerovio, reduceChunkSize } from '../lib/verovio-runtime';\nimport { claimPlayback, getSharedAudio, releasePlayback, resumeAudio } from '../lib/audio-engine';\nimport { isLargeFile, isLargeScore, largeScoreMessage, staffMeasures } from '../lib/large-file';\nimport { isSameFile, lastFileToFile, type LastFileInfo } from '../lib/last-file';\nimport { withEngravingDocument } from '../lib/notation/document';\nimport { SCORE_FILE_ACCEPT } from '../lib/score-files';\nimport { PAGE_PAD_PX, pageOfSystem, systemPages, turnTarget, type ReadingPage, type SystemSpan } from '../lib/paging';\nimport { fetchScoreFile } from '../lib/remote-score';\nimport OpenScoreDialog from './OpenScoreDialog';\nimport { loadPackInfo, resolveAssetBase, warnAssetBase, type SoundPackName } from '../lib/assets';\nimport { fallbackSf2Url, planKey, planSound, type SoundPlan, type SoundRequest, type SoundSource } from '../lib/sounds';\nimport { addDrumFallback, loadPlayers, type AudioPlayer } from '../lib/sound-players';\nimport { ensureMusicFonts } from '../lib/asset-fonts';\n\n/** Short key name for readouts: 'Gb', 'C#m'. */\nconst keyName = (key: SpellingKey) => `${key.tonic}${key.mode === 'minor' ? 'm' : ''}`;\nconst clampSemitones = (semitones: number) => Math.max(-12, Math.min(12, semitones));\nconst sampleScore = () => withEngravingDocument(exampleScore());\nconst textFonts = { Sans: 'Poppins, Arial, sans-serif', Serif: 'Georgia, serif', Mono: 'ui-monospace, monospace' } as const;\nconst sampleAbc = `X:1\\nT:A little room to play\\nM:4/4\\nL:1/4\\nQ:1/4=96\\nK:C\\nC E G c | B A G E | C E G c | d2 c2 | G E D C | E G A G | F E D B, | C4 |`;\nconst playbackSound = (part: Part) => part.gmSoundfont || (part.instrument === 'drum-kit' ? 'drum-kit' : instrumentDetails(part.instrument).soundfont!);\nconst soundRequest = (part: Part): SoundRequest => {\n const sound = playbackSound(part);\n return sound === 'drum-kit' ? { drums: true } : { drums: false, program: gmProgramForSoundfont(sound) ?? 1, name: sound };\n};\n/** Sample packs route each note to its part's gain, so parts share them; sf2 and note-file players are bound to one part's gain. */\nconst audioKey = (plan: SoundPlan, part: Part) => plan.kind === 'sample-pack' ? planKey(plan) : `${planKey(plan)}|${part.id}`;\nconst SILENT_PLAYBACK_NOTICE = 'Audio couldn’t start on this device — playing silently.';\nexport type PepperScoreReadyInfo = { title: string; composer?: string; parts: Array<{ id: string; name: string }>; measures: number };\nexport type PepperScoreHandle = {\n /** Start playback (no-op while playing, or when the chrome loads no audio). */\n play(): Promise<void>;\n stop(): void;\n /** Set the absolute transposition in semitones (clamped to -12…12), like `settings.semitones`. */\n transpose(semitones: number): void;\n};\nexport type PepperScoreProps = {\n /** Score sources; the first present wins, in this order. */\n musicXml?: string;\n /** A score file (MusicXML, MXL, MIDI, MEI or ABC). */\n file?: File;\n /** A public score file to download and open (relative URLs resolve against the page). */\n scoreUrl?: string;\n abc?: string;\n /** `\"full\"` (default): header, drawer, mixer, sample score and open-file UI; `\"minimal\"`: notation with a compact play button; `\"none\"`: engraving only, no audio. */\n chrome?: ChromePreset;\n /** Per-control overrides of the chrome preset (lib/chrome.ts). */\n controls?: PepperScoreControls;\n /** Initial reading view; changing it re-applies it. */\n view?: 'vertical' | 'endless';\n /** `\"fill\"` fills the parent's height; any CSS length fixes it; omitted, full chrome fills its parent (480px floor) and the others size to their score. */\n height?: string;\n /** Extra classes on the `.pepperscore` root. */\n className?: string;\n /** Accessible name of the reader's landmark region; default `\"Score: <title>\"` once a titled score loads, else `\"Score reader\"`. */\n ariaLabel?: string;\n /** Initial reader settings; changing a key re-applies that key. A score's saved record (with `persist`) wins over them. */\n settings?: PepperScoreSettings;\n /**\n * Namespace of the saved state (prefs, per-score records, last file; see lib/storage.ts); `false` saves nothing.\n * Default `\"pepperscore\"` for full chrome, `false` otherwise. `\"scoreflow\"` keeps the original Scoreflow names.\n */\n persist?: PersistNamespace;\n /** Root of a pepperscore-sounds-<pack> layout; default: the jsDelivr copy of pepperscore-sounds-<soundPack>. */\n assetBaseUrl?: string;\n soundPack?: SoundPackName;\n /** Sounds that replace the built-in ones for the programs (or drum kit) they claim; the first claiming entry wins. */\n soundSources?: SoundSource[];\n /** A score finished loading and drew (once per score). */\n onReady?(info: PepperScoreReadyInfo): void;\n onPlay?(): void;\n onStop?(): void;\n onError?(error: Error): void;\n /** Focus the reader on mount so page-turn keys work before any click. */\n autoFocus?: boolean;\n ref?: React.Ref<PepperScoreHandle>;\n};\n/** The widest control gutter a viewport can spare: 42% of it, leaving the first system at least its 180px minimum (render.ts). */\nconst maxControlGutter = (width: number) => Math.max(120, Math.min(Math.round(width * .42), width - 180));\n/** Keyboard steps on the stave scale slider commit once they settle; drags and pinches commit on release. */\nconst STAVE_SCALE_COMMIT_MS = 180;\n/** A per-score record read never holds up the first paint for longer than this. */\nconst SCORE_RECORD_TIMEOUT_MS = 1200;\nconst readScoreRecord = (scoreDb: ScoreDb, source: FileSource) => Promise.race([\n scoreDb.read(source).catch(() => null),\n new Promise<null>(resolve => setTimeout(() => resolve(null), SCORE_RECORD_TIMEOUT_MS)),\n]);\n/** After a user scroll (wheel, scrollbar drag, page turn) playback follow leaves the view alone this long. */\nconst FOLLOW_SUSPEND_MS = 2500;\n/** A programmatic smooth scroll counts as in flight until it lands, or for at most this long. */\nconst SCROLL_SETTLE_MS = 900;\n/** Guidance added to the renderer's out-of-memory message. */\nconst OOM_GUIDANCE = 'Close other tabs, or try again with smaller sections.';\n/** Shown when the renderer kept restarting under a draw (other readers on the page running out of memory). */\nconst RENDERER_RESTARTED = 'The notation renderer restarted while drawing this score.';\n/** Draws re-run this many times after a renderer restart before the reader reports it. */\nconst RESTART_REDRAWS = 2;\n/**\n * A draw superseded while it is still this reader's latest (an import of another score on its channel was in flight,\n * e.g. the built-in sample's when a source prop arrives) is tried again after this delay, up to SUPERSEDED_REDRAWS times.\n */\nconst SUPERSEDED_REDRAW_MS = 250;\nconst SUPERSEDED_REDRAWS = 40;\nconst LAST_FILE_PRIVACY = 'The last opened file is kept only on this device (in this browser), so it can be reopened after a reload. It is never uploaded.';\nconst scrollBehavior = (): ScrollBehavior => window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 'auto' : 'smooth';\nconst flag = (element: HTMLElement, key: 'psShort' | 'psTiny' | 'psWide', on: boolean) => { if (on) element.dataset[key] = ''; else delete element.dataset[key]; };\n/** Where the viewport centre sits in a measure, so a re-layout can put that point back at the centre. */\ntype ZoomAnchor = { index: number; fx: number; fy: number };\n\nexport default function PepperScore({ musicXml, file, scoreUrl, abc, chrome: preset = 'full', controls, view, height, className, ariaLabel, settings, persist, assetBaseUrl, soundPack = 'core', soundSources, onReady, onPlay, onStop, onError, autoFocus, ref }: PepperScoreProps) {\n const chrome = useMemo(() => resolveChrome(preset, controls), [preset, controls?.mixer, controls?.openFile, controls?.drawer, controls?.transport, controls?.viewToggle, controls?.zoom]);\n const storage = useMemo(() => readerStorage(persist ?? (preset === 'full' ? 'pepperscore' : false)), [persist, preset]);\n // Host settings and view as prefs; only keys the host gives are applied (on mount, on each score load, and when they change).\n const settingsKey = JSON.stringify(settings ?? {});\n const hostPrefs = useMemo<Partial<Prefs>>(() => {\n const mapped = settingsToPrefs(settings);\n if (mapped.zoom != null) mapped.zoom = clampStaveScale(mapped.zoom);\n return { ...mapped, ...(view ? { mode: viewToMode(view) } : {}) };\n }, [settingsKey, view]);\n const hostPrefsRef = useRef(hostPrefs);\n const callbacks = useRef({ onReady, onPlay, onStop, onError });\n callbacks.current = { onReady, onPlay, onStop, onError };\n const natural = !height && preset !== 'full';\n const storageRef = useRef(storage);\n storageRef.current = storage;\n const [score, setScore] = useState<Score>(sampleScore);\n const [scoreRevision, setScoreRevision] = useState(0);\n const [prefs, setPrefs] = useState<Prefs>(defaults);\n const [source, setSource] = useState<FileSource | null>(null);\n const [hiddenIds, setHiddenIds] = useState<string[]>([]);\n const [trackVolumes, setTrackVolumes] = useState<Record<string, number>>({});\n const [drawer, setDrawer] = useState(false);\n const [mixer, setMixer] = useState(false);\n const [openDialog, setOpenDialog] = useState(false);\n const [pickerPartId, setPickerPartId] = useState<string | null>(null);\n const [pickerFamily, setPickerFamily] = useState<GmFamily>('Keyboard');\n const [pickerPage, setPickerPage] = useState(0);\n const [abcDraft, setAbcDraft] = useState(sampleAbc);\n const [error, setError] = useState('');\n const [notice, setNotice] = useState('');\n /** Non-blocking \"large score, this may take a while\" notice for the file being opened. */\n const [largeNotice, setLargeNotice] = useState('');\n /** The large-score notice clears when the score it was shown for paints (armed once that score is loaded). */\n const largeNoticeArmedRef = useRef(false);\n /** An out-of-memory error and what to re-run after shrinking the engraving chunks; shown while `error` is its message. */\n const [oomRetry, setOomRetry] = useState<{ message: string; kind: 'open' | 'draw' } | null>(null);\n /** The file most recently passed to readFile, for an out-of-memory retry. */\n const lastFileRef = useRef<File | null>(null);\n /** The remembered last opened file (stored on this device), and whether to offer reopening it. */\n const [lastFileInfo, setLastFileInfo] = useState<LastFileInfo | null>(null);\n const [reopenOffer, setReopenOffer] = useState<LastFileInfo | null>(null);\n const [playing, setPlaying] = useState(false);\n const [loadingAudio, setLoadingAudio] = useState(false);\n const [loadingFont, setLoadingFont] = useState(false);\n const [painted, setPainted] = useState(false);\n const [painting, setPainting] = useState(true);\n const [resizeTick, setResizeTick] = useState(0);\n /** Bumped when systems are drawn, released or resized after the first paint (large scores draw on demand). */\n const [layoutTick, setLayoutTick] = useState(0);\n const [active, setActive] = useState<string | null>(null);\n const [activeNotes, setActiveNotes] = useState<string[]>([]);\n const [position, setPosition] = useState(0);\n const [ready, setReady] = useState(false);\n // Whether a score has loaded. Full chrome starts with the sample; the others show an empty frame until their source\n // loads. The first render depends only on the chrome, never on source props, so a client-only source (the demo's\n // ?score= link) cannot cause a hydration mismatch.\n const [loaded, setLoaded] = useState(preset === 'full');\n const [staffCenters, setStaffCenters] = useState<Record<string, number>>({});\n const [controlMetrics, setControlMetrics] = useState<PartControlMetrics>(() => partControlMetrics(72));\n const [zoomDraft, setZoomDraft] = useState<number | null>(null);\n const zoomCommitRef = useRef(0);\n /** Stave scale of the score on screen (the resolved default when prefs.zoom is null). */\n const [renderedZoom, setRenderedZoom] = useState(1);\n const renderedZoomRef = useRef(1);\n const prefsZoomRef = useRef<number | null>(null);\n prefsZoomRef.current = prefs.zoom;\n /** Slider floor: STAVE_SCALE_MIN, or lower when a many-staff height fit is smaller. */\n const staveScaleMinRef = useRef(STAVE_SCALE_MIN);\n const savedViewRef = useRef<ScoreView | undefined>(undefined);\n /** The next render is a zoom commit: no paint reveal or loading overlay, and the anchor measure is kept centred. */\n const quietRenderRef = useRef(false);\n const zoomAnchorRef = useRef<ZoomAnchor | null>(null);\n const previewOriginRef = useRef<{ x: number; y: number } | null>(null);\n /** A pointer is pressed on the stave scale slider. */\n const sliderPointerRef = useRef(false);\n /** Zoom handed to the pending quiet render, so a duplicate release (change + pointerup) does not commit twice. */\n const pendingZoomRef = useRef<number | null>(null);\n /** Latest native `change` handler for the slider (React's onChange is the `input` event). */\n const staveScaleChangeRef = useRef<(input: HTMLInputElement) => void>(() => {});\n const staveScaleInputRef = useRef<HTMLInputElement | null>(null);\n const [moreOpen, setMoreOpen] = useState(false);\n const moreRef = useRef<HTMLDivElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const uid = useId();\n const panelId = `${uid}-more`;\n const overhangId = `${uid}-overhang`;\n const [scoreWidth, setScoreWidth] = useState(0);\n const fileRef = useRef<HTMLInputElement>(null);\n const viewportRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const renderRef = useRef<RenderResult | null>(null);\n /** This reader's players and track gains on the page's shared AudioContext and master (audio-engine.ts). */\n const audioRef = useRef<{ context: AudioContext; master: DynamicsCompressorNode; players: Map<string, AudioPlayer[]>; partKeys: Map<string, string>; trackGains: Map<string, GainNode>; mixScale: number } | null>(null);\n const playRef = useRef<{ start: number; beat: number; frame: number; interval?: ReturnType<typeof setInterval> } | null>(null);\n const scheduledStopsRef = useRef<Array<{ stop: () => void; end: number }>>([]);\n const playRunRef = useRef(0);\n const importRunRef = useRef(0);\n const renderRunRef = useRef(0);\n const swipeRef = useRef<{ x: number; y: number } | null>(null);\n const pinchRef = useRef<{ distance: number; zoom: number; nextZoom: number } | null>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const hasPaintedRef = useRef(false);\n const modeRef = useRef(prefs.mode);\n modeRef.current = prefs.mode;\n const overlapRef = useRef(prefs.overlap);\n overlapRef.current = prefs.overlap;\n /** Vertical reading pages (see paging.ts), recomputed from the rendered systems whenever they are used. */\n const pagesRef = useRef<{ pages: ReadingPage[]; spans: SystemSpan[] }>({ pages: [], spans: [] });\n /** Extra space below the score so the last page start can reach the viewport top. */\n const pageTailRef = useRef(0);\n /** Destination of the last programmatic smooth scroll, so a turn or follow during it builds on where it lands. */\n const scrollTargetRef = useRef<{ top: number; left: number; at: number } | null>(null);\n const userScrollAtRef = useRef(-Infinity);\n const assetBase = useMemo(() => resolveAssetBase(assetBaseUrl, soundPack), [assetBaseUrl, soundPack]);\n // This reader's Verovio channel (opened in an effect and closed in its cleanup, so StrictMode's remount gets a new one):\n // its imports and renders never supersede another reader's on the shared worker.\n const channelRef = useRef(0);\n const restartRedrawsRef = useRef(0);\n const supersededRedrawsRef = useRef(0);\n /** The score revision onReady last fired for. */\n const readyRevisionRef = useRef(-1);\n useEffect(() => { const channel = openVerovioChannel(); channelRef.current = channel; return () => { cancelImports(channel); closeVerovioChannel(channel); }; }, []);\n useEffect(() => ensureMusicFonts(assetBase, failed => warnAssetBase(assetBase, failed)), [assetBase]);\n const hiddenSet = useMemo(() => new Set(hiddenIds), [hiddenIds]);\n const visibleScore = useMemo(() => {\n const parts = score.parts.filter(part => !hiddenSet.has(part.id));\n return { ...score, parts: parts.length ? parts : score.parts.slice(0, 1) };\n }, [score, hiddenSet]);\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n for (const [id, gain] of audio.trackGains) gain.gain.setTargetAtTime((trackVolumes[id] ?? 100) / 100 * audio.mixScale, audio.context.currentTime, .015);\n }, [trackVolumes]);\n // Verovio can only transpose written pitch to sounding pitch, so concert-basis scores always show concert pitch.\n const concertBasis = score.parts.some(part => part.pitchBasis === 'concert');\n const scorePitch = concertBasis ? 'concert' : prefs.scorePitch;\n const displayScore = useMemo(() => scoreForView(score, scorePitch, prefs.semitones, prefs.keyFlip), [score, scorePitch, prefs.semitones, prefs.keyFlip]);\n // The key readout (\"+2 · D\") and the enharmonic key the flip offers, for the score as it is shown (header and drawer).\n const readout = useMemo(() => transposeReadout(score, scorePitch, prefs.semitones, prefs.keyFlip), [score, scorePitch, prefs.semitones, prefs.keyFlip]);\n const hasTransposingParts = score.parts.some(part => part.transposition?.semitones || part.measures.some(measure => measure.transposition?.semitones));\n // The performance timeline is built when playback first needs it, not while a score loads: on a large score it is\n // seconds of main-thread work that would otherwise hold up the first paint (docs/specs/large-score-performance.md).\n // It is built once per score (by the import worker when it registered one), in beats: BPM and transposition are\n // applied while playing, and hiding parts only filters it, so none of them rebuild it.\n const timelineRef = useRef<{ key: object; visible: string; timeline: BaseTimeline } | null>(null);\n const timelineKey: object = score.document || score;\n const visibleKey = visibleScore.parts.map(part => part.id).join('\\u0000');\n const timelineOf = useCallback((): BaseTimeline | null => {\n const cached = timelineRef.current;\n return cached && cached.key === timelineKey && cached.visible === visibleKey ? cached.timeline : null;\n }, [timelineKey, visibleKey]);\n const loadTimeline = useCallback(async (): Promise<BaseTimeline> => {\n const cached = timelineOf();\n if (cached) return cached;\n const timeline = deriveTimeline(await baseTimelineFor(score), { visiblePartIds: visibleScore.parts.map(part => part.id) });\n timelineRef.current = { key: timelineKey, visible: visibleKey, timeline };\n return timeline;\n }, [timelineOf, score, visibleScore, timelineKey, visibleKey]);\n\n useEffect(() => {\n setPrefs({ ...sanitizeSavedPrefs(storage.readPrefs()), ...hostPrefsRef.current });\n const hasSource = Boolean(musicXml || file || scoreUrl || abc);\n // The last opened file is offered (never opened) on start, unless a score was supplied or one is already opening.\n let offerCancelled = false;\n void storage.lastFile.readInfo().then(info => {\n if (offerCancelled) return;\n setLastFileInfo(info);\n if (chrome.openFile && info && !hasSource && importRunRef.current === 0 && !storage.reopenDismissed()) setReopenOffer(info);\n });\n // A supplied score loads in the source effect below; without one, only full chrome shows the sample (the others\n // stay an empty frame: never ready, nothing engraved).\n if (hasSource || preset !== 'full') return () => { offerCancelled = true; };\n // The sample's record (saved zoom and settings) is read before the first paint.\n let cancelled = false;\n const sample = score;\n const src = sampleSource(sample);\n void readScoreRecord(storageRef.current.scoreDb, src).then(saved => {\n if (cancelled) return;\n if (importRunRef.current === 0) loadScore(sample, src, saved);\n setReady(true);\n });\n return () => { cancelled = true; offerCancelled = true; };\n }, []);\n // Global prefs are saved with the host's settings applied (they are re-applied on mount anyway); a key the host later\n // drops keeps its last value here.\n useEffect(() => { if (ready) { const { zoom: _zoom, ...global } = prefs; storage.writePrefs(global); } }, [prefs, ready, storage]);\n useEffect(() => {\n if (!ready || !source) return;\n const view = prefs.zoom !== null ? { zoom: prefs.zoom, zoomDevice: deviceClass() } : savedViewRef.current;\n savedViewRef.current = view;\n storage.scoreDb.write(buildFileState(source, prefs, score, hiddenIds, trackVolumes, view));\n }, [ready, source, prefs, score, hiddenIds, trackVolumes, storage]);\n // Unload can cut an IndexedDB transaction short, so pending writes are also saved synchronously (write-ahead).\n useEffect(() => {\n const { scoreDb } = storage;\n const persistPending = () => scoreDb.persistPending();\n const hidden = () => { if (document.visibilityState === 'hidden') persistPending(); };\n window.addEventListener('pagehide', persistPending);\n document.addEventListener('visibilitychange', hidden);\n return () => { window.removeEventListener('pagehide', persistPending); document.removeEventListener('visibilitychange', hidden); void scoreDb.flush(); };\n }, [storage]);\n const update = (patch: Partial<Prefs>) => {\n if (['mode', 'notationFont', 'annotationFont', 'barsPerLine', 'names', 'chordSymbols', 'inferChordSymbols', 'counts', 'subdivisions', 'semitones', 'scorePitch', 'keyFlip'].some(key => key in patch && patch[key as keyof Prefs] !== prefs[key as keyof Prefs])) setPainting(true);\n if (patch.mode && patch.mode !== prefs.mode) viewportRef.current?.scrollTo({ left: 0, top: 0 });\n setPrefs(prev => ({ ...prev, ...patch }));\n };\n // Another reader starting playback stops this one through the shared owner slot (audio-engine claimPlayback).\n const stopRef = useRef<(reset?: boolean) => void>(() => {});\n const playbackOwner = useMemo(() => ({ stop: () => stopRef.current(true) }), []);\n const stop = useCallback((reset = false) => {\n releasePlayback(playbackOwner);\n playRunRef.current += 1;\n if (playRef.current) { cancelAnimationFrame(playRef.current.frame); clearInterval(playRef.current.interval); }\n playRef.current = null;\n scheduledStopsRef.current.splice(0).forEach(item => item.stop());\n audioRef.current?.players.forEach(players => players.forEach(player => player.stop()));\n setPlaying(false);\n setLoadingAudio(false);\n if (reset) { setPosition(0); setActive(null); setActiveNotes([]); }\n }, []);\n stopRef.current = stop;\n const changePitch = (patch: Partial<Prefs>) => { stop(true); update(patch); };\n const transposeBy = (delta: number) => changePitch({ semitones: clampSemitones(prefs.semitones + delta) });\n /** Show a score with its saved record (if any). The saved zoom applies only on the device class it was chosen on. */\n const loadScore = (next: Score, nextSource: FileSource, saved: FileState | null) => {\n const device = deviceClass();\n savedViewRef.current = saved?.view;\n const zoom = saved?.view?.zoomDevice === device ? saved.view.zoom : null;\n const restored = saved ? { ...next, parts: next.parts.map(part => {\n const state = saved.parts[part.id];\n if (!state) return part;\n return { ...part, instrument: state.instrument, gmSoundfont: state.gmSoundfont || (state.instrument === part.instrument ? part.gmSoundfont : instrumentDetails(state.instrument).soundfont || undefined) };\n }) } : next;\n stop(true); setPainting(true); setPickerPartId(null); setScore(restored); setScoreRevision(value => value + 1); setSource(nextSource); setLoaded(true);\n setHiddenIds(saved ? next.parts.filter(part => saved.parts[part.id]?.visible === false).map(part => part.id) : []);\n setTrackVolumes(saved ? Object.fromEntries(next.parts.map(part => [part.id, saved.parts[part.id]?.volume ?? 100])) : {});\n setError('');\n // A saved per-score record (persist on) wins over the host's settings and view: they are initial values, and the\n // reader's own edits to this score are newer. Without a record, the per-score resets (zoom, transposition, pitch\n // view) take the host's value for the keys it gives; every other pref keeps what the reader has now (drawer edits).\n const host = hostPrefsRef.current;\n const hostResets: Partial<Prefs> = Object.fromEntries((['zoom', 'semitones', 'scorePitch'] as const).filter(key => host[key] !== undefined).map(key => [key, host[key]]));\n setPrefs(prev => saved ? { ...prev, ...saved.settings, zoom } : { ...prev, bpm: clampBpm(Math.round(next.tempo)), zoom: null, semitones: 0, keyFlip: false, scorePitch: next.parts.some(part => part.pitchBasis === 'concert') ? 'concert' : 'written', ...hostResets });\n viewportRef.current?.scrollTo({ left: 0, top: 0 });\n setDrawer(false);\n };\n /** Import supplied MusicXML text (read and identified in the import worker, like a file). */\n const readMusicXml = async (text: string) => {\n const run = ++importRunRef.current;\n setReady(true);\n startOpening(); stop(true); setPainting(true);\n try {\n const job = importMusicXmlText(text, 'MusicXML', channelRef.current);\n const src = await job.source;\n const [saved, next] = await Promise.all([readScoreRecord(storageRef.current.scoreDb, src), job.score]);\n if (run !== importRunRef.current) return;\n if (next.document) await prepareEngraving(next.document);\n if (run === importRunRef.current) loadScore(next, src, saved);\n } catch (e) {\n if (run === importRunRef.current) { setPainting(false); showError(e, 'Could not read the supplied MusicXML.'); }\n }\n };\n /**\n * Show an error; an out-of-memory one gets guidance and a retry with smaller engraving chunks. So does a renderer that\n * kept restarting under this reader (other readers running out of memory), which has no raw message to show.\n */\n const showError = (e: unknown, fallback: string, retry?: 'open' | 'draw') => {\n const restarted = isRestarted(e);\n if (retry && (isOutOfMemory(e) || restarted)) {\n const message = `${restarted ? RENDERER_RESTARTED : (e as Error).message} ${OOM_GUIDANCE}`;\n setOomRetry({ message, kind: retry });\n setError(message);\n return;\n }\n setError(restarted ? RENDERER_RESTARTED : e instanceof Error ? e.message : fallback);\n };\n /** Import a score's engraving on this reader's channel; a renderer restart under it is tried once more. */\n const prepareEngraving = (doc: NonNullable<Score['document']>) => prepareVerovio(doc, channelRef.current)\n .catch(error => isRestarted(error) ? prepareVerovio(doc, channelRef.current) : Promise.reject(error));\n /** Opening any score retires the large-score notice, the reopen offer and the last error (so a repeated failure reports again). */\n const startOpening = () => { largeNoticeArmedRef.current = false; setLargeNotice(''); setReopenOffer(null); setError(''); };\n const readFile = async (file?: File) => {\n if (!file) return;\n const run = ++importRunRef.current;\n setReady(true);\n lastFileRef.current = file;\n startOpening();\n const phone = deviceClass() === 'compact';\n const largeBytes = isLargeFile(file.size);\n if (largeBytes) setLargeNotice(largeScoreMessage(file.size, { phone }));\n stop(true);\n setPainting(true);\n await new Promise<void>(resolve => requestAnimationFrame(() => resolve()));\n try {\n // The import worker reads and hashes the file once and parses it off the main thread; the saved record is read\n // while the score imports, so its zoom is applied before the first paint.\n const job = importScoreFile(file, channelRef.current);\n const nextSource = await job.source;\n const [saved, nextScore] = await Promise.all([readScoreRecord(storageRef.current.scoreDb, nextSource), job.score]);\n // A compact file (an .mxl, a dense MIDI) can still be a large score: warn before engraving starts.\n if (!largeBytes && run === importRunRef.current && isLargeScore(nextScore)) setLargeNotice(largeScoreMessage(file.size, { phone, staffMeasures: staffMeasures(nextScore) }));\n if (run !== importRunRef.current) return;\n if (nextScore.document) await prepareEngraving(nextScore.document);\n if (run === importRunRef.current) {\n largeNoticeArmedRef.current = true;\n loadScore(nextScore, nextSource, saved);\n // Remembered after the import succeeds, off the open path; an unchanged file is not written again.\n if (!isSameFile(lastFileInfo, file)) void storageRef.current.lastFile.remember(file).then(info => { if (info) setLastFileInfo(info); });\n }\n }\n catch (e) { if (run === importRunRef.current) { setPainting(false); setLargeNotice(''); showError(e, 'Could not open this file.', 'open'); } }\n };\n /** Download a public score and open it like a chosen file. */\n const readUrl = async (url: string) => {\n const run = ++importRunRef.current;\n setReady(true);\n startOpening(); stop(true); setPainting(true); setError('');\n try {\n const file = await fetchScoreFile(url, document.baseURI);\n if (run === importRunRef.current) await readFile(file);\n }\n catch (e) { if (run === importRunRef.current) { setPainting(false); showError(e, 'Could not download this score.'); } }\n };\n // The supplied source: the first present of musicXml, file, scoreUrl and abc. A newer source (or unmount) retires an import in flight.\n useEffect(() => {\n if (musicXml) { void readMusicXml(musicXml); return () => { importRunRef.current++; }; }\n if (file) { void readFile(file); return () => { importRunRef.current++; }; }\n if (scoreUrl) { void readUrl(scoreUrl); return () => { importRunRef.current++; }; }\n if (abc) { void readAbc(abc); return () => { importRunRef.current++; }; }\n }, [musicXml, file, scoreUrl, abc]);\n // Host settings and view: a changed key is applied again (unchanged keys keep the reader's own edits).\n useEffect(() => {\n const previous = hostPrefsRef.current;\n hostPrefsRef.current = hostPrefs;\n const changed = Object.fromEntries(Object.entries(hostPrefs).filter(([key, value]) => previous[key as keyof Prefs] !== value)) as Partial<Prefs>;\n if (!Object.keys(changed).length || !ready) return;\n if ('semitones' in changed || 'scorePitch' in changed) changePitch(changed);\n else update(changed);\n }, [hostPrefs]);\n /** After an out-of-memory failure: engrave in smaller chunks and open or draw the score again. */\n const retryOutOfMemory = () => {\n const retry = oomRetry;\n if (!retry) return;\n reduceChunkSize();\n setOomRetry(null);\n setError('');\n if (retry.kind === 'open' && lastFileRef.current) { void readFile(lastFileRef.current); return; }\n setPainting(true);\n setResizeTick(value => value + 1);\n };\n const reopenLastFile = async () => {\n setReopenOffer(null);\n const record = await storage.lastFile.read();\n if (!record) { setLastFileInfo(null); setError('The last opened file is no longer stored on this device.'); return; }\n void readFile(lastFileToFile(record));\n };\n const dismissReopen = () => {\n setReopenOffer(null);\n storage.dismissReopen();\n };\n const forgetLast = () => { setReopenOffer(null); setLastFileInfo(null); void storage.lastFile.forget(); };\n const readAbc = async (text: string) => {\n const run = ++importRunRef.current;\n setReady(true);\n startOpening();\n setPainting(true);\n try {\n const src = textSource('abc', text, 'Pasted ABC');\n const [next, saved] = await Promise.all([parseAbc(text), readScoreRecord(storageRef.current.scoreDb, src)]);\n if (run === importRunRef.current) loadScore(next, src, saved);\n } catch (e) { if (run === importRunRef.current) { setPainting(false); setError(e instanceof Error ? e.message : 'Could not read ABC notation.'); } }\n };\n const loadSample = async () => {\n const run = ++importRunRef.current;\n startOpening();\n setPainting(true);\n const sample = sampleScore();\n const src = sampleSource(sample);\n const saved = await readScoreRecord(storageRef.current.scoreDb, src);\n if (run === importRunRef.current) loadScore(sample, src, saved);\n };\n const togglePart = (id: string) => {\n if (!hiddenSet.has(id) && visibleScore.parts.length <= 1) return;\n stop(true); setPainting(true);\n setHiddenIds(previous => previous.includes(id) ? previous.filter(partId => partId !== id) : [...previous, id]);\n viewportRef.current?.scrollTo({ left: 0, top: 0 });\n };\n /** The stave a lone visible part is focused on, if any. */\n const focusedId = score.parts.length > 1 && visibleScore.parts.length === 1 ? visibleScore.parts[0].id : null;\n /** Focus hides every other stave; focusing the focused stave again shows them all. */\n const focusPart = (id: string) => {\n stop(true); setPainting(true);\n setHiddenIds(focusedId === id ? [] : score.parts.filter(part => part.id !== id).map(part => part.id));\n viewportRef.current?.scrollTo({ left: 0, top: 0 });\n };\n const resetStaves = () => { stop(true); setPainting(true); setHiddenIds([]); viewportRef.current?.scrollTo({ left: 0, top: 0 }); };\n // Stave scale: while dragging or pinching, a GPU transform previews the new size around the viewport centre;\n // the commit re-lays out at the new scale in place (no paint reveal) and keeps the centre measure centred.\n const viewportCentre = () => {\n const viewport = viewportRef.current;\n if (!viewport) return null;\n const view = viewport.getBoundingClientRect();\n return { x: view.left + viewport.clientLeft + viewport.clientWidth / 2, y: view.top + viewport.clientTop + viewport.clientHeight / 2 };\n };\n // The whole score content (title included) is scaled, with the paint-reveal transition off so it tracks the pointer.\n const previewStaveScale = (draft: number) => {\n const content = contentRef.current, centre = viewportCentre();\n if (!content || !centre) return;\n if (!previewOriginRef.current) {\n const box = content.getBoundingClientRect();\n previewOriginRef.current = { x: centre.x - box.left, y: centre.y - box.top };\n content.style.transition = 'none';\n content.style.transformOrigin = `${previewOriginRef.current.x}px ${previewOriginRef.current.y}px`;\n content.style.willChange = 'transform';\n }\n content.style.transform = `scale(${draft / renderedZoomRef.current})`;\n };\n const clearStaveScalePreview = () => {\n const content = contentRef.current;\n if (!previewOriginRef.current || !content) return;\n previewOriginRef.current = null;\n content.style.transform = ''; content.style.transformOrigin = ''; content.style.willChange = '';\n // Settle the style without a transition, then hand the reveal transition back.\n void getComputedStyle(content).transform;\n content.style.transition = '';\n };\n const captureZoomAnchor = (): ZoomAnchor | null => {\n const centre = viewportCentre(), measures = renderRef.current?.measures;\n if (!centre || !measures?.length) return null;\n let best: { measure: MeasureGeometry; rect: DOMRect; distance: number } | null = null;\n for (const measure of measures) {\n const rect = measure.element?.getBoundingClientRect();\n if (!rect || !rect.width) continue;\n const distance = Math.hypot(Math.max(rect.left - centre.x, 0, centre.x - rect.right), Math.max(rect.top - centre.y, 0, centre.y - rect.bottom));\n if (!best || distance < best.distance) best = { measure, rect, distance };\n }\n if (!best) return null;\n const clamp01 = (value: number) => Math.max(0, Math.min(1, value));\n return { index: best.measure.index, fx: clamp01((centre.x - best.rect.left) / best.rect.width), fy: clamp01((centre.y - best.rect.top) / best.rect.height) };\n };\n const restoreZoomAnchor = (anchor: ZoomAnchor, result: RenderResult, mode: Prefs['mode']) => {\n const viewport = viewportRef.current, centre = viewportCentre();\n // An undrawn anchor (a large score draws systems on demand) falls back to its system block from layout data, with\n // the measure's share of it: exact for a drawn measure, approximate (equal-width measures) otherwise.\n let rect = result.measure(anchor.index)?.element?.getBoundingClientRect();\n if (!rect) {\n const system = result.systems[result.systemOfMeasure(anchor.index)];\n const block = system && canvasRef.current?.querySelector<HTMLElement>(`:scope > .score-system[data-system=\"${system.index}\"]`)?.getBoundingClientRect();\n if (block && system.measureCount > 0) {\n const share = block.width / system.measureCount;\n rect = new DOMRect(block.left + share * Math.max(0, anchor.index - system.firstMeasure), block.top, share, block.height);\n }\n }\n if (!viewport || !centre || !rect) return;\n const dx = rect.left + anchor.fx * rect.width - centre.x, dy = rect.top + anchor.fy * rect.height - centre.y;\n // Endless keeps its vertical centring; Vertical scrolls the anchor's system back to the centre.\n if (mode === 'landscape') viewport.scrollLeft += dx;\n else viewport.scrollTop += dy;\n };\n const commitStaveScale = (value: number) => {\n window.clearTimeout(zoomCommitRef.current);\n const next = clampStaveScale(value, staveScaleMinRef.current);\n setZoomDraft(null);\n const committed = quietRenderRef.current ? pendingZoomRef.current : prefsZoomRef.current;\n if (next === committed) { if (!quietRenderRef.current) clearStaveScalePreview(); return; }\n zoomAnchorRef.current = captureZoomAnchor();\n quietRenderRef.current = true;\n pendingZoomRef.current = next;\n setPrefs(prev => ({ ...prev, zoom: next }));\n };\n // `input` (React onChange) previews and moves the label; the native `change` event commits. Range inputs fire\n // `change` on release after a drag and once per keyboard step, so keyboard steps are debounced.\n const draftStaveScale = (value: number) => {\n const next = clampStaveScale(value, staveScaleMinRef.current);\n setZoomDraft(next);\n previewStaveScale(next);\n };\n staveScaleChangeRef.current = input => {\n window.clearTimeout(zoomCommitRef.current);\n const value = Number(input.value);\n if (sliderPointerRef.current) { sliderPointerRef.current = false; commitStaveScale(value); }\n else zoomCommitRef.current = window.setTimeout(() => commitStaveScale(value), STAVE_SCALE_COMMIT_MS);\n };\n // Fallback for engines that end a drag without `change`: commit on release if the value moved.\n const releaseStaveScale = (input: HTMLInputElement) => {\n if (!sliderPointerRef.current) return;\n sliderPointerRef.current = false;\n commitStaveScale(Number(input.value));\n };\n const onStaveScaleChange = useCallback((event: Event) => staveScaleChangeRef.current(event.currentTarget as HTMLInputElement), []);\n // The slider remounts when it moves in or out of the More panel, so (re)attach the native listener by ref.\n const staveScaleInput = useCallback((input: HTMLInputElement | null) => {\n staveScaleInputRef.current?.removeEventListener('change', onStaveScaleChange);\n staveScaleInputRef.current = input;\n input?.addEventListener('change', onStaveScaleChange);\n }, [onStaveScaleChange]);\n useEffect(() => () => window.clearTimeout(zoomCommitRef.current), []);\n useEffect(() => {\n if (!moreOpen) return;\n const outside = (event: PointerEvent) => { if (!moreRef.current?.contains(event.target as Node)) setMoreOpen(false); };\n const escape = (event: KeyboardEvent) => { if (event.key === 'Escape' && rootRef.current?.contains(event.target as Node)) { setMoreOpen(false); moreRef.current?.querySelector<HTMLButtonElement>('.header-more-toggle')?.focus(); } };\n document.addEventListener('pointerdown', outside);\n document.addEventListener('keydown', escape);\n return () => { document.removeEventListener('pointerdown', outside); document.removeEventListener('keydown', escape); };\n }, [moreOpen]);\n // Sizes come from the root, not the viewport: short/tiny/wide replace the old max-height/orientation media queries,\n // and a root wider than the header breakpoint closes the More panel.\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n const observer = new ResizeObserver(() => {\n const width = root.clientWidth, height = root.clientHeight, natural = root.dataset.psHeight === 'natural';\n flag(root, 'psShort', !natural && height <= 500);\n flag(root, 'psTiny', !natural && height <= 360);\n flag(root, 'psWide', width >= height);\n if (width > MOBILE_HEADER_BREAKPOINT) setMoreOpen(false);\n });\n observer.observe(root);\n return () => observer.disconnect();\n }, []);\n useEffect(() => { if (autoFocus) rootRef.current?.focus({ preventScroll: true }); }, []);\n // Keys are handled on the root, so focus has to stay inside it: an overlay takes focus when it opens, and when one\n // closes with focus lost to <body> (its close button unmounted) focus returns to the overlay still open, or the root.\n const focusOnMount = useCallback((element: HTMLElement | null) => { element?.focus({ preventScroll: true }); }, []);\n const overlaysRef = useRef('');\n useEffect(() => {\n const overlays = `${mixer}|${pickerPartId ?? ''}`, was = overlaysRef.current;\n overlaysRef.current = overlays;\n if (!was || was === overlays) return;\n const active = document.activeElement;\n if (active && active !== document.body && active.isConnected) return;\n rootRef.current?.querySelector<HTMLElement>('.instrument-picker-panel, .mixer-panel')?.focus({ preventScroll: true }) ?? rootRef.current?.focus({ preventScroll: true });\n }, [mixer, pickerPartId]);\n useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n // Re-engrave on the border-box width: the client width also moves when the viewport's own scrollbar comes or goes,\n // which a re-engrave can cause (content a few px taller or shorter), so following it could loop.\n let width = viewport.offsetWidth;\n let height = viewport.clientHeight;\n const observer = new ResizeObserver(() => {\n // A height change keeps the layout but changes how many systems make a page.\n if (Math.abs(viewport.clientHeight - height) >= 1) { height = viewport.clientHeight; refreshPagesRef.current(); }\n if (Math.abs(viewport.offsetWidth - width) < 1) return;\n width = viewport.offsetWidth;\n setResizeTick(value => value + 1);\n });\n observer.observe(viewport);\n return () => observer.disconnect();\n }, []);\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || !ready) return;\n let disposed = false;\n const generation = ++renderRunRef.current;\n let timer = 0;\n let frame = 0;\n // A zoom commit keeps the current score on screen until the new layout replaces it in place.\n const quiet = quietRenderRef.current;\n quietRenderRef.current = false;\n const anchor = quiet ? zoomAnchorRef.current : null;\n zoomAnchorRef.current = null;\n if (!quiet) setPainting(true);\n const draw = async () => {\n try {\n if (disposed) return;\n setScoreWidth(previous => previous === canvas.clientWidth ? previous : canvas.clientWidth);\n // Every multi-stave score gets a focus button per stave; a hide button joins it from five staves.\n const buttons = (score.parts.length > 1 ? 1 : 0) + (score.parts.length > 4 ? 1 : 0);\n const maxGutter = maxControlGutter(canvas.clientWidth);\n // Without part controls (they follow the mixer) the score takes the full width.\n const metricsFor = (stavePx: number, staffPitchPx: number) => {\n const metrics = partControlMetrics(stavePx, { staffPitchPx, maxGutter, buttons });\n return chrome.partControls ? metrics : { ...metrics, gutter: 0 };\n };\n const metaHeight = canvas.closest('.score-content')?.querySelector('.score-meta')?.getBoundingClientRect().height || 0;\n // A natural-height root sizes to its score, so there is no viewport height to fit against.\n const availableHeight = natural ? 4000 : Math.max(120, (viewportRef.current?.clientHeight || 600) - metaHeight - 70);\n // Without a user zoom the default ('fit': four bars in Vertical) is re-resolved for the viewport, so rotation re-fits.\n const requested = prefs.zoom ?? 'fit';\n const result = await renderScore(canvas, displayScore, prefs.mode, prefs.names, prefs.counts, prefs.subdivisions, prefs.barsPerLine, prefs.chordSymbols, prefs.inferChordSymbols, availableHeight, requested, 0, { gutterFor: (stavePx, staffPitchPx) => metricsFor(stavePx, staffPitchPx).gutter, fitCap: ENDLESS_STAVE_SCALE[deviceClass()], fitFloor: minimumDefaultStaveScale(deviceClass()), font: prefs.notationFont, textFont: prefs.annotationFont, transpose: prefs.semitones, flip: prefs.keyFlip, scorePitch, hiddenPartIds: hiddenIds, generation, focusMeasure: anchor?.index, channel: channelRef.current });\n if (disposed || generation !== renderRunRef.current) { result.dispose(); return; }\n renderRef.current = result;\n // Systems drawn later (scrolling, playback) change block sizes: re-page, and let the playhead find new notes.\n result.onChange(() => {\n refreshPagesRef.current();\n canvas.closest<HTMLElement>('.score-content')?.style.setProperty('--landscape-content-width', `${canvas.scrollWidth + 88}px`);\n setLayoutTick(value => value + 1);\n });\n renderedZoomRef.current = result.zoom;\n const metrics = metricsFor(result.stavePx, result.staffPitchPx);\n // Commit the controls with the new SVG so no frame shows them against the other layout.\n flushSync(() => {\n setStaffCenters(Object.fromEntries(result.visiblePartIds.map((id, index) => [id, result.staffCenters[index]])));\n setControlMetrics(metrics);\n setRenderedZoom(result.zoom);\n });\n const content = canvas.closest<HTMLElement>('.score-content');\n // Staff controls size from the rendered stave, so their ratio to it holds at every zoom and fit.\n content?.style.setProperty('--stave-px', `${result.stavePx.toFixed(2)}px`);\n content?.style.setProperty('--stave-scale', (result.stavePx / 72).toFixed(4));\n content?.style.setProperty('--landscape-staff-center', `${result.visiblePartIds.length > 4 ? result.systemHeight / 2 : result.staffCenters[0] ?? 74}px`);\n content?.style.setProperty('--landscape-content-width', `${canvas.scrollWidth + 88}px`);\n const stage = canvas.closest<HTMLElement>('.score-stage');\n stage?.style.setProperty('--control-gutter', `${result.gutter}px`);\n clearStaveScalePreview();\n refreshPages();\n if (anchor) restoreZoomAnchor(anchor, result, prefs.mode);\n restartRedrawsRef.current = 0;\n supersededRedrawsRef.current = 0;\n setError('');\n if (scoreRevision > 0 && readyRevisionRef.current !== scoreRevision) {\n readyRevisionRef.current = scoreRevision;\n callbacks.current.onReady?.({ title: score.title, composer: score.composer || undefined, parts: score.parts.map(part => ({ id: part.id, name: part.name })), measures: score.parts[0]?.measures.length ?? 0 });\n }\n if (largeNoticeArmedRef.current) { largeNoticeArmedRef.current = false; setLargeNotice(''); }\n } catch (e) {\n // The renderer restarted under this draw (another reader ran out of memory): draw again, a bounded number of times.\n if (!disposed && isRestarted(e) && restartRedrawsRef.current < RESTART_REDRAWS) { restartRedrawsRef.current++; setResizeTick(value => value + 1); return; }\n // Superseded but still the latest draw: nothing else will draw this score, so try again once the channel is free.\n if (!disposed && isSuperseded(e) && generation === renderRunRef.current && supersededRedrawsRef.current < SUPERSEDED_REDRAWS) {\n supersededRedrawsRef.current++;\n timer = window.setTimeout(() => { if (!disposed) setResizeTick(value => value + 1); }, SUPERSEDED_REDRAW_MS);\n }\n if (!disposed && !isSuperseded(e)) {\n if (largeNoticeArmedRef.current) { largeNoticeArmedRef.current = false; setLargeNotice(''); }\n showError(e, 'Could not draw this score.', 'draw');\n }\n }\n finally {\n if (!disposed) frame = requestAnimationFrame(() => {\n hasPaintedRef.current = true;\n setPainted(true);\n setPainting(false);\n });\n }\n };\n setLoadingFont(false);\n const delay = !quiet && hasPaintedRef.current && !window.matchMedia('(prefers-reduced-motion: reduce)').matches ? 260 : 0;\n timer = window.setTimeout(() => void draw(), delay);\n return () => { disposed = true; window.clearTimeout(timer); cancelAnimationFrame(frame); };\n }, [ready, resizeTick, scoreRevision, chrome.partControls, hiddenIds, prefs.mode, prefs.notationFont, prefs.annotationFont, prefs.names, prefs.chordSymbols, prefs.inferChordSymbols, prefs.counts, prefs.subdivisions, prefs.barsPerLine, prefs.zoom, prefs.semitones, prefs.keyFlip, scorePitch]);\n\n /** Each rendered system's top and bottom in the viewport's scroll coordinates (score title included). */\n const systemSpans = (): SystemSpan[] => {\n const viewport = viewportRef.current, canvas = canvasRef.current, content = contentRef.current;\n if (!viewport || !canvas || !content) return [];\n const blocks = [...canvas.querySelectorAll<HTMLElement>(':scope > .score-system')];\n // Rects are exact but follow the paint-reveal and zoom-preview transforms; offsets ignore them (whole pixels).\n if (getComputedStyle(content).transform === 'none') {\n const origin = viewport.getBoundingClientRect().top + viewport.clientTop - viewport.scrollTop;\n return blocks.map(block => { const rect = block.getBoundingClientRect(); return { top: rect.top - origin, bottom: rect.bottom - origin }; });\n }\n // Blocks share an offset parent: its offset is summed once (a long score has thousands of blocks).\n const shared = blocks[0]?.offsetParent as HTMLElement | null | undefined;\n let base = 0;\n for (let element = shared ?? null; element && element !== viewport; element = element.offsetParent as HTMLElement | null) base += element.offsetTop;\n return blocks.map(block => {\n let top = 0;\n if (block.offsetParent === shared) top = base + block.offsetTop;\n else for (let element: HTMLElement | null = block; element && element !== viewport; element = element.offsetParent as HTMLElement | null) top += element.offsetTop;\n return { top, bottom: top + block.offsetHeight };\n });\n };\n /** Recompute the Vertical pages from the rendered systems, and pad the score so the last page start is reachable. */\n const refreshPages = () => {\n const viewport = viewportRef.current, content = contentRef.current;\n if (!viewport || !content) return pagesRef.current;\n const spans = modeRef.current === 'portrait' ? systemSpans() : [];\n // The pad above a page stays inside the previous system's blank bottom margin (20 Verovio units).\n const pad = Math.min(PAGE_PAD_PX, 16 * (renderRef.current?.scale ?? 1));\n // A natural-height root shows its whole score: no pages, and no tail (which would grow the root it is measured by).\n const pages = spans.length && !natural ? systemPages(spans, viewport.clientHeight, overlapRef.current, pad) : [];\n const lastStart = pages.at(-1)?.start ?? 0;\n const tail = lastStart > 0 ? Math.max(0, Math.ceil(lastStart + viewport.clientHeight - (viewport.scrollHeight - pageTailRef.current))) : 0;\n if (tail !== pageTailRef.current) { pageTailRef.current = tail; content.style.setProperty('--page-tail', `${tail}px`); }\n return pagesRef.current = { pages, spans };\n };\n const refreshPagesRef = useRef(refreshPages);\n refreshPagesRef.current = refreshPages;\n const scrollViewport = (to: { top?: number; left?: number }) => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n const top = Math.max(0, Math.min(viewport.scrollHeight - viewport.clientHeight, to.top ?? viewport.scrollTop));\n const left = Math.max(0, Math.min(viewport.scrollWidth - viewport.clientWidth, to.left ?? viewport.scrollLeft));\n // Already there: nothing will be in flight (and no scroll event will mark it landed).\n scrollTargetRef.current = Math.abs(viewport.scrollTop - top) <= 1 && Math.abs(viewport.scrollLeft - left) <= 1 ? null : { top, left, at: performance.now() };\n viewport.scrollTo({ top, left, behavior: scrollBehavior() });\n };\n /** The destination of a programmatic scroll that has not landed yet. */\n const pendingScroll = () => {\n const viewport = viewportRef.current, target = scrollTargetRef.current;\n if (!viewport || !target || performance.now() - target.at > SCROLL_SETTLE_MS) return null;\n return Math.abs(viewport.scrollTop - target.top) > 1 || Math.abs(viewport.scrollLeft - target.left) > 1 ? target : null;\n };\n // Endless turns by a viewport less the overhang bars; Vertical turns to the next or previous system page.\n const turn = useCallback((direction: number) => {\n const el = viewportRef.current;\n if (!el) return;\n userScrollAtRef.current = performance.now();\n const pending = pendingScroll();\n if (prefs.mode === 'landscape') {\n const step = Math.max(100, el.clientWidth - prefs.overlap * (renderRef.current?.barWidth || 230));\n scrollViewport({ left: (pending?.left ?? el.scrollLeft) + direction * step });\n } else {\n const target = turnTarget(refreshPages().pages, pending?.top ?? el.scrollTop, direction);\n if (target !== null) scrollViewport({ top: target });\n }\n }, [prefs.mode, prefs.overlap]);\n useEffect(() => { refreshPages(); }, [prefs.mode, prefs.overlap]);\n // Wheel and scrollbar drags are the reader's own scrolling: playback follow waits for them.\n useEffect(() => {\n const viewport = viewportRef.current;\n if (!viewport) return;\n const manual = () => { userScrollAtRef.current = performance.now(); scrollTargetRef.current = null; };\n const scrollbar = (event: PointerEvent) => { if (event.target === viewport) manual(); };\n // A programmatic scroll that has landed is no longer in flight: a touch or other scroll away from it within\n // SCROLL_SETTLE_MS must not make the next turn or follow build on that stale destination.\n const landed = () => {\n const target = scrollTargetRef.current;\n if (target && Math.abs(viewport.scrollTop - target.top) <= 1 && Math.abs(viewport.scrollLeft - target.left) <= 1) scrollTargetRef.current = null;\n };\n viewport.addEventListener('wheel', manual, { passive: true });\n viewport.addEventListener('pointerdown', scrollbar);\n viewport.addEventListener('scroll', landed, { passive: true });\n return () => { viewport.removeEventListener('wheel', manual); viewport.removeEventListener('pointerdown', scrollbar); viewport.removeEventListener('scroll', landed); };\n }, []);\n // Keys act on the focused reader only: the handler sits on the root, so another instance (or the host page) never turns this one.\n const onRootKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape' && pickerPartId) { setPickerPartId(null); return; }\n if (event.key === 'Escape' && mixer) { setMixer(false); return; }\n if (pickerPartId || mixer || openDialog) return;\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes((event.target as HTMLElement).tagName)) return;\n if (['PageDown', 'ArrowRight', 'ArrowDown', ' '].includes(event.key)) { event.preventDefault(); turn(1); }\n if (['PageUp', 'ArrowLeft', 'ArrowUp'].includes(event.key)) { event.preventDefault(); turn(-1); }\n };\n // Where the playhead is when no engraved note marks it (an empty intro, rest bars, or an unmapped note):\n // the measure and its fraction, quantized to a 32nd of the bar so the effect below re-runs only as the line moves.\n const measureCursor = useMemo(() => {\n if (!playing && position <= 0) return null;\n if (active && renderRef.current?.point(active)?.element) return null;\n const timeline = timelineOf();\n if (!timeline) return null;\n const current = playbackPositionAt(timeline, position, prefs.bpm);\n const length = visibleScore.parts[0]?.measures[current.measureIndex]?.beats || 0;\n const fraction = length > 0 ? Math.max(0, Math.min(1, current.measureBeat / length)) : 0;\n return { measureIndex: current.measureIndex, fraction: Math.floor(fraction * 32) / 32 };\n }, [active, playing, position, timelineOf, visibleScore, layoutTick, prefs.bpm]);\n const measureCursorKey = measureCursor ? `${measureCursor.measureIndex}:${measureCursor.fraction}` : '';\n useEffect(() => {\n const result = renderRef.current;\n const note = active ? result?.point(active) : undefined;\n canvasRef.current?.querySelectorAll('.reader-note.is-playing').forEach(n => n.classList.remove('is-playing'));\n canvasRef.current?.querySelectorAll('.playback-line').forEach(n => n.remove());\n if (!chrome.playhead) return;\n for (const id of activeNotes) {\n const point = result?.point(id);\n if (point && !point.rest) point.element?.classList.add('is-playing');\n }\n // A note marks the playhead; otherwise it moves through the current measure's engraved bounds.\n const measure = !note?.element && measureCursor ? result?.measure(measureCursor.measureIndex) : undefined;\n const anchor = note?.element || measure?.element;\n // The playhead's system may not be drawn yet (large scores draw systems on demand): draw it, and this effect runs\n // again when it lands (layoutTick). Follow still scrolls to its placeholder block meanwhile.\n const pendingSystem = !anchor && measureCursor && result ? result.systemOfMeasure(measureCursor.measureIndex) : -1;\n if (pendingSystem >= 0) void result!.ensureSystem(pendingSystem);\n const block = anchor ? anchor.closest<HTMLElement>('.score-system') : pendingSystem >= 0 ? canvasRef.current?.querySelector<HTMLElement>(`:scope > .score-system[data-system=\"${pendingSystem}\"]`) : null;\n if (!block) return;\n const line = anchor ? document.createElement('div') : null;\n if (line) {\n line.className = 'playback-line';\n line.style.left = `${note?.element ? note.x : measure!.x + measure!.width * measureCursor!.fraction}px`;\n block.appendChild(line);\n }\n // Follow playback in page jumps: nothing moves while the active system is in view, a smooth scroll in flight\n // is left to land, and a reader who just scrolled keeps their view for a moment.\n const viewport = viewportRef.current;\n if (!viewport || !playRef.current || performance.now() - userScrollAtRef.current < FOLLOW_SUSPEND_MS || pendingScroll()) return;\n if (prefs.mode === 'landscape') {\n const view = viewport.getBoundingClientRect();\n const x = (line || block).getBoundingClientRect().left;\n if (x > view.left + view.width * .78 || x < view.left + view.width * .18) scrollViewport({ left: viewport.scrollLeft + x - view.left - view.width * .35 });\n return;\n }\n const { pages, spans } = refreshPages();\n const index = [...canvasRef.current?.querySelectorAll(':scope > .score-system') || []].indexOf(block);\n const span = spans[index], page = pageOfSystem(pages, index);\n if (!span || !page) return;\n const top = viewport.scrollTop, bottom = top + viewport.clientHeight;\n // A tall system is followed while any of it (and so the playback line) is in view; others must be wholly in view.\n const inView = page.tall ? span.top < bottom && span.bottom > top : span.top >= top - 1 && span.bottom <= bottom + 1;\n if (!inView && Math.abs(page.start - top) > 1) scrollViewport({ top: page.start });\n // measureCursor is read through its key, so the effect re-runs when the line moves rather than on every frame.\n }, [active, activeNotes, prefs.mode, painting, measureCursorKey, layoutTick]);\n\n // Returns null when the device can't produce sound (no output device, autoplay blocked, resume() never settling),\n // so playback falls back to a silent wall-clock run instead of hanging on a suspended AudioContext. Also null when the\n // built-in sounds at assetBaseUrl fail to load.\n const ensureAudio = async (timeline: BaseTimeline) => {\n if (!audioRef.current) {\n const sharedAudio = getSharedAudio();\n if (!sharedAudio) return null;\n audioRef.current = { ...sharedAudio, players: new Map(), partKeys: new Map(), trackGains: new Map(), mixScale: 1 };\n }\n const audio = audioRef.current;\n if (!await resumeAudio(audio.context)) return null;\n audio.mixScale = .8 / Math.sqrt(Math.max(1, visibleScore.parts.length));\n for (const part of visibleScore.parts) {\n let gain = audio.trackGains.get(part.id);\n if (!gain) { gain = audio.context.createGain(); gain.connect(audio.master); audio.trackGains.set(part.id, gain); }\n gain.gain.value = (trackVolumes[part.id] ?? 100) / 100 * audio.mixScale;\n }\n const pack = await loadPackInfo(assetBase);\n const page = document.baseURI;\n const plans = new Map(visibleScore.parts.map(part => [part.id, planSound(soundRequest(part), { sources: soundSources, fluidr3: pack.fluidr3, base: assetBase, page })]));\n audio.partKeys = new Map(visibleScore.parts.map(part => [part.id, audioKey(plans.get(part.id)!, part)]));\n // A built-in sound that fails to load (an assetBaseUrl with no sounds package behind it) plays silently, with one\n // console warning, instead of failing playback. A host soundSources entry that fails still reports an error.\n const builtinFailed = (e: unknown) => { warnAssetBase(assetBase, `built-in sounds (${e instanceof Error ? e.message : String(e)})`); return null; };\n for (const key of new Set(audio.partKeys.values())) {\n const matching = visibleScore.parts.filter(part => audio.partKeys.get(part.id) === key);\n const plan = plans.get(matching[0].id)!;\n const notes = playbackMidis(timeline, new Set(matching.map(part => part.id)), prefs.semitones);\n const destination = audio.trackGains.get(matching[0].id)!;\n const builtin = plan.sourceId.startsWith('builtin:');\n let players = audio.players.get(key);\n try {\n if (!players) { players = await loadPlayers(audio.context, plan, destination); audio.players.set(key, players); }\n await Promise.all(players.map(player => player.loadNotes?.(notes)));\n } catch (e) { if (builtin) return builtinFailed(e); throw e; }\n // The drum fallback is always the built-in TimGM6mb kit.\n if (plan.kind === 'note-files' && plan.drums) try { await addDrumFallback(audio.context, players, notes, fallbackSf2Url(assetBase), destination); } catch (e) { return builtinFailed(e); }\n }\n // Players no visible part uses any more (another score, a changed instrument, a hidden part) are released.\n const used = new Set(audio.partKeys.values());\n for (const [key, players] of audio.players) if (!used.has(key)) { players.forEach(player => player.dispose()); audio.players.delete(key); }\n return audio;\n };\n const play = async () => {\n // Nothing to play until a supplied score has loaded: an unloaded, loading or failed snippet never plays the hidden sample.\n if (!chrome.audio || !loaded) return;\n if (playing || loadingAudio) { stop(); return; }\n const run = ++playRunRef.current;\n claimPlayback(playbackOwner);\n try {\n setLoadingAudio(true);\n const timeline = await loadTimeline();\n if (run !== playRunRef.current) return;\n const audio = await ensureAudio(timeline);\n if (run !== playRunRef.current) return;\n setLoadingAudio(false);\n setNotice(audio ? '' : SILENT_PLAYBACK_NOTICE);\n // One clock drives scheduling and the cursor: audio time when sound works, wall time when playing silently.\n const now = audio ? () => audio.context.currentTime : () => performance.now() / 1000;\n const secondsStart = position;\n const started = now() + (audio ? .09 : 0);\n const bpm = prefs.bpm;\n const events = playbackEventsFrom(timeline, secondsStart, bpm, prefs.semitones);\n const duration = playbackDuration(timeline, bpm);\n let nextEvent = 0;\n const schedule = audio && (() => {\n const horizon = audio.context.currentTime + .5;\n while (nextEvent < events.length) {\n const event = events[nextEvent];\n const time = started + event.startSeconds - secondsStart;\n if (time > horizon) break;\n const duration = Math.max(.01, event.soundEndSeconds - event.startSeconds);\n const destination = audio.trackGains.get(event.partId);\n for (const player of audio.players.get(audio.partKeys.get(event.partId) ?? '') || []) scheduledStopsRef.current.push({ stop: player.start({ note: event.midi, time: Math.max(time, audio.context.currentTime), duration, velocity: event.velocity, destination }), end: time + duration });\n nextEvent++;\n }\n scheduledStopsRef.current = scheduledStopsRef.current.filter(item => item.end > audio.context.currentTime);\n });\n schedule?.();\n const interval = schedule ? setInterval(schedule, 50) : undefined;\n const tick = () => {\n const seconds = secondsStart + Math.max(0, now() - started);\n if (seconds >= duration) { stop(true); return; }\n const current = playbackPositionAt(timeline, seconds, bpm);\n setActive(current.noteId);\n setActiveNotes(previous => previous.join('|') === current.activeNoteIds.join('|') ? previous : current.activeNoteIds);\n setPosition(seconds);\n if (playRef.current) playRef.current.frame = requestAnimationFrame(tick);\n };\n playRef.current = { start: started, beat: secondsStart, frame: requestAnimationFrame(tick), interval };\n setPlaying(true);\n } catch (e) { if (run === playRunRef.current) { setLoadingAudio(false); releasePlayback(playbackOwner); setError(e instanceof Error ? e.message : 'Audio could not start.'); } }\n };\n // Host callbacks: onError for each shown error, onPlay/onStop on the playing edges (stop-others included).\n useEffect(() => { if (error) callbacks.current.onError?.(new Error(error)); }, [error]);\n const wasPlayingRef = useRef(false);\n useEffect(() => {\n if (playing && !wasPlayingRef.current) callbacks.current.onPlay?.();\n if (!playing && wasPlayingRef.current) callbacks.current.onStop?.();\n wasPlayingRef.current = playing;\n }, [playing]);\n const busyRef = useRef(false);\n busyRef.current = playing || loadingAudio;\n const latestPlayRef = useRef(play);\n latestPlayRef.current = play;\n const changePitchRef = useRef(changePitch);\n changePitchRef.current = changePitch;\n useImperativeHandle(ref, () => ({\n play: async () => { if (chrome.audio && !busyRef.current) await latestPlayRef.current(); },\n stop: () => stopRef.current(true),\n transpose: semitones => changePitchRef.current({ semitones: clampSemitones(Math.round(Number(semitones) || 0)) }),\n }), [chrome.audio]);\n // Unmount: release only this reader's players and track gains; the shared AudioContext and Verovio worker stay for other readers.\n useEffect(() => () => { importRunRef.current++; playRunRef.current++; renderRef.current?.dispose(); if (playRef.current) { cancelAnimationFrame(playRef.current.frame); clearInterval(playRef.current.interval); } scheduledStopsRef.current.splice(0).forEach(item => item.stop()); audioRef.current?.players.forEach(players => players.forEach(p => p.dispose())); audioRef.current?.trackGains.forEach(gain => gain.disconnect()); audioRef.current = null; releasePlayback(playbackOwner); }, []);\n const openInstrumentPicker = (part: Part) => {\n const currentSound = playbackSound(part);\n const selected = GM_SOUNDS.find(sound => (sound.soundfont || 'drum-kit') === currentSound);\n const family = selected?.family || 'Keyboard';\n setPickerFamily(family);\n setPickerPage(Math.max(0, Math.floor(GM_SOUNDS.filter(sound => sound.family === family).findIndex(sound => sound === selected) / 16)));\n setPickerPartId(part.id);\n };\n const changeInstrument = (partId: string, sound: GmSound) => {\n stop(true); setScore(prev => ({ ...prev, parts: prev.parts.map(p => p.id === partId ? { ...p, instrument: sound.iconId, gmProgram: sound.program || undefined, gmSoundfont: sound.soundfont || undefined } : p) }));\n setPickerPartId(null);\n };\n const pickerPart = score.parts.find(part => part.id === pickerPartId);\n const familySounds = GM_SOUNDS.filter(sound => sound.family === pickerFamily);\n const pickerPages = Math.ceil(familySounds.length / 16);\n const pickerSounds = familySounds.slice(pickerPage * 16, (pickerPage + 1) * 16);\n const hasScoreText = Boolean(score.title || score.subtitle || score.composer || score.credits?.length);\n // Auto bars follow the layout width in Verovio units: (width - gutter) / stave scale.\n const barsLimit = portraitBarLimit(Math.max(180, (scoreWidth || 800) - controlMetrics.gutter) / renderedZoom, visibleScore);\n // Always rendered (disabled in Endless, same footprint) so a saved mode applied after hydration can't add/remove it and shift the header.\n const barsDisabled = prefs.mode !== 'portrait';\n const barsSetting = <label className={`header-bars-setting ${barsDisabled ? 'is-disabled' : ''}`} title={barsDisabled ? 'Bars per line applies to Vertical view' : undefined}><span>Bars</span><select aria-label=\"Bars per line\" title={barsDisabled ? 'Bars per line applies to Vertical view' : `Auto fits up to ${barsLimit} bars`} disabled={barsDisabled} aria-disabled={barsDisabled} value={prefs.barsPerLine} onChange={event => update({ barsPerLine: event.target.value === 'auto' ? 'auto' : Number(event.target.value) })}><option value=\"auto\">Auto</option>{Array.from({ length: BARS_PER_LINE_MAX }, (_, index) => index + 1).map(count => <option value={count} key={count}>{count}</option>)}</select></label>;\n\n const oomButton = oomRetry && oomRetry.message === error ? <button className=\"oom-retry-button\" onClick={retryOutOfMemory}>Try again with smaller sections</button> : null;\n const staveScale = zoomDraft ?? prefs.zoom ?? renderedZoom;\n const staveScaleMin = Math.min(STAVE_SCALE_MIN, renderedZoom);\n staveScaleMinRef.current = staveScaleMin;\n const staveScalePercent = Math.round(staveScale * 100);\n // Header and drawer readouts share state; only the visible one (drawer open or not) is a live region, so changes are announced once.\n // Key flip: aria-disabled (not disabled) so the button stays focusable and its label says why there is nothing to flip.\n const flipTo = readout.flipTo;\n const flipLabel = flipTo ? `Spell in ${spokenKey(flipTo)}` : 'No enharmonic key to flip to';\n const flipText = flipTo ? `${keyName(readout.key)} ↔ ${keyName(flipTo)}` : keyName(readout.key);\n const flipKey = () => { if (flipTo) changePitch({ keyFlip: !prefs.keyFlip }); };\n const transposeTitle = `Transposition ${prefs.semitones > 0 ? '+' : ''}${prefs.semitones} semitone${Math.abs(prefs.semitones) === 1 ? '' : 's'}, key ${spokenKey(readout.key)}`;\n const headerElements: Record<HeaderControlId, React.ReactNode> = {\n stop: <button className=\"icon-button stop-button\" aria-label=\"Stop playback\" title=\"Stop playback\" onClick={() => { stop(true); viewportRef.current?.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); }}><Square size={17} fill=\"currentColor\"/></button>,\n play: <button className={`play-button ${loadingAudio ? 'is-loading' : ''}`} aria-label={playing || loadingAudio ? 'Pause playback' : 'Play score'} onClick={play}>{playing || loadingAudio ? <Pause size={17} fill=\"currentColor\"/> : <Play size={17} fill=\"currentColor\"/>}<span className=\"play-button-label\">{loadingAudio ? 'Loading' : playing ? 'Pause' : 'Play'}</span></button>,\n openFile: <button className=\"header-open-file\" aria-label=\"Open score file\" title=\"Open score file\" aria-haspopup=\"dialog\" aria-expanded={openDialog} onClick={() => { setDrawer(false); setMoreOpen(false); setOpenDialog(true); }}><FolderOpen size={17}/><span className=\"header-open-file-label\">Open</span></button>,\n bpm: <label className=\"bpm-control\"><span>BPM</span><input type=\"number\" min={MIN_BPM} max={MAX_BPM} value={prefs.bpm} onChange={e => { stop(true); update({ bpm: clampBpm(Number(e.target.value) || 96) }); }}/></label>,\n mode: <div className=\"mode-toggle\" role=\"group\" aria-label=\"Reading mode\">\n <button aria-label=\"Vertical view\" title=\"Vertical view\" className={`mode-toggle-vertical ${prefs.mode === 'portrait' ? 'is-selected' : ''}`} onClick={() => update({ mode: 'portrait' })}><span className=\"mode-toggle-label-full\">Vertical</span><span className=\"mode-toggle-label-short\" aria-hidden=\"true\">V</span></button>\n <button aria-label=\"Endless view\" title=\"Endless view\" className={`mode-toggle-endless ${prefs.mode === 'landscape' ? 'is-selected' : ''}`} onClick={() => update({ mode: 'landscape' })}><span className=\"mode-toggle-label-full\">Endless</span><span className=\"mode-toggle-label-short\" aria-hidden=\"true\">E</span></button>\n </div>,\n transpose: <div className=\"header-transpose\" role=\"group\" aria-label=\"Transpose\">\n <span className=\"header-transpose-label\" aria-hidden=\"true\">Transpose</span>\n <span className=\"header-transpose-controls\">\n <button className=\"header-transpose-down\" aria-label=\"Transpose down a semitone\" title=\"Transpose down a semitone\" disabled={prefs.semitones <= -12} onClick={() => transposeBy(-1)}><Minus size={15}/></button>\n <output className=\"header-transpose-readout\" aria-live={drawer ? 'off' : 'polite'} title={transposeTitle}>{readout.text}</output>\n <button className=\"header-transpose-up\" aria-label=\"Transpose up a semitone\" title=\"Transpose up a semitone\" disabled={prefs.semitones >= 12} onClick={() => transposeBy(1)}><Plus size={15}/></button>\n </span>\n </div>,\n keyFlip: <div className=\"header-key-flip\">\n <span className=\"header-key-flip-caption\" aria-hidden=\"true\">Key spelling</span>\n <button className={`header-key-flip-button ${flipTo ? '' : 'is-disabled'}`} aria-label={flipLabel} title={flipLabel} aria-disabled={!flipTo} onClick={flipKey}><span className=\"header-key-flip-icon\" aria-hidden=\"true\">⇄</span><span className=\"header-key-flip-label\">{flipText}</span></button>\n </div>,\n bars: barsSetting,\n staveScale: <label className=\"header-stave-scale\" title=\"Stave scale\">\n <span className=\"header-stave-scale-label\">Scale</span>\n <input className=\"header-stave-scale-input\" type=\"range\" min={staveScaleMin} max={STAVE_SCALE_MAX} step={STAVE_SCALE_STEP} value={staveScale} aria-label=\"Stave scale\" aria-valuetext={`${staveScalePercent}%`} onChange={event => draftStaveScale(Number(event.target.value))}\n ref={staveScaleInput} onPointerDown={() => { sliderPointerRef.current = true; window.clearTimeout(zoomCommitRef.current); }}\n onPointerUp={event => releaseStaveScale(event.currentTarget)} onPointerCancel={event => releaseStaveScale(event.currentTarget)}/>\n <output className=\"header-stave-scale-value\">{staveScalePercent}%</output>\n </label>,\n mixer: <button className=\"icon-button mixer-trigger\" aria-label=\"Track mixer\" title=\"Track mixer\" aria-haspopup=\"dialog\" aria-expanded={mixer} onClick={() => { setDrawer(false); setMoreOpen(false); setMixer(true); }}><SlidersHorizontal size={18}/><span className=\"mixer-trigger-label\">Track mixer</span></button>,\n };\n const renderControls = (tier: 'primary' | 'secondary') => HEADER_CONTROLS.filter(control => control.tier === tier && chrome[HEADER_CONTROL_GROUP[control.id]] && headerElements[control.id]).map(control => <div key={control.id} className={`header-control header-control-${control.id}`} data-header-control={control.id}>{headerElements[control.id]}</div>);\n const primaryControls = renderControls('primary');\n const secondaryControls = renderControls('secondary');\n\n const heightMode = height === 'fill' ? 'fill' : height ? 'fixed' : natural ? 'natural' : 'auto';\n const compactLabel = playing || loadingAudio ? 'Stop playback' : 'Play score';\n const compactPlay = chrome.compactPlay && loaded ? <button type=\"button\" className={`ps-compact-play icon-button ${loadingAudio ? 'is-loading' : ''}`} aria-label={compactLabel} title={compactLabel} onClick={() => { if (playing || loadingAudio) stop(true); else void play(); }}>{playing || loadingAudio ? <Square size={15} fill=\"currentColor\"/> : <Play size={15} fill=\"currentColor\"/>}</button> : null;\n return <div ref={rootRef} className={`pepperscore ${className ?? ''}`.trim()} data-ps-height={heightMode} style={heightMode === 'fixed' ? { height } : undefined}\n tabIndex={0} role=\"region\" aria-label={ariaLabel || (loaded && score.title ? `Score: ${score.title}` : 'Score reader')} onKeyDown={onRootKeyDown}>\n <main className={`app-shell ${chrome.drawer ? '' : 'no-drawer'}`}>\n {chrome.header && <header className=\"topbar\" aria-label=\"Playback transport\">\n {chrome.openFile && <input ref={fileRef} type=\"file\" accept={SCORE_FILE_ACCEPT} hidden onChange={e => { readFile(e.target.files?.[0]); e.target.value = ''; }}/>}\n <div className=\"transport\">\n {primaryControls}\n {/* Secondary controls render once. CSS lays them out inline above MOBILE_HEADER_BREAKPOINT and as the\n More dropdown (toggle shown, panel display:none until data-open) at or below it, so SSR paints the right arrangement. */}\n {secondaryControls.length > 0 && <div className=\"header-more\" ref={moreRef} data-open={moreOpen ? 'true' : 'false'}>\n <button className={`icon-button header-more-toggle ${moreOpen ? 'is-open' : ''}`} aria-label=\"More controls\" title=\"More controls\" aria-expanded={moreOpen} aria-controls={panelId} onClick={() => setMoreOpen(open => !open)}><Ellipsis size={19}/></button>\n <div id={panelId} className=\"header-secondary-panel\" role=\"group\" aria-label=\"Secondary controls\">{secondaryControls}</div>\n </div>}\n </div>\n {compactPlay}\n </header>}\n {/* Shown once a score has loaded: an empty or failed snippet has nothing to play. With a header (minimal + controls)\n it sits in the header's right end, above the sticky header rather than under it. */}\n {!chrome.header && compactPlay}\n\n {chrome.mixer && mixer && <div className=\"mixer-backdrop\" onMouseDown={event => { if (event.target === event.currentTarget) setMixer(false); }}>\n <section ref={focusOnMount} tabIndex={-1} className=\"mixer-panel\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Track mixer\">\n <div className=\"mixer-heading\"><div><SlidersHorizontal size={18}/><h2>Track mixer</h2></div><button className=\"icon-button\" aria-label=\"Close track mixer\" onClick={() => setMixer(false)}><X size={19}/></button></div>\n <p>Choose each track’s sound and volume.</p>\n <div className=\"mixer-tracks\">{score.parts.map(part => <div className=\"mixer-track\" key={part.id}><img src={instrumentDetails(part.instrument).icon} alt=\"\"/><span className=\"mixer-track-name\">{part.name}{hiddenSet.has(part.id) && <small>Muted · hidden</small>}</span><button className=\"icon-button mixer-visibility-button\" aria-label={`${hiddenSet.has(part.id) ? 'Show' : 'Hide'} ${part.name}`} title={`${hiddenSet.has(part.id) ? 'Show' : 'Hide'} ${part.name}`} aria-pressed={!hiddenSet.has(part.id)} onClick={() => togglePart(part.id)} disabled={!hiddenSet.has(part.id) && visibleScore.parts.length <= 1}>{hiddenSet.has(part.id) ? <EyeOff size={17}/> : <Eye size={17}/>}</button><button className=\"mixer-voice-button\" aria-label={`Voice for ${part.name}`} onClick={() => openInstrumentPicker(part)}>{part.gmSoundfont ? gmSoundfontLabel(part.gmSoundfont) : instrumentDetails(part.instrument).label}<ChevronDown size={14}/></button><label className=\"mixer-volume\"><span>Volume</span><input type=\"range\" min=\"0\" max=\"100\" value={trackVolumes[part.id] ?? 100} aria-label={`Volume for ${part.name}`} onChange={event => setTrackVolumes(previous => ({ ...previous, [part.id]: Number(event.target.value) }))}/><output>{trackVolumes[part.id] ?? 100}%</output></label></div>)}</div>\n </section>\n </div>}\n\n {chrome.openFile && openDialog && <OpenScoreDialog onClose={() => setOpenDialog(false)} onOpenFile={file => void readFile(file)} onOpenAbc={text => void readAbc(text)} onBrowse={() => fileRef.current?.click()}/>}\n\n {chrome.partControls && pickerPart && <div className=\"instrument-picker-backdrop\" onMouseDown={event => { if (event.target === event.currentTarget) setPickerPartId(null); }}>\n <section ref={focusOnMount} tabIndex={-1} className=\"instrument-picker-panel\" role=\"dialog\" aria-modal=\"true\" aria-label={`Choose voice for ${pickerPart.name}`}>\n <div className=\"instrument-picker-heading\"><div><h2>{pickerPart.name}</h2><p>Choose a playback sound</p></div><button className=\"icon-button\" aria-label=\"Close voice picker\" onClick={() => setPickerPartId(null)}><X size={19}/></button></div>\n <div className=\"instrument-family-filters\" role=\"group\" aria-label=\"Instrument families\">{GM_FAMILIES.map(family => <button key={family} className={pickerFamily === family ? 'is-selected' : ''} aria-pressed={pickerFamily === family} onClick={() => { setPickerFamily(family); setPickerPage(0); }}>{family}</button>)}</div>\n <div className=\"instrument-picker-grid\">{pickerSounds.map(sound => <button key={sound.program ?? 'drum-kit'} className={playbackSound(pickerPart) === (sound.soundfont || 'drum-kit') ? 'is-selected' : ''} aria-pressed={playbackSound(pickerPart) === (sound.soundfont || 'drum-kit')} onClick={() => changeInstrument(pickerPart.id, sound)}><img src={sound.icon} alt=\"\"/><span>{sound.label}</span></button>)}</div>\n <div className=\"instrument-picker-pages\"><button aria-label=\"Previous instruments\" disabled={pickerPage === 0} onClick={() => setPickerPage(page => page - 1)}><ChevronLeft size={18}/></button><span>Page {pickerPage + 1} of {pickerPages}</span><button aria-label=\"Next instruments\" disabled={pickerPage + 1 >= pickerPages} onClick={() => setPickerPage(page => page + 1)}><ChevronRight size={18}/></button></div>\n </section>\n </div>}\n\n <section className={`reader-area ps-${prefs.mode} ${score.parts.length > 4 ? 'has-many-staves' : ''} ${chrome.zoom ? '' : 'no-page-controls'}`}>\n <div className=\"edge-fade edge-start\"/><div className=\"edge-fade edge-end\"/>\n <div className=\"score-viewport\" ref={viewportRef} onTouchStart={e => {\n if (chrome.zoom && score.parts.length > 4 && e.touches.length === 2) {\n const distance = Math.hypot(e.touches[0].clientX - e.touches[1].clientX, e.touches[0].clientY - e.touches[1].clientY);\n pinchRef.current = { distance, zoom: renderedZoomRef.current, nextZoom: renderedZoomRef.current };\n swipeRef.current = null;\n } else if (!pinchRef.current && e.touches.length === 1) swipeRef.current = { x: e.touches[0].clientX, y: e.touches[0].clientY };\n }} onTouchMove={e => {\n if (!pinchRef.current || e.touches.length !== 2) return;\n const distance = Math.hypot(e.touches[0].clientX - e.touches[1].clientX, e.touches[0].clientY - e.touches[1].clientY);\n pinchRef.current.nextZoom = clampStaveScale(pinchRef.current.zoom * distance / Math.max(1, pinchRef.current.distance), staveScaleMinRef.current);\n setZoomDraft(pinchRef.current.nextZoom);\n previewStaveScale(pinchRef.current.nextZoom);\n }} onTouchEnd={e => {\n if (pinchRef.current) {\n const nextZoom = pinchRef.current.nextZoom;\n pinchRef.current = null;\n commitStaveScale(nextZoom);\n swipeRef.current = null;\n return;\n }\n if (!swipeRef.current) return;\n const dx = e.changedTouches[0].clientX - swipeRef.current.x, dy = e.changedTouches[0].clientY - swipeRef.current.y;\n const delta = prefs.mode === 'landscape' ? dx : dy;\n if (Math.abs(delta) > 65) turn(delta < 0 ? 1 : -1);\n swipeRef.current = null;\n }} onTouchCancel={() => { if (pinchRef.current) { setZoomDraft(null); clearStaveScalePreview(); } pinchRef.current = null; swipeRef.current = null; }}>\n {loadingFont && <div className=\"font-load-progress\" role=\"status\" aria-label=\"Loading notation font\"/>}\n {painting && (loaded || ready) && <div className=\"score-loading\" role=\"status\" aria-label={painted ? 'Rendering score' : 'Preparing score'}><span className=\"score-loading-spinner\"/><span>{painted ? 'Rendering score' : 'Preparing score'}</span></div>}\n {loaded && <div ref={contentRef} className={`score-content ${painting || !painted ? 'is-painting' : ''}`} data-stave-scale={painted ? renderedZoom : undefined} style={{ '--landscape-meta-offset': prefs.chordSymbols ? '0px' : '35px', '--annotation-font': textFonts[prefs.annotationFont] || textFonts.Sans, '--score-text-font': textFonts[prefs.annotationFont] || textFonts.Sans, '--music-font': prefs.notationFont } as React.CSSProperties}>\n {(hasScoreText || hiddenIds.length > 0) && <div className=\"score-meta\">\n {score.title && <h1>{score.title}</h1>}\n {score.subtitle && <p className=\"score-subtitle\">{score.subtitle}</p>}\n {score.composer && <p className=\"score-composer\">{score.composer}</p>}\n {score.credits?.map((line, i) => <p className=\"score-credit\" key={`${line}-${i}`}>{line}</p>)}\n {hiddenIds.length > 0 && <div className=\"hidden-staves\" aria-label=\"Hidden staves\">{score.parts.filter(part => hiddenSet.has(part.id)).map(part => <button key={part.id} onClick={() => togglePart(part.id)} title={`Show ${part.name}`} aria-label={`Show ${part.name}`}><img src={instrumentDetails(part.instrument).icon} alt=\"\"/><EyeOff size={15}/><span>{part.name}</span></button>)}</div>}\n </div>}\n <div className=\"score-stage\">\n <div className=\"score-staves\" ref={canvasRef}/>\n {chrome.partControls && <div className=\"part-controls\" style={{ '--part-icon': `${controlMetrics.icon}px`, '--part-font': `${controlMetrics.font}px`, '--part-eye': `${controlMetrics.eye}px`, '--part-control-height': `${controlMetrics.height}px` } as React.CSSProperties}>{visibleScore.parts.map((part, index) => <div key={part.id} className=\"part-control\" style={{ top: `${staffCenters[part.id] ?? 86 + index * ((prefs.names || prefs.counts) ? 125 : 100)}px` }} title={`Sound for ${part.name}`}><button className=\"instrument-control\" aria-label={`Instrument for ${part.name}`} aria-haspopup=\"dialog\" onClick={() => openInstrumentPicker(part)}><img className=\"part-icon\" src={instrumentDetails(part.instrument).icon} alt=\"\"/></button><span className=\"part-name\" title={part.name}>{part.name}</span>{score.parts.length > 1 && <button className={`staff-eye staff-focus ${focusedId === part.id ? 'is-focused' : ''}`} aria-label={focusedId === part.id ? 'Show all staves' : `Focus on ${part.name}`} title={focusedId === part.id ? 'Show all staves' : `Focus on ${part.name}`} aria-pressed={focusedId === part.id} onClick={() => focusPart(part.id)}><Focus size={17}/></button>}{score.parts.length > 4 && <button className=\"staff-eye\" aria-label={`Hide ${part.name}`} title={`Hide ${part.name}`} onClick={() => togglePart(part.id)} disabled={visibleScore.parts.length <= 1}><Eye size={17}/></button>}</div>)}</div>}\n </div>\n </div>}\n </div>\n {chrome.zoom && <div className=\"page-controls\"><button aria-label=\"Previous view\" onClick={() => turn(-1)}><ChevronLeft size={18}/></button><span>{prefs.mode === 'portrait' ? 'SCROLL TO READ' : 'SWIPE TO READ'}</span><button aria-label=\"Next view\" onClick={() => turn(1)}><ChevronRight size={18}/></button></div>}\n </section>\n\n {chrome.drawer && <>\n <button className={`drawer-handle ${drawer ? 'is-open' : ''}`} onClick={() => setDrawer(!drawer)} aria-expanded={drawer}><span className=\"handle-grip\"/><span>{drawer ? 'Close options' : 'Options'}</span><ChevronDown size={16}/></button>\n {drawer && <div className=\"drawer-backdrop\" onClick={() => setDrawer(false)}/>}\n <aside className={`bottom-drawer ${drawer ? 'is-open' : ''}`} aria-hidden={!drawer}>\n <div className=\"drawer-top\"><div><div className=\"ps-eyebrow\">MAKE IT YOURS</div><h2>Reading options</h2></div><button className=\"icon-button\" aria-label=\"Close options\" onClick={() => setDrawer(false)}><X size={20}/></button></div>\n <div className=\"drawer-grid\">\n\n <div className=\"drawer-panel\"><h3><Settings2 size={17}/> Reading</h3><div className=\"font-choice\"><span>Notation font</span><div className=\"font-toggle\" role=\"group\" aria-label=\"Notation font\"><button className={prefs.notationFont === 'Bravura' ? 'is-selected' : ''} aria-pressed={prefs.notationFont === 'Bravura'} onClick={() => update({ notationFont: 'Bravura' })}>Bravura</button><button className={prefs.notationFont === 'Petaluma' ? 'is-selected' : ''} aria-pressed={prefs.notationFont === 'Petaluma'} onClick={() => update({ notationFont: 'Petaluma' })}>Petaluma</button></div></div><div className=\"font-choice\"><span>Stave text font</span><div className=\"font-toggle\" role=\"group\" aria-label=\"Stave text font\">{(['Sans', 'Serif', 'Mono'] as const).map(font => <button key={font} className={prefs.annotationFont === font ? 'is-selected' : ''} aria-pressed={prefs.annotationFont === font} onClick={() => update({ annotationFont: font })}>{font}</button>)}</div></div><label className=\"field-label\" htmlFor={overhangId}>Overhang <span>{prefs.overlap === 0 ? 'Off' : `${prefs.overlap} ${prefs.mode === 'portrait' ? (prefs.overlap === 1 ? 'system' : 'systems') : (prefs.overlap === 1 ? 'bar' : 'bars')}`}</span></label><input id={overhangId} className=\"ps-range\" type=\"range\" min=\"0\" max=\"3\" step=\"1\" value={prefs.overlap} onChange={e => update({ overlap: Number(e.target.value) })}/><div className=\"ps-switch-row\"><span>Note names</span><button className={`ps-switch ${prefs.names ? 'is-on' : ''}`} role=\"switch\" aria-label=\"Note names\" aria-checked={prefs.names} onClick={() => update({ names: !prefs.names })}/></div><div className=\"ps-switch-row\"><span>Chord symbols</span><button className={`ps-switch ${prefs.chordSymbols ? 'is-on' : ''}`} role=\"switch\" aria-label=\"Chord symbols\" aria-checked={prefs.chordSymbols} onClick={() => update({ chordSymbols: !prefs.chordSymbols })}/></div><label className=\"ps-switch-row inference-row\"><span>Infer chord symbols</span><input type=\"checkbox\" checked={prefs.inferChordSymbols} onChange={e => update({ inferChordSymbols: e.target.checked })}/></label><div className=\"ps-switch-row\"><span>Beat counts</span><button className={`ps-switch ${prefs.counts ? 'is-on' : ''}`} role=\"switch\" aria-label=\"Beat counts\" aria-checked={prefs.counts} onClick={() => update({ counts: !prefs.counts })}/></div><div className=\"ps-switch-row\"><span>Count subdivisions</span><button className={`ps-switch ${prefs.subdivisions ? 'is-on' : ''}`} role=\"switch\" aria-label=\"Count subdivisions\" aria-checked={prefs.subdivisions} onClick={() => update({ subdivisions: !prefs.subdivisions, counts: true })}/></div>{score.parts.length > 4 && <button className=\"text-action reset-staves\" onClick={resetStaves}><RotateCcw size={15}/> Reset score staves</button>}</div>\n <div className=\"drawer-panel abc-panel\"><h3><FileMusic size={17}/> ABC notation</h3><p>Paste ABC text here, or use the open button in the header for files and folders.</p><textarea value={abcDraft} onChange={e => setAbcDraft(e.target.value)} spellCheck={false} aria-label=\"ABC notation\"/><button className=\"primary-action\" onClick={() => void readAbc(abcDraft)}>View notation <ChevronRight size={17}/></button><button className=\"text-action\" onClick={loadSample}><FileMusic size={16}/> Open sample score</button>{lastFileInfo && <button className=\"text-action forget-last-file\" title={LAST_FILE_PRIVACY} onClick={forgetLast}><Trash2 size={15}/> Forget last opened file</button>}</div>\n <div className=\"drawer-panel pitch-panel\"><h3><Settings2 size={17}/> Pitch</h3><div className=\"pitch-options\"><div><span className=\"pitch-label\">Transpose score</span><div className=\"semitone-control\"><button aria-label=\"Transpose down a semitone\" disabled={prefs.semitones <= -12} onClick={() => transposeBy(-1)}><Minus size={16}/></button><output aria-live={drawer ? 'polite' : 'off'}>{prefs.semitones > 0 ? '+' : ''}{prefs.semitones} semitones</output><button aria-label=\"Transpose up a semitone\" disabled={prefs.semitones >= 12} onClick={() => transposeBy(1)}><Plus size={16}/></button><button className=\"pitch-reset\" aria-label=\"Reset transposition\" title=\"Reset transposition\" disabled={prefs.semitones === 0 && !prefs.keyFlip} onClick={() => changePitch({ semitones: 0, keyFlip: false })}><RotateCcw size={15}/></button></div></div><div className=\"pitch-key\"><span className=\"pitch-label\">Key</span><div className=\"pitch-key-control\"><output className=\"pitch-key-readout\" aria-live={drawer ? 'polite' : 'off'}>{readout.text}</output><button className={`pitch-key-flip ${flipTo ? '' : 'is-disabled'}`} aria-label={flipLabel} title={flipLabel} aria-disabled={!flipTo} onClick={flipKey}><span className=\"pitch-key-flip-icon\" aria-hidden=\"true\">⇄</span><span className=\"pitch-key-flip-label\">{flipText}</span></button></div></div>{!concertBasis && <div><span className=\"pitch-label\">Score view</span><div className=\"font-toggle pitch-view\" role=\"group\" aria-label=\"Score pitch view\"><button className={prefs.scorePitch === 'written' ? 'is-selected' : ''} aria-pressed={prefs.scorePitch === 'written'} onClick={() => changePitch({ scorePitch: 'written' })}>Transposing</button><button className={prefs.scorePitch === 'concert' ? 'is-selected' : ''} aria-pressed={prefs.scorePitch === 'concert'} onClick={() => changePitch({ scorePitch: 'concert' })}>Concert</button></div></div>}</div><p className=\"pitch-hint\">{concertBasis ? 'This score is written at concert pitch, so it is shown at concert pitch. Playback stays at concert pitch.' : hasTransposingParts ? 'Transposing shows written parts; Concert shows sounding pitches. Playback stays at concert pitch.' : 'This score has no instrument transposition data, so both views match.'}</p></div>\n </div>\n {error && <div className=\"ps-error\" role=\"alert\"><span className=\"ps-error-text\">{error}</span>{oomButton}</div>}\n <div className=\"drawer-foot\">SPACE / PAGE DOWN · next view PAGE UP · previous view <span>FluidR3 GM · CC BY 3.0; TimGM drums · GPL-2</span></div>\n </aside>\n </>}\n {!drawer && (notice || largeNotice || reopenOffer) && <div className=\"reader-notices\">\n {largeNotice && <div className=\"large-file-notice\" role=\"status\"><Hourglass className=\"large-file-notice-icon\" size={16}/><span className=\"large-file-notice-text\">{largeNotice}</span><button className=\"large-file-notice-dismiss\" onClick={() => setLargeNotice('')} aria-label=\"Dismiss large score notice\"><X size={16}/></button></div>}\n {chrome.openFile && reopenOffer && <div className=\"reopen-banner\" role=\"status\" aria-label=\"Reopen last file\">\n <History className=\"reopen-banner-icon\" size={16}/>\n <span className=\"reopen-banner-body\"><span className=\"reopen-banner-text\">Reopen <strong className=\"reopen-banner-name\">{reopenOffer.name}</strong>?</span><span className=\"reopen-banner-privacy\" title={LAST_FILE_PRIVACY}>Kept only on this device.</span></span>\n <span className=\"reopen-banner-actions\">\n <button className=\"reopen-banner-reopen\" onClick={() => void reopenLastFile()} aria-label={`Reopen ${reopenOffer.name}`}>Reopen</button>\n <button className=\"reopen-banner-later\" onClick={dismissReopen}>Not now</button>\n <button className=\"reopen-banner-forget\" onClick={forgetLast} aria-label={`Forget ${reopenOffer.name}`} title=\"Delete the copy kept on this device\">Forget</button>\n </span>\n </div>}\n {notice && <div className=\"playback-notice\" role=\"status\"><VolumeX className=\"playback-notice-icon\" size={16}/><span className=\"playback-notice-text\">{notice}</span><button className=\"playback-notice-dismiss\" onClick={() => setNotice('')} aria-label=\"Dismiss playback notice\"><X size={16}/></button></div>}\n </div>}\n {error && !drawer && <div className={`ps-toast ${oomButton ? 'is-out-of-memory' : ''}`} role=\"alert\"><span className=\"ps-toast-text\">{error}</span>{oomButton}<button className=\"ps-toast-dismiss\" onClick={() => setError('')} aria-label=\"Dismiss\"><X size={16}/></button></div>}\n </main>\n </div>;\n}\n","import './styles.css';\nimport PepperScore from './components/PepperScore';\nimport type { PepperScoreProps } from './components/PepperScore';\n\nexport { PepperScore };\nexport default PepperScore;\nexport type { PepperScoreProps, PepperScoreHandle, PepperScoreReadyInfo } from './components/PepperScore';\nexport type { ChromePreset, PepperScoreControls } from './lib/chrome';\nexport type { PepperScoreSettings } from './lib/prefs';\nexport type { SoundSource } from './lib/sounds';\nexport type { SoundPackName } from './lib/assets';\nexport { SOUNDS_VERSION, defaultAssetBaseUrl } from './lib/assets';\n/** @deprecated Use PepperScore. Kept for one release. */\nexport const Reader = PepperScore;\n/** @deprecated Use PepperScoreProps. Kept for one release. */\nexport type ReaderProps = PepperScoreProps;\n"],"mappings":";;;;;;AAAA,IAAAgC,KAAe,4lSCAfC,KAAe,g0TCAfC,IAAe,ijYCAfC,KAAe,2zUCAfC,KAAe,uyOCAfC,KAAe,wvNCAfC,KAAe,o1eCAfC,KAAe,6kOCAfC,KAAe,mhlBCAfC,KAAe,k2KCAfC,KAAe,0kWCAfC,KAAe,kjSCAfC,KAAe,mlHCAfC,KAAe,wqRCAfC,KAAe,s7VCAfC,KAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|